2011-11-29 90 views
20

我在config.yml移動Symfony2的服務配置捆綁

services: 
    my.user_provider: 
     class: Acme\MySecurityBundle\Security\UserProvider 

以下,但想動這在我MySecurityBundle/Resources/config到config.yml但Symfony2的告訴我,該服務不存在時我動它。

如何從中獲取config.yml文件?

回答

38

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'); 
    } 
} 

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

services: 
    my_security.user_provider: 
     class: Acme\MySecurityBundle\Security\UserProvider 
+0

這解決了我的問題。非常感謝。 –

21

我完成了這一由app/config.yml引用它作爲一個進口:

imports: 
    - { resource: "@MySecurityBundle/Resources/config/services.yml" } 
+3

這是我以前做的,但我正在尋找一種方法來定義服務,而無需更改app/config.yml。謝謝回答! –

+0

這應該是被接受的答案。 – giannisf

+0

在symfony3.4中工作。謝謝:) – Makubex

16

你需要在包稱爲「擴展」,告訴Symfony的做什麼加載軟件包時,創建一個類。命名約定有點奇怪。對於Acme \ MySecurityBundle,該類將被命名爲AcmeMySecurityExtension。它位於{bundlepath}/DependencyInjection中。

這裏是我的一個示例(我加載資源/配置/ 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'); 
    } 
}