1

確かにばかげたことですが、私はから登録できませMyServiceMyBundle

src/私/MyBundle/

$ ls -R src/Me/MyBundle/

DependencyInjection/
    MeMyBundleExtension.php
    Configuration.php
Resources/
    config/
        services.yml
Services/
    MyService.php
MyBundle.php

src/Me/MyBundle/DependencyInjection/MeMyBundleExtension.php

namespace Me\MyBundle\DependencyInjection;

// standard stuff

class MeMyBundleExtension extends Extension
{
    public function load(array $configs, ContainerBuilder $container)
    {
        // standard stuff loading the yml file
    }
}

src/Me/MyBundle/DependencyInjection/Configuration.php

namespace Me\MyBundle\DependencyInjection;

use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;

class Configuration implements ConfigurationInterface
{
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder();
        $rootNode = $treeBuilder->root('my_services');

        return $treeBuilder;
    }
}

src/Me/MyBundle/Resources/config/services.yml

services:
    me.myservice:
        class: Me\MyBundle\Services\MyService

src/Me/MyBundle/Services/MyService.php

namespace Me\MyBundle\Services;

class MyService
{
    public function __construct()
    {
        die('test');
    }
}

コントローラーからサービスをインスタンス化しようとすると、サービスが登録されていないことがわかります

$test = $this->get('me.myservice');

存在しないサービス「me.myservice」をリクエストしました

ここに何か問題がありますか?


$ php app/console container:debug | grep me.mybundle

一致するものはありません

4

2 に答える 2

2

src/Me/MyBundle/Resources/config/services.yml

services:
    me.myservice:
        class: Me\MyBundle\Services\MyService.yml

これは、yml ファイルではなくクラスを参照する必要があります。だからそうあるべきだclass: Me\MyBundle\Services\MyService

さらに、名前空間を確認する必要があります。バンドルが子バンドル ( getParent('SonataUserBundle')) でない場合は、クラスを独自の名前空間に配置する必要があります。

src/Me/MyBundle/Services/MyService.php

namespace Me\MyBundle\Services;

src/Me/MyBundle/DependencyInjection/Configuration.php

namespace Me\MyBundle\DependencyInjection;

また、symfony の命名戦略に従ってMyBundle.phpいる必要があります。MeMyBundle.php

于 2013-08-05T10:45:53.057 に答える
0

拡張クラス名がバンドル名から派生する自動マッピングが進行中です。少し前にこれに悩まされました。したがって、私は通常、Bundle クラスで拡張子を明示的に指定するだけです。何かのようなもの:

namespace Cerad\Bundle\AppBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

use Cerad\Bundle\AppBundle\DependencyInjection\AppExtension;

class CeradAppBundle extends Bundle
{
    public function getContainerExtension()
    {
        return new AppExtension();
    }
}   
于 2013-08-05T14:25:05.147 に答える