devmachine/services-injector-bundle

此软件包已被废弃且不再维护。没有建议的替代软件包。

使用注解在控制器中注入服务。

1.1.0 2017-09-25 08:34 UTC

This package is not auto-updated.

Last update: 2022-02-01 13:10:03 UTC


README

Build Status Coverage Status Scrutinizer Code Quality SensioLabsInsight

SensioFrameworkExtraBundle 的基础上,使用注解将服务注入到控制器中。

2017 更新

从 Symfony 3.3 开始,您可以为控制器参数提供类型提示以接收服务。 阅读更多

序言

在控制器中检索服务的方法有很多。最简单的方法是扩展默认的容器感知控制器 Symfony\Bundle\FrameworkBundle\Controller\Controller,并使用 get('<service-id>') 方法来获取服务。这种方法并不被纯粹主义者所青睐,因为将容器注入视为不良做法(正如他们所说)。建议以与其他服务相同的方式注入控制器依赖项。

然而,这可能会导致过多的注入。例如,Controller#actionOne()Controller#actionTwo() 的需求可能完全不同。有一种方法可以通过实现控制器工具类来减轻这种情况。更多信息请参阅 Doctrine 作者的这篇文章 这里

关于

此软件包试图满足两方面的需求。它将服务定位器作为请求属性注入到控制器中,配置为检索定义的服务集。使用这种方法,无需将容器注入到控制器中,每个操作都可以检索它实际需要的所有服务。

安装

将以下内容添加到您的 composer.json 中

{
    "require": {
        "devmachine/services-injector-bundle": "~1.0"
    }
}

在内核中注册软件包

// app/AppKernel.php

public function registerBundles()
{
    $bundles = array(
        // ...

        new Devmachine\Bundle\ServicesInjectorBundle\DevmachineServicesInjectorBundle(),
    );
}

示例用法

namespace Acme\UserBundle\Controller;

use Devmachine\Bundle\ServicesInjectorBundle\Configuration\Service;
use Devmachine\Bundle\ServicesInjectorBundle\Request\Services;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

/**
 * Inject to all actions.
 *
 * @Service(user_manager="fos_user.user_manager")
 */
class UserController
{
    /**
     * Multiple definitions.
     *
     * @Service("twig")
     * @Service("translator")
     */
    public function indexAction(Services $services)
    {
        $params = [
            // Use explicit service name.
            'title' => $services->get('translator')->trans('users'),

            // Use __call() i.e. same as $services->get('user_manager').
            'users' => $services->getUserManager()->findAll(),
        ];

        return new Response($services->getTwig()->render('AcmeUserBundle:User:index', $params));
    }

    /**
     * Array definition.
     *
     * @Service({"ff"="form.factory", "url_generator"="router", "translator", "twig"})
     */
    public function editAction(Request $request, $username, Services $services)
    {
        $user = $services->getUserManager()->findByUsername($username);
        $form = $services->get('ff')->createForm('acme_user', $user);

        // ...
    }
}