Php 将服务注入控制器

Php 将服务注入控制器,php,symfony,Php,Symfony,我正在学习Symfony2,我正在努力向控制器中注入服务。我得到这个错误: Catchable Fatal Error: Argument 1 passed to Inter\DemoBundle\Controller\DataController::__construct() must be an instance of Inter\DemoBundle\Factory\ObjectFactory, none given, called in /home/tomazi/Dev/interfac

我正在学习Symfony2,我正在努力向控制器中注入服务。我得到这个错误:

Catchable Fatal Error: Argument 1 passed to Inter\DemoBundle\Controller\DataController::__construct() must be an instance of Inter\DemoBundle\Factory\ObjectFactory, none given, called in /home/tomazi/Dev/interface.test/app/cache/dev/classes.php on line 2138 and defined
我创建了一个非常基本的结构接口-->工厂-->控制器

我的界面:

<?php
namespace Inter\DemoBundle\Interfaces;

interface ObjectInterface {

    public function create($testObject);

}

您需要修改路由以将其作为服务引用。例如:

# app/config/routing.yml
hello:
    path:     /hello
    defaults: { _controller: inter.controller:indexAction }
如果您正在使用注释

/**
 * @Route("/test", service="inter.controller")
 */
public function test()
{
    return $this->object;
}
两件事:

  • 您需要将有效的ObjectFactory对象传递到构造函数中。(您的错误表明它没有收到一个)
  • 您需要在控制器(*)上的方法中添加“操作”。确保路由设置正确,清除缓存,然后重试

  • *

    您可以从
    Symfony\Bundle\FrameworkBundle\controller\controller
    扩展控制器来解决此问题。它是一个扩展
    containerware
    的基本Symfony类,因此它知道容器

    如果您这样做,您可以像这样简单地解决您的所有问题:

    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    
    class SomeController extends Controller
    {
        public function someAction()
        {
            $someService = $this->get('some.service');
            ...
        }
    }
    

    您的路由是否将控制器映射为服务?是的,我确实看过食谱。但仍然无法发现此处的问题。这实际上是一个很好的观点,但如果您查看我的DataCOntroller,我正在使用注释。如何添加默认值:{}那里。。。?通过AnnotationsName thing for annotations
    @Route(/test),defaults={{u controller:inter.controller:testAction})
    我想你的答案解决了我的问题,但现在我遇到了更多错误,如果你介意的话,我会把它们添加到问题中look@Tomazi,这个答案可能会有所帮助:Q是关于服务注入的。不是他打电话给构造器,所以他不需要传递任何东西。
    FileLoaderImportCircularReferenceException in FileLoader.php line 97:
    Circular reference detected in 
    
    "/home/tomazi/Dev/interface.test/app/config/routing_dev.yml" 
    
    ("/home/tomazi/Dev/interface.test/app/config/routing_dev.yml" > 
    
    "/home/tomazi/Dev/interface.test/app/config/routing.yml" > 
    
    "/home/tomazi/Dev/interface.test/src/Inter/DemoBundle/Controller/" > 
    
    "/home/tomazi/Dev/interface.test/app/config/routing_dev.yml").
    
    # app/config/routing.yml
    hello:
        path:     /hello
        defaults: { _controller: inter.controller:indexAction }
    
    /**
     * @Route("/test", service="inter.controller")
     */
    public function test()
    {
        return $this->object;
    }
    
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    
    class SomeController extends Controller
    {
        public function someAction()
        {
            $someService = $this->get('some.service');
            ...
        }
    }