В настоящее время я работаю над cms, который построен на основе Laravel 4. Я пытаюсь создать систему плагинов, похожую на Pyro CMS, где виды модулей могут быть включены в представление страницы с использованием системы шаблонов Blade.
Я создаю плагин контактной формы, который, если он будет отправлен успешно, перенаправит пользователя на заданный URL-адрес или просто перенаправит обратно на существующую страницу.
Код для моего класса контактной формы:
class Contact { public static function form($params) { //get params and execute relevant logic here $redirect = isset($params['redirect']) ? $params['redirect'] : Request::url(); $data = Input::all(); if($data) { // Run validation and send message here return Redirect::to($redirect) } return View::make('contact_form_view'); } }
Существует контроллер страницы, который отображает соответствующее представление страницы в зависимости от используемого маршрута, и идея заключается в том, что пользователь может удалить форму контакта в любой шаблон страницы и легко настроить ее, вызвав функцию формы изнутри шаблона, как показано ниже.
<html> <head> </head> <body> {{ Contact::form(array( 'to' => 'myemail@mydomain.com', 'view' => 'contact_form_1', )) }} </body> </html>
Все это отлично работает, кроме перенаправления. Когда форма успешно отправлена и сообщение отправлено, страница обновляется и отображает следующее сообщение вместо контактной формы
HTTP/1.0 302 Found Cache-Control: no-cache Date: Tue, 17 Sep 2013 09:14:16 GMT Location: http://localhost:8888/my_initial_route Redirecting to http://localhost:8888/my_new_route.
Примерно через 2 секунды происходит перенаправление, и браузер перенаправляется на любой маршрут, который пользователь предоставляет в массиве $ params, или на текущую страницу, если не предоставляется перенаправление, как в приведенном выше примере.
Любые предложения относительно того, почему он это делает, а также любые решения, были бы замечательными.
Благодаря!
РЕДАКТИРОВАТЬ:
Вот действительно краткий обзор того, почему я использовал вышеупомянутый подход, который может помочь в понимании проблемы:
Требование проекта состоит в том, что разработчики, которые в конечном итоге будут использовать cms, могут создать неограниченное количество страниц через панель управления cms, нажав кнопку «Добавить страницу». Идея состоит в том, что мы не пишем новые контроллеры страниц для каждой новой страницы, которую мы хотим создать. С этим я имею в виду, что у меня есть следующий маршрут:
Route::any('{page_slug}/page', array('as' => 'frontend.page', 'uses' => 'FrontendPagesController@display_page'))->where('page_slug', '[-A-Za-z0-9_-]+');
Функция display_page
сильно уменьшена:
public function display_page($slug) { $page = PagesModel::getPageBySlug($slug); return View::make($page['view_name']); }
С помощью этих пользователей можно создать страницу одним нажатием кнопки, указать ей имя и пул, а приложение сможет отобразить эту страницу и соответствующее представление, определенное при создании страницы, без необходимости добавлять новые маршруты , контроллеры и т. д.
Проблема возникает в ситуации, когда пользователь хочет включить контактную форму со страницей. Как мы узнаем, добавят ли они форму или нет, какие поля они будут использовать и какую проверку она потребует? Мне нужно, чтобы вы могли добавлять полностью настраиваемую форму контакта на любую страницу без необходимости касаться сенсорного кода cms. Моим решением для этого был подход, приведенный выше: разработчик отбрасывает тэг в представление и передает функции некоторым параметрам, которые настраивают функциональность форм.
Функция Contact::form()
похожа на контроллер для формы. Он получает и возвращает представление, содержащее из html, обрабатывает представление и возвращает сообщения об ошибках / ошибках в зависимости от результата.
Теперь мне не обязательно использовать вышеприведенный подход, но мне нужен способ разделения контроллера контактной формы от контроллера страницы и разработчиков, чтобы иметь возможность добавлять форму на любую страницу, не касаясь кода cms backend.
Любые идеи по этому поводу были бы замечательными.
Вы должны вызвать redirect
с контроллера вместо того, чтобы делать это из представления. Это происходит потому, что вы уже находитесь в поле зрения, и это видно, поэтому, если вы каким-то образом можете сделать это (тело) скрытым, то оно не будет видно до перенаправления.
Но вы делаете это неправильно и anti-pattern
, ИМО. Используйте контроллер для принятия решения, представление должно использоваться только для презентации. Это основное правило в структуре MVC
.
Когда вы вызываете функцию в представлении, она должна возвращать HTML, который затем отображается. Например, когда вы вызываете {{ Url::to('foo') }}
он генерирует http: //yoursite.tld/foo .
Когда вы вызываете {{Contact::form(...)}}
, он должен выводить HTML. Когда вы возвращаете View::make(...)
, вы возвращаете HTML. Когда вы возвращаете Redirect::to(...)
, вы возвращаете объект Laravel, который маршрутизатор Laravel анализирует в заголовке перенаправления.
Перенаправления в значительной степени должны быть вызваны либо объектами маршрута, либо контроллерами. Если у вас есть представление формы, обработанное контроллером, поставьте туда перенаправление.
Просто получил эту же проблему, понижен до «4.0. *», И она исправлена.
Похоже, это проблема 4.1.x.
Шаги по понижению
Измените композитор.json на:
"require": { ... "laravel/framework": "4.0.x", ... }
edit app.php – псевдоним «Контроллер»
'Controller' => 'Illuminate\Routing\Controller',
Должен стать
'Controller' => 'Illuminate\Routing\Controllers\Controller',
И мне пришлось удалить этих поставщиков услуг
'Illuminate\Remote\RemoteServiceProvider', 'Illuminate\Exception\LiveServiceProvider',
РЕДАКТИРОВАТЬ:
Я открыл вопрос об этом в Github, и ранее Тейлор исправил его. Сделайте обновление для композитора, и все будет в порядке.