Допустим, у меня есть 2 контроллера, контент и новости:
class ContentController extends Symfony\Bundle\FrameworkBundle\Controller\Controller {
public function indexAction() {}
}
а также
class NewsController extends ContentController {}
Если представление для indexAction не существует для контроллера новостей (indexAction наследуется от родительского класса), я хочу, чтобы Symfony использовал представление контроллера содержимого (indexAction). Как мне этого добиться?
Symfony всегда пытается отобразить представление News / index.html.php, но если этого представления не существует, я бы хотел, чтобы Symfony отображал Content / index.html.php.
Можно ли сказать движку рендеринга Symfony что-то вроде этого: если существует файл News / index.html.php, возьмите этот, в противном случае возьмите Content / index.html.php
Я использую шаблонный движок PHP, а не веточку.
В настоящее время мы используем Zend Framework, и вы можете просто добавить путь скрипта (просмотра), как описано здесь Просмотр перегрузки в Zend Framework
Надеюсь, я вас правильно понял, и это может решить вашу проблему:
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
}
}
Вы должны настроить маршруты в соответствии с вашими потребностями.
Дополнительный подход в соответствии с просьбой в комментариях:
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
}
}
}
Других решений пока нет …