【问题标题】:Symony2 Access form in entity prePersist?实体 prePersist 中的 Symony2 访问表单?
【发布时间】:2015-01-06 18:27:32
【问题描述】:

标题说明了一切。我希望能够从我的实体中的 prePersist 函数中访问表单。像这样:

/** @ORM\PrePersist */
public function prePersist()
{
    //Symfony 1.4 way
    $params     = sfContext::getInstance()->getRequest()->getParameterHolder()->getAll();
    $this->gps84Long=$params['coordinate']['gps_84_lat_degrees'];

}

我需要这个的原因是因为表单值没有映射到数据库字段。我需要将 2-3 个表单字段组合成一个值,然后放入实体中的单个字段中。

EDIT-为提供的答案添加了 .yml 添加:

services:

   my.doctrine.subscriber:  
     class:  myCompany\myBundle\Models\MyDoctrineSubscriber
     arguments:  [@form.factory,"@request_stack"]
     tags:
       - { name: 'doctrine.event_subscriber', connection: 'default' }

【问题讨论】:

标签: php symfony entity


【解决方案1】:

我的建议是创建一个Doctrine subscriber 并注入您想要的任何服务(xml 示例):

服务.xml

<service id="my.doctrine.subscriber" class="%my.doctrine.subscriber.class%">
    <argument type="service" id="form.factory" />
    <argument type="service" id="request_stack" />
    <tag name="doctrine.event_subscriber" connection="default" />
</service>

MyDoctirne订阅者

class MyDoctirneSubscriber implements EventSubscriber
{
    private $formFactory;

    private $requestStack;

    /**
     * @param ContainerInterface $container
     */
    public function __construct(FormFactoryInterface $formFactory, RequestStack $requestStack)
    {
        $this->formFactory = $formFactory;
        $this->requestStack = $requestStack;
    }

    /**
     * @return array
     */
    public function getSubscribedEvents()
    {
        return [
            'prePersist',
            ...
        ];
    }

    /**
     * @param LifecycleEventArgs $eventArgs
     */
    public function prePersist(LifecycleEventArgs $eventArgs)
    {
        $entityManager = $eventArgs->getEntityManager();
        $entity = $eventArgs->getEntity();

        if ($entity instanceof MyEntity) {
            $request = $this->requestStack->getCurrentRequest();

            $form = $this->formFactory->create(TYPE, DATA_OR_NULL, OPTIONS);

            $form->handleRequest($request);

            ....
        }
    }

    ....
}

【讨论】:

  • 那么所有实体在持久化时都会经过这个函数吗?你碰巧知道服务的 .yml 表示吗?这就是我一直在使用的。我知道如何表示除论点之外的所有内容。
  • @KiraisJustice 是的,所有实体都通过这种方法,这就是我们设置条件的原因(if ($entity instanceof MyEntity) - 教义推荐)。对不起,我从来没有使用过 yml 服务定义..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多