kutny / autowiring-bundle
一个简单的库,为Symfony依赖注入(DI)容器提供自动装配。
Requires
- php: >=5.3.2
This package is not auto-updated.
Last update: 2022-11-21 05:27:36 UTC
README
一个简单的库,为Symfony2依赖注入(DI)容器提供自动装配。
此组件仅支持构造函数自动装配,请参阅http://springindepth.com/book/in-depth-ioc-autowiring.html获取描述。
喜欢这个组件?请给我反馈或发送“谢谢”消息到jirkakoutny@gmail.com。
安装
- 通过composer安装
composer require kutny/autowiring-bundle
- 将KutnyAutowiringBundle添加到您的应用程序内核
// app/AppKernel.php public function registerBundles() { return array( // ... new Kutny\AutowiringBundle\KutnyAutowiringBundle(), // ... ); }
配置
在大多数情况下,此组件不需要任何配置。但是,如果在安装此组件后您的应用程序无法启动,并给您抛出Kutny\AutowiringBundle\Compiler\CannotResolveParameterException异常,您可能需要从自动装配中移除一些服务。请参阅下面的示例。
示例 1:
您收到Kutny\AutowiringBundle\Compiler\CannotResolveParameterException异常,信息如下:“类Thrace\FormBundle\Form\Type\Select2Type(服务thrace_form.form.type.select2),参数$widget”。
问题在于Thrace\FormBundle\Form\Type\Select2Type服务的定义中没有显式地定义$widget参数。很可能Thrace\FormBundle的开发者只是忘记定义$widget参数。KutnyAutowiringBundle期望所有服务都有所有参数定义(或具有默认值)。因此,我们必须通过将服务(作为正则表达式)添加到ignored_services中,来禁用thrace_form.form.type.select2服务的自动装配。
kutny_autowiring: ignored_services: ['thrace_form\.form\.type\.select2']
如果您遇到来自Thrace\FormBundle组件(thrace_form.form.type.select2、thrace_form.form.type.recaptcha等)的更多服务问题,您可以使用以下正则表达式轻松地将整个“服务命名空间”添加到ignored_services中。
kutny_autowiring: ignored_services: ['thrace_form\.form\.type.*']
示例 1:简单控制器自动装配
带有服务自动装配的示例控制器(控制器本身也定义为服务)
namespace Acme\DemoBundle\Controller; use Acme\DemoBundle\Facade\ProductsFacade; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; /** * @Route(service="controller.products_controller") */ class ProductsController { private $productsFacade; public function __construct(ProductsFacade $productsFacade) { $this->productsFacade = $productsFacade; } /** * @Route("/", name="route.products") * @Template() */ public function productsAction() { return array( 'products' => $this->productsFacade->getProducts() ); } }
在app/config.yml中的服务配置
services: controller.products_controller: class: Acme\DemoBundle\Controller\ProductsController facade.products_facade: class: Acme\DemoBundle\Facade\ProductsFacade
示例 2:部分手动装配
在以下示例中,我已添加
- $productsPerPageLimit配置选项到ProductsController(必须手动装配)
- 手动使用Doctrine2 EntityManager装配ProductsRepository
<?php namespace Acme\DemoBundle\Controller; use Acme\DemoBundle\Facade\ProductsFacade; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; /** * @Route(service="controller.products_controller") */ class ProductsController { private $productsPerPageLimit; private $productsFacade; public function __construct($productsPerPageLimit, ProductsFacade $productsFacade) { $this->productsPerPageLimit = $productsPerPageLimit; $this->productsFacade = $productsFacade; } /** * @Route("/", name="route.products") * @Template() */ public function productsAction() { return array( 'products' => $this->productsFacade->getProducts($this->productsPerPageLimit) ); } }
<?php namespace Acme\DemoBundle\Facade; use Acme\DemoBundle\Repository\ProductsRepository; class ProductsFacade { private $productsRepository; public function __construct(ProductsRepository $productsRepository) { $this->productsRepository = $productsRepository; } public function getProducts($productsPerPageLimit) { return $this->productsRepository->getProducts($productsPerPageLimit); } }
<?php namespace Acme\DemoBundle\Repository; use Doctrine\ORM\EntityManager; class ProductsRepository { private $entityManager; public function __construct(EntityManager $entityManager) { $this->entityManager = $entityManager; } public function getProducts($productsPerPageLimit) { $query = $this->entityManager->createQueryBuilder() ->select('p') ->from('AcmeDemoBundle:Product', 'p') ->setMaxResults($productsPerPageLimit) ->getQuery(); return $query->getResult(); } }
服务配置:
services: controller.products_controller: class: Acme\DemoBundle\Controller\ProductsController arguments: [10] facade.products_facade: class: Acme\DemoBundle\Facade\ProductsFacade repository.products_repository: class: Acme\DemoBundle\Repository\ProductsRepository arguments: [@doctrine.orm.default_entity_manager]
自动装配组件将自动装配一些服务,以使Symfony DI容器能够根据以下配置工作
services: controller.products_controller: class: Acme\DemoBundle\Controller\ProductsController arguments: [10, @facade.products_facade] facade.products_facade: class: Acme\DemoBundle\Facade\ProductsFacade arguments: [@repository.products_repository] repository.products_repository: class: Acme\DemoBundle\Repository\ProductsRepository arguments: [@doctrine.orm.default_entity_manager]
许可
https://github.com/kutny/autowiring-bundle/blob/master/LICENSE