【问题标题】:Can Symfony2 controller and template expressions be written relative to the bundle?Symfony2 控制器和模板表达式可以相对于捆绑包编写吗?
【发布时间】:2011-12-06 05:01:03
【问题描述】:

以下面的控制器/动作为例:

public function indexAction()
{   
    return $this->render('TestBundle:TestController:index.html.twig');
}

我想以这种方式编写模板表达式(或任何名称):

public function indexAction()
{   
    return $this->render('*:TestController:index.html.twig');
}

这样 symfony 就知道我正在寻找这个包中的模板。必须为我要引用的每个模板/操作/存储库编写整个 Owner + Bundle 非常烦人。考虑到大多数时候我在同一个包中引用动作和模板,更是如此。

注意:我知道模板可以放在应用程序级别并像这样引用:

'::index.html.twig'

但这不是我需要的。

【问题讨论】:

    标签: php symfony bundle


    【解决方案1】:

    可以使用一些自定义代码。

    基本上,您希望覆盖控制器的 render() 方法并包含获取当前捆绑包名称的逻辑。

    请注意,我的控制器不是扩展Symfony\Bundle\FrameworkBundle\Controller\Controller,而是扩展了一个自定义控制器(然后扩展了 Symfony 的控制器)。这允许您通过添加自己的方法方便地为控制器提供更多功能。

    例如: MyBundle\Controller\MyController\ 扩展 MyCustomBaseController 扩展 Symfony\Bundle\FrameworkBundle\Controller\Controller

    所以,在我的自定义控制器中,我有以下两种方法:

    public function render($view, array $parameters = array(), Response $response = null) {
        $currentBundle = $this->getCurrentBundle();
        $view = str_replace('*', $currentBundle, $view);
        return parent::render($view, $parameters, $response);
    }
    
    public function getCurrentBundle() {
        $controller = $this->getRequest()->attributes->get('_controller');
        $splitController = explode('\\', $controller);
        return $splitController[1];
    }
    

    看看render()。它获取当前包名称并使用它来构建$view 变量。然后它只调用parent::render(),就好像您在渲染语句中手动定义了包名称一样。

    这里的代码很简单,所以你应该可以很容易地扩展它来做其他事情,比如让你也可以避免输入控制器名称。

    重要提示:如果您使用自定义控制器,请确保您使用use Symfony\Component\HttpFoundation\Response,否则 PHP 会抱怨 render() 的方法签名不匹配。

    【讨论】:

    • 是的,我想我必须制作这样的东西。虽然解决方案很好,但如果框架默认为所有类型的引用(不仅仅是视图模板)执行类似的操作,那就太好了。捆绑包会干净得多。
    • 没有理由你不能修改其他方法来使用我上面的getCurrentBundle() 方法:) 我已经使用了一个快捷方式getRepository() - 使用getCurrentBundle() 可以很容易地变得更干净。
    • 当然可以,如果制作 symfony 的人内置了这个功能就更好了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    相关资源
    最近更新 更多