将Symfony2服务配置移动到捆绑包

jos*_*erk 21 symfony

我在config.yml中有以下内容

services:
    my.user_provider:
        class: Acme\MySecurityBundle\Security\UserProvider
Run Code Online (Sandbox Code Playgroud)

但我想把它移到我的config.yml MySecurityBundle/Resources/config但是Symfony2告诉我,当我移动它时该服务不存在.

如何让它config.yml从那里拿起文件?

Eln*_*mov 40

src/Acme/MySecurityBundle/DependencyInjection/MySecurityExtension.php:

<?php
namespace Acme\MySecurityBundle\DependencyInjection;

use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
use Symfony\Component\Config\FileLocator;

class MySecurityExtension extends Extension
{
    public function load(array $configs, ContainerBuilder $container)
    {
        $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
        $loader->load('services.yml');
    }
}
Run Code Online (Sandbox Code Playgroud)

src/Acme/MySecurityBundle/Resources/config/services.yml:

services:
    my_security.user_provider:
        class: Acme\MySecurityBundle\Security\UserProvider
Run Code Online (Sandbox Code Playgroud)


Tho*_*ley 21

我通过引用它作为导入来完成此操作app/config.yml:

imports:
    - { resource: "@MySecurityBundle/Resources/config/services.yml" }
Run Code Online (Sandbox Code Playgroud)

  • 这是我以前做的,但我正在寻找一种方法来定义服务,而无需更改app/config.yml.谢谢回答! (3认同)

小智 16

您需要在该捆绑中创建一个名为"扩展"的类,它告诉Symfony在加载捆绑包时要做什么.命名约定有点奇怪.对于Acme\MySecurityBundle,该类将命名为AcmeMySecurityExtension.它位于{bundlepath}/DependencyInjection中.

这是我的一个例子(我正在加载Resources/config/services.xml):

<?php

namespace Acme\MySecurityBundle\DependencyInjection;

use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;

/**
 * This class is automatically discovered by the kernel and load() is called at startup.
 * It gives us a chance to read config/services.xml and make things defined there available for use.
 * For more information, see http://symfony.com/doc/2.0/cookbook/bundles/extension.html
 */
class AcmeMySecurityExtension extends Extension
{
    /**
     * Called by the kernel at load-time.
     */
    public function load(array $configs, ContainerBuilder $container)
    {
        /*@var XmlFileLoader*/
        $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
        $loader->load('services.xml');
    }
}
Run Code Online (Sandbox Code Playgroud)