Zf2表单依赖于userId

时间:2014-04-23 08:19:03

标签: php doctrine-orm zend-framework2 entity

我想为用户创建一个独特的下拉列表,并找到了一种方法来实现这一点,但对客户来说还不行。

这就是我所做的:

 public function __construct($name = null, EntityManager $em = null, $userId = null)
 {

    parent::__construct($name);
    $this->setAttribute('method', 'post');

    [...]
 $this->add(array(
        'name' => 'religionId',
        'type' => 'DoctrineModule\Form\Element\ObjectSelect',

        'options' => array(
            'object_manager' => $this->getEntityManager(),
            'target_class' => 'Religions\Entity\Religions',
            'property' => 'name',
            'disable_inarray_validator' => true,
            'by_reference' => false,
            'is_method' => true,
            'find_method' => array(
                'name' => 'findBy',
                'params' => array(
                    'criteria' => array('reUserId' => $userId),
                    'orderBy' => array('name' => 'ASC'),
                ),
            ),


        ),
        'attributes' => array(
            'multiple' => false,
            'required' => false,

        )
    ));


}

这很有用,因为我在初始化表单时发送变量reuserId,使用$this->identity()

客户想要注入用户实体并从那里选择....

搜索了stackoverflow和google,但无法找到任何内容......有什么帮助吗?谢谢!

1 个答案:

答案 0 :(得分:2)

注射'在ZF2中你需要使用ServiceManager并创建服务工厂。

因此,务必确保始终通过ServiceManager创建表单。

例如在控制器中:

$form = $this->getServiceLocator()->get('MyModule\Form\FooForm');

然后你需要注射'用户购买创建工厂类或关闭。

<强> Module.php

 public function getFormElementConfig() {
    return array(
      'factories' => array(
        'MyModule\Form\FooForm' => function($fem) {

            $serviceManager = $fem->getServiceLocator();
            $entityManager  = $serviceManager->get('objectmanager'); // Doctrine object manager

            // Load the user
            // Example is the zfcUser authentication service, however replace
            // this with whatever you use to maintain the users id

            $user = $serviceManager->get('zfcuser_auth_service')->getIdentity();

            // Inject the user entity into the form constructor
            $form = new FooForm($user); 

            return $form;
        }, 
      ),
    );
}

据说我认为您可能需要考虑表单依赖性。在我看来,你不是依赖在用户实体上 - 而是用户的id应该用在数据库查询中,以减少宗教信息列表。

您可以执行此查询,然后将结果(宗教集合)传递给表单,就像我的示例显示如何为用户实体一样 - 这意味着您可以使用&#39;正常&#39; Zend\Form\Element\Select而不是ObjectSelect - 意味着无需注入ObjectManager等。

相关问题