Маршрутизация на встроенные модули / комплекты / контроллеры в Symfony 2 - PullRequest
2 голосов
/ 19 октября 2011

Я полностью отредактировал этот пост после проведения исследования:

Я хотел бы реализовать боковую панель в разделе администратора, которая встроена в каждую страницу, например http://mydomain.com/admin/index/:

class MyController extends Controller {

    protected $modules = array();

    public function __construct(){
        $this->modules[] = "ModuleController:mainAction";
        $this->modules[] = "OtherModuleController:mainAction";
    }

    public function indexAction(Request $request){
        // do stuff here
        return $this->render("MyBundle:My:index.html.twig",$data);
    }
}

В представлении должно произойти что-то вроде:

{% block modules %}
    {% for module in modules %}
        {% render module %}
    {% endfor %}
{% endblock %}

Пока все хорошо, но эти модули могут содержать формы, которые отправляют почтовые запросы.Я хотел бы остаться на той же странице (http://mydomain.com/admin/index/),, чтобы атрибут действия формы оставался пустым. Проблема в том, что почтовый запрос никогда не будет распознаваться модулями. Поэтому одной из идей было скрыть поле в соответствииФорма, содержащая название маршрута, преобразуйте его в соответствующий URI и отправьте дополнительный запрос (в MyController):

public function indexAction(Request $request){
    if($request->request->has('hidden_module_route')){
        // collect all parameters via $request->request->keys()
        $uri = $router->generate($request->request->get('hidden_module_route'), $parameters);
        // 1: resolve the uri to the according controller and replace the target in the $this->modules array
        // or 2: (after step 1)
        $req = $request->create($uri, 'POST');
        $subresponse = $this->get('kernel')->handle($req,HttpKernelInterface::SUB_REQUEST);
        // inject the response into the modules and handle it in the view
    }
    [...]
}

Это будет работать для меня, но я не рад, что эти обязанностив контроллере, и кажется, что должно быть лучшее решение (одна из идей - зарегистрировать слушатель kernel.controller, который обрабатывает подзапросы и внедряет пути к контроллеру (который, возможно, помечен через интерфейс ...)).*

Что вы думаете? Спасибо за ваши ответы заранее, я ценю вашу помощь.

1 Ответ

1 голос
/ 08 июля 2012

Вы можете попытаться отправить основной запрос вашим модулям, чтобы они могли связать с ним форму.

{% block modules %}
    {% for module in modules %}
        {% render module with {'mainRequest': app.request} %}
    {% endfor %}
{% endblock %}

И модуль:

public function moduleAction(Request $request, Request $mainRequest)
{
    $form = ...;
    if ($mainRequest->isMethod('POST')) {
        $form->bindRequest($mainRequest);
        if ($form->isValid()) {
            // You can have a beer, that worked
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...