devmachine / services-injector-bundle
此软件包已被废弃且不再维护。没有建议的替代软件包。
使用注解在控制器中注入服务。
1.1.0
2017-09-25 08:34 UTC
Requires
- php: >=5.4
- sensio/framework-extra-bundle: ~3.0
Requires (Dev)
- doctrine/annotations: ~1.2
- matthiasnoback/symfony-dependency-injection-test: ~0.7
- phpunit/phpunit: ~4.0
- satooshi/php-coveralls: ~0.6
- symfony/finder: ~2.4
This package is not auto-updated.
Last update: 2022-02-01 13:10:03 UTC
README
在 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); // ... } }