У меня есть две формы на странице, и они представляют данные через POST method
. Я хочу обрабатывать оба запроса на одном и том же URL-адресе ie / home и использовать разные контроллеры и методы для обеих форм. Ниже приведены два маршрута.
Route::post('home' ,'FacebookControllers\PostsController@save'); Route::post('home' , 'FacebookControllers\MessageController@storeMessage');
В PostsController@save
я проверяю
if(isset($_POST['submitPost']) && $_SERVER['REQUEST_METHOD']=='POST'){ //do something }
и в MessageController@storeMessage
я делаю то же самое для другой формы
if(isset($_POST['sendMessage']) && $_SERVER['REQUEST_METHOD']=='POST'){ return "got it"; }
Проблема в том, что работает только второй маршрут. Я не делаю, если я поступаю правильно или неправильно. Пожалуйста, отведите меня в правильном направлении.
Route::post('home' ,'FacebookControllers\PostsController@save'); Route::post('home' , 'FacebookControllers\MessageController@storeMessage');
не будет работать – как должен laravel определить, куда отправлять? То, как я пойду, – создать два задания и один маршрут, затем проверить значение в Request
и отправить правильную работу.
Сначала создайте два класса работы с
php artisan make:job FacebookSave php artisan make:job FacebookStoreMessage
Сгенерированный файл будет выглядеть примерно так:
<?php namespace App\Jobs; use App\Jobs\Job; use Illuminate\Contracts\Bus\SelfHandling; class FacebookSaveMessage extends Job implements SelfHandling { /** * Create a new job instance. * * @return void */ public function __construct() { // } /** * Execute the job. * * @return void */ public function handle() { // } }
В методе handle()
задания вы можете делать то, что вы хотели сделать в своем контроллере.
Теперь маршрут, давайте сделаем
Route::post('home' ,'FacebookControllers\PostsController@findAction');
и в соответствии с этим в вашем PostsController добавьте метод (я назвал его findAction) следующим образом:
public function findAction(\Illuminate\Http\Request $request) { if ($request->has('submitPost')) { return $this->dispatch(new \App\Jobs\FacebookSave($request)); } else if ($request->has('storeMessage')) { return $this->dispatch(new \App\Jobs\FacebookStoreMessage($request)); } return 'no action found'; }
Таким образом, правильное действие будет выполнено в зависимости от представленного значения.
Измените конструктор задания на что-то вроде:
public function __construct($data) { $this->data = $data; }
И вы можете получить доступ к представленным значениям из форм, которые вы отправили внутри метода handle()
задания, с помощью $this->data
Если целью является только поддержание URL-адреса, отображаемого в браузере, вы можете применить трюк, в котором вы отправляете свой почтовый запрос различным маршрутам, которые специально существуют для целей обработки, а затем перенаправлять обратно на тот же URL-адрес.
Например:
Route::post('home' ,'FacebookControllers\PostsController@save'); Route::post('message' , 'FacebookControllers\MessageController@storeMessage');
Тогда, на ваш взгляд, у вас может быть две разные формы в одном представлении:
<!-- the first form --> <form action="{{url('home')}}" method="post"> Enter your post: <input type="text" name="post" /> <button type="submit" >Save</button> </form> <!-- the second form --> <form action="{{url('message')}}" method="post"> Enter your post: <input type="text" name="post" /> <button type="submit" >Save</button> </form>
Теперь в вашем контроллере в обоих действиях сделайте что-то вроде:
public function save(Request $request) { // do stuff $obj->save() return redirect('home')->with('status' , 'you have saved your post') } public function storeMessage(Request $request) { // do stuff $obj->save() return redirect('home')->with('status' , 'your message has been saved') }
Таким образом, URL-адрес останется таким же для пользователя, после того как процесс будет выполнен, пользователь будет перенаправлен обратно на тот же URL-адрес со статусом.
Может быть, это не хорошая практика кодирования, но она решает проблему, поддерживая один и тот же URL-адрес, имея несколько сообщений на одном и том же контроллере в одном представлении.
Самый важный момент здесь заключается в том, что вы должны строго предотвращать ошибку во время процесса, используя условия и перенаправлять на тот же URL-адрес в случае каких-либо проблем, иначе действие попытается показать пользователю сложный ROUTE (yoursite.com/message ) для любой ошибки.