【发布时间】:2015-09-08 15:31:36
【问题描述】:
我有这个控制器:
use Doctrine\Common\Persistence\ManagerRegistry;
class AjaxEntityController
{
protected $registry;
public function __construct(ManagerRegistry $registry)
{
$this->registry = $registry;
}
...
}
这是我的 services.yml:
services:
tapir_form.ajax_entity_controller:
class: Tapir\FormBundle\Controller\AjaxEntityController
arguments: [ '@doctrine' ]
但是当我尝试访问这个控制器(通过它的 URL)时,我得到了这个错误:
类型错误:传递给 Tapir\FormBundle\Controller\AjaxEntityController::__construct() 的参数 1 必须实现接口 Doctrine\Common\Persistence\ManagerRegistry,没有给出,在 /..../var/cache/dev/ 中调用jms_diextra/controller_injectors/TapirFormBundleControllerAjaxEntityController.php 第 13 行
我已经搜索过这个问题,发现很多情况下控制器没有声明为服务或缺少 arguments 参数,但不是我的情况。
我清除了缓存,将@Route(service="tapir_form.ajax_entity_controller") 添加到我的控制器类中,以防万一。当然我有我的 TapirFormExtension
$loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader->load('services.yml');
如果我从构造函数中删除强制参数,则服务可以工作(我的意思是调用控制器操作,没有例外)。 这是我第一次将控制器用作服务。其他服务(如表单类型)使用类似的配置。
我正在使用 Symfony 2.7.3、PHP 5.6.13、Linux。
还有什么问题?
提前致谢。
【问题讨论】:
-
您需要更改您的路由信息以将控制器指定为服务:symfony.com/doc/current/cookbook/controller/…
-
正如@Cerad 所说...您的问题是您可能在
routing.yml文件中定义了路由,后来您在@Route注释中定义了服务.. -
就是Cerad,谢谢!我在 routing.yml 中使用“Bundle:Controller:action”而不是“servicename:method”。
标签: symfony