Symfony2课外

时间:2015-04-08 14:32:22

标签: php symfony doctrine

我使用symfony2(2.6)并且我将全局变量的类添加到twig。例如,课程菜单:

namespace Cms\PageBundle\Twig;

use Doctrine\ORM\EntityManager;
class Menu {
    protected $em;

    public function __construct(EntityManager $em)
    {
        $this->em = $em;
    }
    public function show(){
       /******/
    }
}

和services.yml

services:
    class_menu:
        class: Cms\PageBundle\Twig\Menu
        arguments: ['@doctrine.orm.entity_manager']

    twig_menu:
        class: Cms\PageBundle\Twig\Menu

请参阅:

  

Menu.php第9行中的ContextErrorException:   可捕获的致命错误:参数1传递给   Cms \ PageBundle \ Twig \ Menu :: __ construct()必须是。的实例   Doctrine \ ORM \ EntityManager,没有给出,调用   /home/cms/public_html/app/cache/dev/appDevDebugProjectContainer.php on   第3834行并定义

一般情况下,任何类(外部)都有构造函数和(参数)原则的问题。 为什么?

Symfony2 getdoctrine outside of Model/Controller

1 个答案:

答案 0 :(得分:1)

完全可以预料到这个错误。 Symfony2期望通过调用__construct构造函数来创建服务实例。如果您想保持单个类的使用,则需要删除__construct并使用setter依赖注入。

有关于此的官方文档:Optional Dependencies: Setter Injection

基本上,您不会在创建服务实例期间传递EntityManager实例,而是在以后设置#34;。

希望这有帮助。

更新

如果您回退到原始解决方案,请确保在两个实例中都通过EntityManager

services:
    class_menu:
        class: Cms\PageBundle\Twig\Menu
        arguments: ['@doctrine.orm.entity_manager']

    twig_menu:
        class: Cms\PageBundle\Twig\Menu
        arguments: ['@doctrine.orm.entity_manager']