I am using Doctrine, with DoctrineExtensions via StofDoctrineExtensionsBundle to generate slugs automatically using "Doctrine Extensions Sluggable" behavior.
The listener seems to be registred properly. Entity field is also marked as sluggable.
When trying to persist my entity via Symfony form, slug generation does not happen. Database exception is being thrown.
Exception:
An exception occurred while executing 'INSERT INTO event (startDate, endDate, title, slug, description, image, followers, city, place) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)' with params ["2017-06-24 20:00:00", "2017-06-26 12:00:00", "Test event name for slug generation", null, "Test", null, null, "Somewhere", "Somewhere else"]:
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'slug' cannot be null
Versions:
PHP 7.0.15
symfony/symfony v3.2.9
doctrine/doctrine-bundle 1.6.8
doctrine/orm v2.5.6
gedmo/doctrine-extensions v2.4.29
stof/doctrine-extensions-bundle v1.2.2
config.yml
doctrine:
dbal:
driver: pdo_mysql
host: '%database_host%'
port: '%database_port%'
dbname: '%database_name%'
user: '%database_user%'
password: '%database_password%'
charset: UTF8
orm:
auto_generate_proxy_classes: '%kernel.debug%'
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: true
stof_doctrine_extensions:
default_locale: '%locale%' # pl
translation_fallback: true
orm:
default:
sluggable: true
Entity (Event.orm.xml)
<?xml version="1.0" encoding="utf-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd"
xmlns:gedmo="http://Atlantic18.github.io/DoctrineExtensions/schemas/orm/doctrine-extensions-3.0.xsd">
<entity repository-class="AppBundle\Repository\EventRepository" name="AppBundle\Entity\Event">
<id name="id" type="integer" column="id">
<generator strategy="AUTO"/>
</id>
<field name="startDate" type="datetime" column="startDate"/>
<field name="endDate" type="datetime" column="endDate"/>
<field name="title" type="string" column="title" length="255"/>
<field name="slug" type="string" column="slug" length="255" unique="true">
<gedmo:slug unique="true" updatable="true" fields="title" separator="-" />
</field>
<field name="description" type="text" column="description" nullable="true"/>
<field name="image" type="string" column="image" length="255" nullable="true"/>
<field name="followers" type="integer" column="followers" nullable="true"/>
<field name="city" type="string" column="city" nullable="false" />
<field name="place" type="string" column="place" nullable="true" />
</entity>
</doctrine-mapping>
Controller action:
public function createAction(Request $request)
{
$form = $this->createForm(EventType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
/** @var Event $event */
$event = $form->getData();
$em = $this->getDoctrine()->getManager();
$em->persist($event);
$em->flush();
$this->addFlash('success', 'event created');
return $this->redirectToRoute('calendar_event', [
'slug' => $event->getSlug()
]);
}
return ['form' => $form->createView()];
}
Full stack trace:
[1] Doctrine\DBAL\Exception\NotNullConstraintViolationException: An exception occurred while executing 'INSERT INTO event (startDate, endDate, title, slug, description, image, followers, city, place) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)' with params ["2017-06-24 20:00:00", "2017-06-26 12:00:00", "Test event name for slug generation", null, "Test", null, null, "Somewhere", "Somewhere else"]:
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'slug' cannot be null
at n/a
in /project_home/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php line 112
at Doctrine\DBAL\Driver\AbstractMySQLDriver->convertException('An exception occurred while executing \'INSERT INTO event (startDate, endDate, title, slug, description, image, followers, city, place) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\' with params ["2017-06-24 20:00:00", "2017-06-26 12:00:00", "Test event name for slug generation", null, "Test", null, null, "Somewhere", "Somewhere else"]:SQLSTATE[23000]: Integrity constraint violation: 1048 Column \'slug\' cannot be null', object(PDOException))
in /project_home/vendor/doctrine/dbal/lib/Doctrine/DBAL/DBALException.php line 128
at Doctrine\DBAL\DBALException::driverExceptionDuringQuery(object(Driver), object(PDOException), 'INSERT INTO event (startDate, endDate, title, slug, description, image, followers, city, place) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)', array('2017-06-24 20:00:00', '2017-06-26 12:00:00', 'Test event name for slug generation', null, 'Test', null, null, 'Somewhere', 'Somewhere else'))
in /project_home/vendor/doctrine/dbal/lib/Doctrine/DBAL/Statement.php line 177
at Doctrine\DBAL\Statement->execute()
in /project_home/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php line 281
at Doctrine\ORM\Persisters\Entity\BasicEntityPersister->executeInserts()
in /project_home/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php line 1014
at Doctrine\ORM\UnitOfWork->executeInserts(object(ClassMetadata))
in /project_home/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php line 378
at Doctrine\ORM\UnitOfWork->commit(null)
in /project_home/vendor/doctrine/orm/lib/Doctrine/ORM/EntityManager.php line 356
at Doctrine\ORM\EntityManager->flush(null)
in /project_home/var/cache/dev/appDevDebugProjectContainer.php line 7072
at DoctrineORMEntityManager_00000000751279ee000000007e7efeea3473a0393d6fcd1415b2fc588e376308->flush(null)
in /project_home/var/cache/dev/jms_diextra/doctrine/EntityManager_59394e2cc7d86.php line 313
at EntityManager59394e2cc7d86_546a8d27f194334ee012bfe64f629947b07e4919\__CG__\Doctrine\ORM\EntityManager->flush()
in /project_home/src/AppBundle/Controller/CalendarController.php line 56
at AppBundle\Controller\CalendarController->createAction(object(Request))
in line
at ReflectionMethod->invokeArgs(object(CalendarController), array(object(Request)))
in /project_home/vendor/jms/cg/src/CG/Proxy/MethodInvocation.php line 84
at CG\Proxy\MethodInvocation->proceed()
in /project_home/vendor/jms/security-extra-bundle/Security/Authorization/Interception/MethodSecurityInterceptor.php line 133
at JMS\SecurityExtraBundle\Security\Authorization\Interception\MethodSecurityInterceptor->intercept(object(MethodInvocation))
in /project_home/vendor/jms/cg/src/CG/Proxy/MethodInvocation.php line 79
at CG\Proxy\MethodInvocation->proceed()
in /project_home/var/cache/dev/jms_diextra/proxies/AppBundle-Controller-CalendarController.php line 21
at EnhancedProxye0ff800f_2852d4e43776e45f00f38751350397dbf530e575\__CG__\AppBundle\Controller\CalendarController->createAction(object(Request))
in line
at call_user_func_array(array(object(CalendarController), 'createAction'), array(object(Request)))
in /project_home/var/cache/dev/classes.php line 4228
at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), 1)
in /project_home/var/cache/dev/classes.php line 4183
at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), 1, true)
in /project_home/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Kernel.php line 168
at Symfony\Component\HttpKernel\Kernel->handle(object(Request))
in /project_home/web/app_dev.php line 28
at require('/project_home/web/app_dev.php')
in /project_home/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Resources/config/router_dev.php line 40
[2] Doctrine\DBAL\Driver\PDOException: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'slug' cannot be null
at n/a
in /project_home/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php line 93
at Doctrine\DBAL\Driver\PDOStatement->execute(null)
in /project_home/vendor/doctrine/dbal/lib/Doctrine/DBAL/Statement.php line 168
at Doctrine\DBAL\Statement->execute()
in /project_home/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php line 281
at Doctrine\ORM\Persisters\Entity\BasicEntityPersister->executeInserts()
in /project_home/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php line 1014
at Doctrine\ORM\UnitOfWork->executeInserts(object(ClassMetadata))
in /project_home/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php line 378
at Doctrine\ORM\UnitOfWork->commit(null)
in /project_home/vendor/doctrine/orm/lib/Doctrine/ORM/EntityManager.php line 356
at Doctrine\ORM\EntityManager->flush(null)
in /project_home/var/cache/dev/appDevDebugProjectContainer.php line 7072
at DoctrineORMEntityManager_00000000751279ee000000007e7efeea3473a0393d6fcd1415b2fc588e376308->flush(null)
in /project_home/var/cache/dev/jms_diextra/doctrine/EntityManager_59394e2cc7d86.php line 313
at EntityManager59394e2cc7d86_546a8d27f194334ee012bfe64f629947b07e4919\__CG__\Doctrine\ORM\EntityManager->flush()
in /project_home/src/AppBundle/Controller/CalendarController.php line 56
at AppBundle\Controller\CalendarController->createAction(object(Request))
in line
at ReflectionMethod->invokeArgs(object(CalendarController), array(object(Request)))
in /project_home/vendor/jms/cg/src/CG/Proxy/MethodInvocation.php line 84
at CG\Proxy\MethodInvocation->proceed()
in /project_home/vendor/jms/security-extra-bundle/Security/Authorization/Interception/MethodSecurityInterceptor.php line 133
at JMS\SecurityExtraBundle\Security\Authorization\Interception\MethodSecurityInterceptor->intercept(object(MethodInvocation))
in /project_home/vendor/jms/cg/src/CG/Proxy/MethodInvocation.php line 79
at CG\Proxy\MethodInvocation->proceed()
in /project_home/var/cache/dev/jms_diextra/proxies/AppBundle-Controller-CalendarController.php line 21
at EnhancedProxye0ff800f_2852d4e43776e45f00f38751350397dbf530e575\__CG__\AppBundle\Controller\CalendarController->createAction(object(Request))
in line
at call_user_func_array(array(object(CalendarController), 'createAction'), array(object(Request)))
in /project_home/var/cache/dev/classes.php line 4228
at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), 1)
in /project_home/var/cache/dev/classes.php line 4183
at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), 1, true)
in /project_home/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Kernel.php line 168
at Symfony\Component\HttpKernel\Kernel->handle(object(Request))
in /project_home/web/app_dev.php line 28
at require('/project_home/web/app_dev.php')
in /project_home/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Resources/config/router_dev.php line 40
[3] PDOException: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'slug' cannot be null
at n/a
in /project_home/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php line 91
at PDOStatement->execute(null)
in /project_home/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php line 91
at Doctrine\DBAL\Driver\PDOStatement->execute(null)
in /project_home/vendor/doctrine/dbal/lib/Doctrine/DBAL/Statement.php line 168
at Doctrine\DBAL\Statement->execute()
in /project_home/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php line 281
at Doctrine\ORM\Persisters\Entity\BasicEntityPersister->executeInserts()
in /project_home/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php line 1014
at Doctrine\ORM\UnitOfWork->executeInserts(object(ClassMetadata))
in /project_home/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php line 378
at Doctrine\ORM\UnitOfWork->commit(null)
in /project_home/vendor/doctrine/orm/lib/Doctrine/ORM/EntityManager.php line 356
at Doctrine\ORM\EntityManager->flush(null)
in /project_home/var/cache/dev/appDevDebugProjectContainer.php line 7072
at DoctrineORMEntityManager_00000000751279ee000000007e7efeea3473a0393d6fcd1415b2fc588e376308->flush(null)
in /project_home/var/cache/dev/jms_diextra/doctrine/EntityManager_59394e2cc7d86.php line 313
at EntityManager59394e2cc7d86_546a8d27f194334ee012bfe64f629947b07e4919\__CG__\Doctrine\ORM\EntityManager->flush()
in /project_home/src/AppBundle/Controller/CalendarController.php line 56
at AppBundle\Controller\CalendarController->createAction(object(Request))
in line
at ReflectionMethod->invokeArgs(object(CalendarController), array(object(Request)))
in /project_home/vendor/jms/cg/src/CG/Proxy/MethodInvocation.php line 84
at CG\Proxy\MethodInvocation->proceed()
in /project_home/vendor/jms/security-extra-bundle/Security/Authorization/Interception/MethodSecurityInterceptor.php line 133
at JMS\SecurityExtraBundle\Security\Authorization\Interception\MethodSecurityInterceptor->intercept(object(MethodInvocation))
in /project_home/vendor/jms/cg/src/CG/Proxy/MethodInvocation.php line 79
at CG\Proxy\MethodInvocation->proceed()
in /project_home/var/cache/dev/jms_diextra/proxies/AppBundle-Controller-CalendarController.php line 21
at EnhancedProxye0ff800f_2852d4e43776e45f00f38751350397dbf530e575\__CG__\AppBundle\Controller\CalendarController->createAction(object(Request))
in line
at call_user_func_array(array(object(CalendarController), 'createAction'), array(object(Request)))
in /project_home/var/cache/dev/classes.php line 4228
at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), 1)
in /project_home/var/cache/dev/classes.php line 4183
at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), 1, true)
in /project_home/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Kernel.php line 168
at Symfony\Component\HttpKernel\Kernel->handle(object(Request))
in /project_home/web/app_dev.php line 28
at require('/project_home/web/app_dev.php')
in /project_home/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Resources/config/router_dev.php line 40
The only difference I see is in your xml namespace declaration. You are referencing a url for version 3.x whilst using a versing 2.x. The official documentation uses this schema
http://gediminasm.org/schemas/orm/doctrine-extensions-mapping
make sure to update your xml mapping accordingly:
<?xml version="1.0" encoding="utf-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd"
xmlns:gedmo="http://gediminasm.org/schemas/orm/doctrine-extensions-mapping">
<entity repository-class="AppBundle\Repository\EventRepository" name="AppBundle\Entity\Event">
<id name="id" type="integer" column="id">
<generator strategy="AUTO"/>
</id>
<field name="startDate" type="datetime" column="startDate"/>
<field name="endDate" type="datetime" column="endDate"/>
<field name="title" type="string" column="title" length="255"/>
<field name="slug" type="string" column="slug" length="255" unique="true">
<gedmo:slug unique="true" updatable="true" fields="title" separator="-" />
</field>
<field name="description" type="text" column="description" nullable="true"/>
<field name="image" type="string" column="image" length="255" nullable="true"/>
<field name="followers" type="integer" column="followers" nullable="true"/>
<field name="city" type="string" column="city" nullable="false" />
<field name="place" type="string" column="place" nullable="true" />
</entity>
</doctrine-mapping>