Я полностью отредактировал этот пост после проведения исследования:
Я хотел бы реализовать боковую панель в разделе администратора, которая встроена в каждую страницу, например 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
, который обрабатывает подзапросы и внедряет пути к контроллеру (который, возможно, помечен через интерфейс ...)).*
Что вы думаете? Спасибо за ваши ответы заранее, я ценю вашу помощь.