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的新手,感谢任何帮助
答案 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。