传递给__construct的参数1必须是Services \ ProductManager的实例,没有给出

时间:2015-07-23 15:17:45

标签: php symfony twig

in service.yml

test_product.controller:
        class: MyBundle\Controller\Test\ProductController
        arguments: ["@product_manager.service"]
控制器中的

class ProductController extends Controller
{
     /**
     * @var ProductManager
     */
    private $productManager;

    public function __construct(ProductManager $productManager){
        $this->productManager = $productManager;
    }
}

在routing.yml

test_product_addNew:
    path: /test/product/addNew
    defaults: { _controller:test_product.controller:addNewAction }

我想在contructor中使用ProductManger做一些事情,但它给了我这个错误

  

捕获致命错误:参数1传递给   MyBundle \控制器\测试\ ProductController的:: __结构()   必须是MyBundle \ Services \ ProductManager的实例,   给出了Symfony \ Bundle \ TwigBundle \ Debug \ TimedTwigEngine的实例,   呼唤   ... /应用/缓存的/ dev / appDevDebugProjectContainer.php   在第1202行并定义

我是symfony的新手,感谢任何帮助

2 个答案:

答案 0 :(得分:1)

你颠倒了服务的逻辑。

首先,你的经理必须被定义为服务,因为你需要从控制器调用它。

// services.yml
product_manager:
        class: MyBundle\Path\To\ProductManager

然后直接调用您的经理,该经理被定义为您控制器中的服务。

// Controller
class ProductController extends Controller
{
     [...]
     $this->get('product_manager');
     [...]
}

并且您不需要重载__construct()方法。只需在您需要的地方拨打->get(any_service)

你的路线也错了。您必须从命名空间定义控制器。

// routing.yml
test_product_addNew:
    path: /test/product/addNew
    defaults: { _controller:MyBundle:Product:addNew }

答案 1 :(得分:0)

Symfony 3.3 (2017年5月发布)以来,您可以轻松使用构造函数注入和自动装配:

# services.yml 
services
    _defaults:
        autowire: true

    MyBundle\Controller\Test\ProductController: ~

保持休息状态。

您想了解更多有关这些功能的信息吗?请检查此post with examples