Это возможно с небольшим количеством пользовательского кода.
По сути, вы хотите переопределить метод контроллера render()
и включить логику для извлечения имени текущего пакета.
Обратите внимание, чтовместо моих контроллеров, расширяющих Symfony\Bundle\FrameworkBundle\Controller\Controller
, они расширяют пользовательский контроллер (который затем расширяет контроллер Symfony).Это позволяет вам удобно предоставлять контроллеру больше возможностей, добавляя свои собственные методы.
Например: MyBundle\Controller\MyController\
extends 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()
не совпадают.