如何覆盖symfony2核心FrameworkBundle?

时间:2014-04-22 17:00:07

标签: php symfony core

我试图覆盖位于vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Routing/Router.php的Symfony2路由器

我已经关注了这个tutorial,并且我创建了自己的捆绑包并在AppKernel.php中注册了它。

<?php
// src/My/SymfonyBundle/MySymfonyBundle.php

namespace My\SymfonyBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class MySymfonyBundle extends Bundle
{
    public function getParent()
    {
        // die('test');
        return 'FrameworkBundle';
    }
}

这么胖都好。我的包已被识别(通过在上面的函数中尝试die('test');进行测试)

比我创建了我的扩展版Symfony2路由器

<?php
// src/My/SymfonBundle/Routing/Router.php

namespace My\SymfonyBundle;

use Symfony\Bundle\FrameworkBundle\Routing\Router as BaseRouter;

die('test');

class Router extends BaseRouter
{}

但它被忽略了。我希望看到我的调试test消息,但我的覆盖文件根本没有加载。

我也看过这个question,但我看起来并不清楚。

如何正确覆盖Symfony2核心包(vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Routing/Router.php)或核心组件(vendor/symfony/symfony/src/Symfony/Component/Routing/Router.php)?

1 个答案:

答案 0 :(得分:0)

你太难了。

如果您想要做的就是插入自己的路由器类,那么在app / config / parameters.yml中添加:

router.class: My\SymfonyBundle\Router

基本上,所有框架类都可以这种方式重写。看一眼 供应商/ symfony的/ symfony的/ SRC / Symfony的/捆绑/ FrameworkBundle / Resouces /配置/ routing.xml

不要使用getParent方法。它不是你想象的那样。

=============================================== =======

更新以响应有关getParent信息的请求。

getParent在此处记录:http://symfony.com/doc/current/cookbook/bundles/inheritance.html

它允许您从父包中覆盖有限数量的文件。它真的是为调整第三方捆绑包而设计的。我试图使用它并且倾向于避免使用它时非常困惑。

=============================================== =======

最后一点说明:我建议将routers.class添加到parameters.yml,因为这是最容易使用的文件。但它确实应该放在My \ SymfonyBundle \ Resources \ config \ services.yml的参数部分,假设您正在加载服务文件。