首页 文章

Symfony2将控制器连接到树枝模板

提问于
浏览
1

所以我对symfony(以及一般的MVC框架)都是全新的,所以我需要一个完整的初学者来回答我的问题 .

基本上,我已经设置了一个控制器来向当前页面的导航元素添加一个类 . 至少在理论上我有,实际上我得到以下异常错误:

在渲染模板期间抛出异常(“控制器必须在”myNewBundle:Page:text-elements.html.twig中返回响应(给定文本元素) . “) .

我认为问题(或至少部分问题)是控制器已经与模板分离 . 所以它不知道它被调用的页面是否是当前的 .

这是我的控制器的内容:

<?php

namespace my\NewBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;

/**
* @Template("myNewBundle::definitions.html.twig")
*/

class NavController extends Controller
{
    public function renderNavAction($target='/usage', $text='Insert Link')
    {
        $output = '<a href="' . $this->generateUrl($target) . '" ';
        if ($this->getRequest()->get('_route') == $target) $output .= 'class="active"';
        $output .= '>' . $text . '</a>';
        return $output;
    }
}

这是枝条模板的一部分,应该将其渲染出来:

<ul>
   <li>{{ render(controller('myNewBundle:Nav:renderNav', { 'target': 'my_new_textElements', 'text' : 'Text elements' })) }}</li>                
   <li>{{ render(controller('myNewBundle:Nav:renderNav', { 'target': 'my_new_buttons', 'text': 'Buttons' })) }}</li>                
   <li>{{ render(controller('myNewBundle:Nav:renderNav', { 'target': 'my_new_forms',  'text': 'Forms' })) }}</li>                
   <li>{{ render(controller('myNewBundle:Nav:renderNav', { 'target': 'my_new_lists', 'text': 'Lists' })) }}</li>                
   <li>{{ render(controller('myNewBundle:Nav:renderNav', { 'target': 'my_new_tables', 'text': 'Tables' })) }}</li>                
   <li>{{ render(controller('myNewBundle:Nav:renderNav', { 'target': 'my_new_searchBoxes', 'text': 'Search Boxes' })) }}</li>               
   <li>{{ render(controller('myNewBundle:Nav:renderNav', { 'target': 'my_new_pods', 'text': 'Reusable Pods' })) }}</li>
</ul>

有人可以让我知道我做错了什么吗?注意:模板注释部分是我在尝试自行解决问题时添加的内容 . 如果没有必要,那么我很乐意删除/改变它 .

1 回答

  • 2

    在symfony书中仔细阅读Controller章节 . 控制器始终必须返回Response对象 .

    public function renderNavAction($target='/usage', $text='Insert Link')
    {
        $output = '<a href="' . $this->generateUrl($target) . '" ';
        if ($this->getRequest()->get('_route') == $target) $output .= 'class="active"';
        $output .= '>' . $text . '</a>';
        $response->setContent($output);
        $response->setStatusCode(200);
        $response->headers->set('Content-Type', 'text/html');
        return $response;
    }
    

    但在你的情况下更好地制作macro或只是包含另一个带有参数的模板 .

相关问题