我有一个服务MailController
,在我的配置中定义如下
services:
mail_controller:
class: Company'Project'Bundle'Controller'MailController
我正在调用其他服务中的Service
$mailController = $this->get('mail_controller');
现在我得到的错误是建立在这个问题
container
没有在控制器上设置,所以我在constructor
内注入一个
// MailController
public function __construct() {
$this->setContainer(new Container());
}
现在我得到这个错误:
You have requested a non-existent service "router".
我猜我需要注入更多的服务,但我不知道要注入什么,所以我需要进一步添加什么以便我的控制器可以与所有服务一起工作?
我的MailController是这样的
namespace Company'Project'Bundle'Controller;
use Symfony'Bundle'FrameworkBundle'Controller'Controller;
use Symfony'Component'DependencyInjection'Container;
use Sensio'Bundle'FrameworkExtraBundle'Configuration'Route;
use Sensio'Bundle'FrameworkExtraBundle'Configuration'Template;
use Doctrine'ORM'EntityManager;
class MailController extends Controller{
public function __construct() {
$this->setContainer(new Container());
}
//Code for mailstuff
}
你正在创建一个新的容器,而不是注入已构建的容器,因此它没有服务。
要使用你的控制器,你需要通过你的服务将预先制作好的服务容器注入到你的控制器中,就像这样…
services:
mail_controller:
class: Company'Project'Bundle'Controller'MailController
calls:
- [ setContainer, [ @service_container ]]
. .并且去掉__construct
中的setter
注入整个服务容器
calls: - [ setContainer, [ @service_container ]]
违背了将控制器声明为服务的目的。只需在构造函数中注入所需的服务。构造函数需要将服务作为参数传递,并且不再扩展Controller
。
//MailController
use Symfony'Component'Routing'RouterInterface;
class MailController
{
private $router;
public function __construct(RouterInterface $router){
$this->router = $router;
}
//actions
}
现在您需要调整您的services.yml
并使用描述您需要的服务的参数扩展服务
services:
mail_controller:
class: Company'Project'Bundle'Controller'MailController
arguments:
- @router
等瞧,只需要一个服务,只注入一个服务。如果你发现自己在一个动作中注入了太多的服务,很可能是你的动作/控制器不够"瘦"。