Можно ли писать выражения контроллера и шаблона Symfony2 относительно пакета? - PullRequest
4 голосов
/ 06 декабря 2011

Возьмем, к примеру, следующий контроллер / действие:

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'

Но это не то, что мне нужно.

1 Ответ

0 голосов
/ 07 декабря 2011

Это возможно с небольшим количеством пользовательского кода.

По сути, вы хотите переопределить метод контроллера 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() не совпадают.

...