我有一个服务MailController
,在我的配置
services:
mail_controller:
class: Company\Project\Bundle\Controller\MailController
我在其他服务中调用服务
$mailController = $this->get('mail_controller');
现在我得到的错误是在this Question
上累积未在控制器上设置container
,因此我在constructor
// MailController
public function __construct() {
$this->setContainer(new Container());
}
现在我收到了这个错误:
You have requested a non-existent service "router".
我猜我需要注入更多服务,但我不知道要注入什么,所以我需要进一步添加什么才能使我的Controller可以使用所有服务?
我的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
}
答案 0 :(得分:1)
您正在创建一个新容器,而不是注入构建的容器,因此它没有服务。
要使用您的控制器,您需要通过您的服务将预制的服务容器注入您的控制器中。
services:
mail_controller:
class: Company\Project\Bundle\Controller\MailController
calls:
- [ setContainer, [ @service_container ]]
..并摆脱__construct
中的二传手。
答案 1 :(得分:1)
注入整个服务容器
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
瞧,瞧,
只需要一项服务,只注入一项服务。
如果您发现自己在一个动作中注入了太多服务,那么您的动作/控制器可能并不“瘦”。够了。