1

我正在尝试使用 ezpublish5 为我的页面创建一个菜单。我遵循了本教程http://partialcontent.com/Code/working-with-ez-publish-5-subrequests。我对 Symfony 很陌生,但我有自己的包并在运行,至少它使用的是我自己的 pagelayout.html.twig。

我了解路由的作用,但就我而言,为了创建菜单,我需要其他东西,可能是服务,所以我可以在我的 twig-template 中执行此操作

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

所以我把它添加到我的 my\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 中故意犯语法错误时(同时在模板中省略了对控制器的调用),它不会改变任何东西。我还意识到,当我在 my\Bundle\DependencyInjection\myBundleExtension.php (应该加载我的 services.yml 文件)中执行相同操作时,它也不会发生任何事情。

所以我感觉 bundle-setup 的某些东西是错误的,不知何故并非所有内容都正确加载。但它可能是什么?在 symfony2 的文档中的某处,它说 Bundle\DependencyInjection\xyzExtension.php 中的加载方法会被自动调用。

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

4

1 回答 1

0

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

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

如果它没有被调用,那么您可以更改扩展类名称以满足约定,或者执行我所做的并覆盖您的捆绑类中的约定。

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
于 2013-08-23T14:50:10.170 回答