为什么Symfony2(ezpublish5)没有将我的控制器识别为服务?

时间:2013-08-23 11:26:14

标签: php symfony service controller ezpublish

我正在尝试使用ezpublish5为我的页面创建一个菜单。我按照本教程http://partialcontent.com/Code/working-with-ez-publish-5-subrequests进行了操作。 我是Symfony的新手,但我有自己的捆绑并运行,至少它使用我自己的pagelayout.html.twig。

我理解,路由的作用是什么,但就我创建菜单而言,我担心的是我需要其他东西,可能是服务,所以我可以在我的twig-template中做到这一点

{{ render( controller( "myMenuController:myFunction" ) ) }}

所以我将它添加到我的\ Bundle \ Resources \ config \ services.yml

parameters:
    my_root.menucontroller.class: my\Bundle\Controller\MenuController

services:
    my_root.controller:
        class: %my_root.menucontroller.class%
        arguments: [@ezpublish.view_manager]
        calls:
            - [setContainer, [@service_container] ]

    myalias:
        alias: my_root.controller

当我在浏览器中打开它时,它说:

You have requested a non-existent service "myalias".") in "{% extends "Bundle::pagelayout.html.twig" %}

我在github上检查了ezp5安装的其他回购,他们有几乎相同的yml-setup。 我也意识到,当我在services.yml中故意制造语法错误时(在模板中省略对控制器的调用)它不会改变任何东西。 我也意识到,当我在我的\ Bundle \ DependencyInjection \ myBundleExtension.php(它应该加载我的services.yml文件)中做同样的事情时,它也不会发生任何事情。

所以我感觉到bundle-setup的错误,不知道所有东西都没有正确加载。但它可能是什么? 在symfony2的文档中的某处,它表示Bundle \ DependencyInjection \ xyzExtension.php中的load-method被自动调用。

有人会知道我的设置可能出现什么问题吗?我真的没想到了。 对于ezpublish5部分..这真的是现在创建菜单的最佳方式吗?

1 个答案:

答案 0 :(得分:0)

看起来您的服务似乎没有被加载。

Symfony依赖于命名约定来加载xyzExtension.php。它绊了我几次。你可以在xyzExtension.load中粘贴一个die语句来验证它确实被调用了。

如果没有被调用,你可以更改扩展类名称以满足约定或执行我的操作,只是覆盖bundle类中的约定。

namespace Cerad\Bundle\GameV2Bundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

use Cerad\Bundle\GameV2Bundle\DependencyInjection\GameExtension;

class CeradGameV2Bundle extends Bundle
{   
    public function getContainerExtension()
    {
        return new GameExtension();
    }
}

当然xyzExtension应该有类似的东西:

namespace Cerad\Bundle\GameV2Bundle\DependencyInjection;

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

class GameExtension extends Extension
{
    public function load(array $configs, ContainerBuilder $container)
    {
        $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
        $loader->load('services.yml');
    }
    public function getAlias() { return 'cerad_game_v2'; }
}

从命令行,您可以验证您的服务是否已被提取:

app/console container:debug : grep my_root