我有这个控制器:
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/中调用第13行的jms_diextra / controller_injectors / TapirFormBundleControllerAjaxEntityController.php
我已经搜索过这个问题,发现很多情况下控制器没有被声明为服务或者参数参数丢失了,但这不是我的情况。
我清除了缓存,将@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。
还有什么可能是错的?
提前致谢。
答案 0 :(得分:0)
由于 Symfony 3.3 ,您可以使用自动装配:
# app/services/services.yml
services:
Tapir\FormBundle\Controller\AjaxEntityController:
autowire: true
或者对于更多控制器, PSR-4 service autodiscovery :
# app/services/services.yml
services:
_defaults:
autowire: true
Tapir\:
resource: src/Tapir/{Controller}