【问题标题】:Depedendency Injection on base Controller / Service基础控制器/服务中的依赖注入
【发布时间】:2014-08-29 07:54:39
【问题描述】:

我是 Symfony 的新手。我在 symfony 2.3 LTS 中开始了我的第一个项目。此时我已经在不同的包中创建了许多控制器。我的问题与正确的程序有关。我在我的控制器中使用不同的服务,例如“翻译器”、“表单工厂”、“会话”、“路由器”、“实体管理器”、“模板”。

我在我的“service.yml”中创建了一个基础服务

myapp.controller.base:
    class: "%myapp.controller.base.class%"
    arguments: ["@doctrine.orm.entity_manager", , "@templating", "@session", "@translator", "@router", "@form.factory"]

并在我的控制器中注入基础服务,这也是一个服务。

myapp.controller.locales:
    class: "%myapp.controller.locales.class%"
    arguments: ["@myapp.controller.base"]

我的基础服务如下所示。

namespace MyApp\<BundleName>\Controller;
use Symfony\Bundle\FrameworkBundle\Templating\EngineInterface;
use Symfony\Component\HttpFoundation\Session\Session;

class BaseController
{
protected $formErrorService;
protected $entityManager;
protected $templating;
protected $session;
protected $translator;
protected $router;
protected $formFactory;

public function __construct($entityManager, EngineInterface $templating, Session $session, $translator, $router, $formFactory)
{
    $this->setEntityManager($entityManager);
    $this->setTemplating($templating);
    $this->setSession($session);
    $this->setTranslator($translator);
    $this->setRouter($router);
    $this->setFormFactory($formFactory);
}

 public function setEntityManager($em)
{
    $this->entityManager = $em;
}

public function getEntityManager()
{
    return $this->entityManager;
}

公共函数 setTemplating($模板) { $this->模板 = $模板; }

public function getTemplating()
{
    return $this->templating;
}

public function setSession($session)
{
    $this->session = $session;
}

public function getSession()
{
    return $this->session;
}

public function setTranslator($translator)
{
    $this->translator = $translator;
}

public function getTranslator()
{
    return $this->translator;
}

public function setRouter($router)
{
    $this->router = $router;
}

public function getRouter()
{
    return $this->router;
}

public function setFormFactory($formFactory)
{
    $this->formFactory = $formFactory;
}

public function getFormFactory()
{
    return $this->formFactory;
}
}

我在我的语言环境控制器中调用看起来像这样

namespace MyApp\<Bundlename>\Controller;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Session\Session;

class LocalesController extends BaseController
{

protected $baseService;

public function __construct($baseService)
{
    $this->baseService = $baseService;
}

public function indexAction(Request $request)
{

$locales=$this->baseService->getEntityManager()->getRepository('<reponame>')->findAll();
    return  $this->baseService->getTemplating()->renderResponse('<templatename>', array('locales' => $locales));
}

这是一个正确的程序吗?我应该在需要此服务的每个控制器中使用此过程吗?

希望我能得到有用的提示,非常感谢

【问题讨论】:

    标签: symfony service controller dependencies code-injection


    【解决方案1】:

    将一个控制器注入另一个控制器是一种错误的方式。您应该为您的子控制器使用parent

    例子:

    myapp.controller.base:
        class: "%myapp.controller.base.class%"
        arguments: ["@doctrine.orm.entity_manager", , "@templating", "@session", "@translator", "@router", "@form.factory"]
    
    myapp.controller.locales:
        class: "%myapp.controller.locales.class%"
        parent: myapp.controller.base
    

    更多关于父服务和覆盖父依赖的文档:http://symfony.com/doc/current/components/dependency_injection/parentservices.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-23
      • 1970-01-01
      • 2017-01-21
      • 2016-02-01
      • 1970-01-01
      • 2015-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多