【问题标题】:Symfony 3 view overloading for controller inheritanceSymfony 3 视图重载控制器继承
【发布时间】:2019-04-23 20:35:31
【问题描述】:

假设我有 2 个控制器,内容和新闻:

class ContentController extends Symfony\Bundle\FrameworkBundle\Controller\Controller {
  public function indexAction() {}
}

class NewsController extends ContentController {}

如果新闻控制器的 indexAction 视图不存在(indexAction 继承自父类),我希望 Symfony 使用 Content 控制器的视图(indexAction)。我怎样才能做到这一点? Symfony 总是尝试渲染视图 News/index.html.php 但如果这个视图不存在我希望 Symfony 渲染 Content/index.html.php。

是否可以告诉 Symfony 渲染引擎这样的事情:如果存在文件 News/index.html.php 取这个,否则取 Content/index.html.php

我使用的是 PHP 模板引擎,而不是 Twig。

我们目前正在使用 Zend 框架,您可以简单地添加一个脚本(视图)路径,如此处所述View overloading in Zend Framework

【问题讨论】:

  • “未找到视图”您的意思是未找到路线? “脚本路径”是什么意思?
  • 不,我的意思是意见。例如。 NewsController indexAction 没有 index.html.php 视图,但 ContentController 中存在 index.html.php 视图和操作。脚本路径是视图所在的位置(例如资源/视图)。 NewsController 的视图位于 app\Resources\views\News 下,ContentController 位于 app\Resources\views\Content
  • 您能否编辑您的问题并添加一个示例操作及其路由配置?
  • 我已经编辑了我的问题。你现在明白我想要达到的目标了吗?
  • 在大多数情况下,一个动作会渲染一个模板,并且可以调用一个路由。您能否使用您所说的两个indexActions 的代码再次编辑您的问题?否则,您可以检查模板是否以file_exists php.net/manual/de/function.file-exists.php 退出?

标签: php symfony view templating templating-engine


【解决方案1】:

我希望我能正确理解你,这可以解决你的问题:

class ContentController extends Symfony\Bundle\FrameworkBundle\Controller\Controller
{
    /**
     * @Route("/", name="content_index")
     */
    public function indexAction()
    {
        // render Content/index.html.php
    }
}

class NewsController extends ContentController
{
    /**
     * @Route("/news", name="content_news_index")
     */
    public function indexAction()
    {
        parent::indexAction();

        // render News/index.html.php
    }
}

您必须根据需要调整路线。


cmets 中要求的其他方法:

use Symfony\Component\HttpFoundation\Request;

class ContentController extends Symfony\Bundle\FrameworkBundle\Controller\Controller
{
    /**
     * @Route("/", name="content_index")
     * @Route("/news", name="content_news_index")
     */
    public function indexAction(Request $request)
    {
        $routeName = $request->get('_route');

        if ($routeName === 'content_index') {
            // render Content/index.html.php
        } elseif ($routeName === 'content_news_index') {
            // render News/index.html.php
        }        
    }
}

【讨论】:

  • 我正在寻找一种解决方案,我不必从父类中“复制”所有方法。
  • @SebastianSchmidt 我在答案中添加了另一个解决方案,也许这就是你想要的?
  • 我遇到了和@SebastianSchmidt 一样的问题。我将 Symfony 4 与 FOSRest 一起使用。我有一个捆绑包(我通过 Composer 包含),其中包含 GET / (cgetAction) POST / (postAction) 的可重用功能,但 Symfony 4 没有找到这些路由
猜你喜欢
  • 1970-01-01
  • 2014-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
相关资源
最近更新 更多