gpt4 book ai didi

symfony - 创建一个实现 ContainerAwareInterface 的基础 Controller 类

转载 作者:行者123 更新时间:2023-12-02 02:06:08 25 4
gpt4 key购买 nike

我遵循了 Fabien Potiencier 的教程,关于 how to create your own Framework on top of the Symfony Components .现在我需要一个方法。我想将依赖容器注入(inject)我所有的 Controller ,而不是将每个 Controller 都定义为服务。

在原始的 Symfony2 框架中,所有 Controller 都扩展了位于 Symfony\Bundle\FrameworkBundle\Controller\Controller.php 中的 Controller 类:

namespace Symfony\Bundle\FrameworkBundle\Controller;

class Controller extends ContainerAware
{
// ...
}

Controller 类扩展了 ControllerAware 类,因此您可以在您的 Controller 中执行以下操作:

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class MyController extends Controller
{
public function someAction()
{
$this->container->get('dependencie_xyz);
}
}

所以我的问题是:我怎样才能在我的框架中完成同样的事情?

最佳答案

我花了一段时间,但我终于明白了 Symfony2 框架是如何做到的。在 SymfonyFrameworkBundle 中是一个自定义的 ControllerResolver,它在解析的 Controller 上调用 setContainer 方法。 Controller 必须是 ContainerAwareInterface 的实例。

简化版:

class ContainerAwareControllerResolver extends ControllerResolver
{
private $container;

public __construct(ContainerInterface $container)
{
$this->container = $container;
parent::__construct();
}

public function getController(Request $request)
{
$controller = parent::getController($request);
if($controller instanceof ContainerAware ){
$controller->setContainer($this->container);
}
}
}

来源:

https://github.com/symfony/symfony/blob/master/src/Symfony/Bundle/FrameworkBundle/Controller/ControllerResolver.php

关于symfony - 创建一个实现 ContainerAwareInterface 的基础 Controller 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14939720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com