kutny/autowiring-bundle

此包已被放弃,不再维护。未建议替代包。

一个简单的库,为Symfony依赖注入(DI)容器提供自动装配。

安装次数: 39,023

依赖者: 1

建议者: 0

安全: 0

星标: 12

关注者: 2

分支: 4

开放问题: 3

类型:symfony-bundle

1.0.2 2016-02-10 06:06 UTC

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

安装

  1. 通过composer安装
composer require kutny/autowiring-bundle
  1. 将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

Bitdeli Badge