在视图中传递对象管理器

时间:2014-01-14 10:29:59

标签: php model-view-controller doctrine-orm zend-framework2

将ZF2与Doctrine 2一起使用。

对于应用程序的需求,我在objectmanager

中将$om作为变量(return new ViewModel)传递

所以我可以在我看来使用它:

$om->getRepository('\Schema\Entity\Category')->findBy(.....

令我困惑的是:

1)我是否打破了MVC规则? (因为有人说这是一种不好的做法而有些人则不这样做)

2)我是否会在使用这种策略开发应用程序时遇到任何问题?

1 个答案:

答案 0 :(得分:1)

  1. 是的,你做
  2. 违反编码标准总是有负面的副作用
  3. 控制器的作业是将您需要的数据传递到视图中。为此,Controller与模型进行交互。

    public function fooAction() 
    {
        return new ViewModel([
            'entities' => $this->getObjectManager()->findBy([
                'foo' => 'bar'
            ])
        ]);
    }
    

    这就是你将如何做到的。下一个问题应该 getObjectManager()做了什么或如何将ObjectManager正确地注入控制器?

    答案很简单:你必须使用Controller-Factories

    //module.config.php
    'controllers' => [
        'factories' => [
            'YourNamespace\Controller\FooController' => function($cpm) {
                $ctrl = new FooController();
                $ctrl->setObjectManager(
                    $cpm->getServiceLocator()->get('Doctrine\ORM\EntityManager')
                );
                return $ctrl;
            }
        ]
    ]
    

    这就是它的全部内容。现在你对你想要实现的目标进行了非常简洁的设置;)