обрабатывать несколько запросов по почте на тот же URL-адрес Laravel 5

У меня есть две формы на странице, и они представляют данные через 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 ) для любой ошибки.