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

1

У меня есть две формы на странице, и они представляют данные через 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";
        }

Проблема в том, что работает только второй маршрут. Я не делаю, если я поступаю правильно или неправильно. Пожалуйста, отведите меня в правильном направлении.

  • 0
    Похоже, $ _POST ['submitPost'] не устанавливается. Попробуйте запустить dd ($ _ POST); в верхней части PostsController @save сохранить, а затем отправить ему форму.
  • 0
    ничего не выводится.
Показать ещё 2 комментария
Теги:
post
laravel-5.1
laravel-routing

2 ответа

5
Лучший ответ
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() job вы можете делать то, что вы хотели сделать в своем контроллере.

Теперь маршрут, пусть

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

  • 1
    Спасибо, что познакомили меня с работой, я попробую и дам вам знать.
  • 0
    каждый раз, когда я отправляю какую-либо форму, там написано «никаких действий не найдено»
Показать ещё 9 комментариев
1

Если целью является только поддержание 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 ) для любой ошибки.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню