原则可操作 - 列'slug'不能为空



我正在使用Doctrine,通过StofDoctrineExtensionsBundle使用"Doctrine Extensions Sluggable"行为自动生成DoctrineExtensions

侦听器似乎已正确注册。实体字段也标记为可慢操作。

当尝试通过Symfony表单持久化我的实体时,不会发生子弹生成。引发数据库异常。

例外:

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

版本:

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 

配置.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

实体 (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="AppBundleRepositoryEventRepository" name="AppBundleEntityEvent">
        <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>

控制器操作:

    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()];
    }

全栈跟踪:

[1] DoctrineDBALExceptionNotNullConstraintViolationException: 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 DoctrineDBALDriverAbstractMySQLDriver->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 DoctrineDBALDBALException::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 DoctrineDBALStatement->execute()
        in /project_home/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php line 281
    at DoctrineORMPersistersEntityBasicEntityPersister->executeInserts()
        in /project_home/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php line 1014
    at DoctrineORMUnitOfWork->executeInserts(object(ClassMetadata))
        in /project_home/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php line 378
    at DoctrineORMUnitOfWork->commit(null)
        in /project_home/vendor/doctrine/orm/lib/Doctrine/ORM/EntityManager.php line 356
    at DoctrineORMEntityManager->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__DoctrineORMEntityManager->flush()
        in /project_home/src/AppBundle/Controller/CalendarController.php line 56
    at AppBundleControllerCalendarController->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 CGProxyMethodInvocation->proceed()
        in /project_home/vendor/jms/security-extra-bundle/Security/Authorization/Interception/MethodSecurityInterceptor.php line 133
    at JMSSecurityExtraBundleSecurityAuthorizationInterceptionMethodSecurityInterceptor->intercept(object(MethodInvocation))
        in /project_home/vendor/jms/cg/src/CG/Proxy/MethodInvocation.php line 79
    at CGProxyMethodInvocation->proceed()
        in /project_home/var/cache/dev/jms_diextra/proxies/AppBundle-Controller-CalendarController.php line 21
    at EnhancedProxye0ff800f_2852d4e43776e45f00f38751350397dbf530e575__CG__AppBundleControllerCalendarController->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 SymfonyComponentHttpKernelHttpKernel->handleRaw(object(Request), 1)
        in /project_home/var/cache/dev/classes.php line 4183
    at SymfonyComponentHttpKernelHttpKernel->handle(object(Request), 1, true)
        in /project_home/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Kernel.php line 168
    at SymfonyComponentHttpKernelKernel->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] DoctrineDBALDriverPDOException: 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 DoctrineDBALDriverPDOStatement->execute(null)
        in /project_home/vendor/doctrine/dbal/lib/Doctrine/DBAL/Statement.php line 168
    at DoctrineDBALStatement->execute()
        in /project_home/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php line 281
    at DoctrineORMPersistersEntityBasicEntityPersister->executeInserts()
        in /project_home/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php line 1014
    at DoctrineORMUnitOfWork->executeInserts(object(ClassMetadata))
        in /project_home/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php line 378
    at DoctrineORMUnitOfWork->commit(null)
        in /project_home/vendor/doctrine/orm/lib/Doctrine/ORM/EntityManager.php line 356
    at DoctrineORMEntityManager->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__DoctrineORMEntityManager->flush()
        in /project_home/src/AppBundle/Controller/CalendarController.php line 56
    at AppBundleControllerCalendarController->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 CGProxyMethodInvocation->proceed()
        in /project_home/vendor/jms/security-extra-bundle/Security/Authorization/Interception/MethodSecurityInterceptor.php line 133
    at JMSSecurityExtraBundleSecurityAuthorizationInterceptionMethodSecurityInterceptor->intercept(object(MethodInvocation))
        in /project_home/vendor/jms/cg/src/CG/Proxy/MethodInvocation.php line 79
    at CGProxyMethodInvocation->proceed()
        in /project_home/var/cache/dev/jms_diextra/proxies/AppBundle-Controller-CalendarController.php line 21
    at EnhancedProxye0ff800f_2852d4e43776e45f00f38751350397dbf530e575__CG__AppBundleControllerCalendarController->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 SymfonyComponentHttpKernelHttpKernel->handleRaw(object(Request), 1)
        in /project_home/var/cache/dev/classes.php line 4183
    at SymfonyComponentHttpKernelHttpKernel->handle(object(Request), 1, true)
        in /project_home/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Kernel.php line 168
    at SymfonyComponentHttpKernelKernel->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 DoctrineDBALDriverPDOStatement->execute(null)
        in /project_home/vendor/doctrine/dbal/lib/Doctrine/DBAL/Statement.php line 168
    at DoctrineDBALStatement->execute()
        in /project_home/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php line 281
    at DoctrineORMPersistersEntityBasicEntityPersister->executeInserts()
        in /project_home/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php line 1014
    at DoctrineORMUnitOfWork->executeInserts(object(ClassMetadata))
        in /project_home/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php line 378
    at DoctrineORMUnitOfWork->commit(null)
        in /project_home/vendor/doctrine/orm/lib/Doctrine/ORM/EntityManager.php line 356
    at DoctrineORMEntityManager->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__DoctrineORMEntityManager->flush()
        in /project_home/src/AppBundle/Controller/CalendarController.php line 56
    at AppBundleControllerCalendarController->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 CGProxyMethodInvocation->proceed()
        in /project_home/vendor/jms/security-extra-bundle/Security/Authorization/Interception/MethodSecurityInterceptor.php line 133
    at JMSSecurityExtraBundleSecurityAuthorizationInterceptionMethodSecurityInterceptor->intercept(object(MethodInvocation))
        in /project_home/vendor/jms/cg/src/CG/Proxy/MethodInvocation.php line 79
    at CGProxyMethodInvocation->proceed()
        in /project_home/var/cache/dev/jms_diextra/proxies/AppBundle-Controller-CalendarController.php line 21
    at EnhancedProxye0ff800f_2852d4e43776e45f00f38751350397dbf530e575__CG__AppBundleControllerCalendarController->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 SymfonyComponentHttpKernelHttpKernel->handleRaw(object(Request), 1)
        in /project_home/var/cache/dev/classes.php line 4183
    at SymfonyComponentHttpKernelHttpKernel->handle(object(Request), 1, true)
        in /project_home/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Kernel.php line 168
    at SymfonyComponentHttpKernelKernel->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

我看到的唯一区别是您的 xml 命名空间声明。您在使用 versing 2.x 时引用版本 3.x 的 URL。官方文档使用此架构

http://gediminasm.org/schemas/orm/doctrine-extensions-mappin‌​g

请确保相应地更新 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://gediminasm.org/schemas/orm/doctrine-extensions-mappin‌​g">
    <entity repository-class="AppBundleRepositoryEventRepository" name="AppBundleEntityEvent">
        <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>

当我实现StofDoctrineExtensionsBundle时,我第一次执行了一个将所有slug值设置为null的函数。(当 slug 设置为 null 时,侦听器称为填充 slug 值。

希望这有帮助。

例外情况是告诉你:

'slug' cannot be null

您需要在"Event.orm.xml"中修改属性定义,并使 slug 可为空,因为默认情况下可为空 false。

所以你需要像这样改变你的定义:

        <field name="slug" type="string" column="slug" length="255" unique="true" nullable="false">
            <gedmo:slug unique="true" updatable="true" fields="title" separator="-" />
        </field>

这将解决您的异常。但是,真正的问题是 slug 属性上的唯一约束:第二次插入具有"null"值的事件时,它将触发唯一约束,因为已经有一行带有 null slug。因此,您需要提供辅助信息域或删除唯一约束。

相关内容

  • 没有找到相关文章

最新更新