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

У меня есть две формы на странице, обе отправляют данные через POST method. Я хочу обрабатывать оба запроса по одному и тому же URL-адресу, например /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";
        }

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


person Chaudhry Waqas    schedule 28.08.2015    source источник
comment
Похоже, $_POST['submitPost'] не устанавливается. Попробуйте запустить dd($_POST); в верхней части PostsController@save, а затем отправив ему форму.   -  person Adrian Flannery    schedule 28.08.2015
comment
ничего не выводит.   -  person Chaudhry Waqas    schedule 28.08.2015
comment
Почему вы проверяете $_POST? Вы должны ввести запрос и проверить это тогда. Кроме того, у вас не может быть двух маршрутов с одним и тем же методом на одном маршруте. Лучше пусть он публикует на один маршрут и передает его в задание в зависимости от значения POSTed.   -  person baao    schedule 29.08.2015
comment
@michael, не могли бы вы объяснить немного больше, пожалуйста.   -  person Chaudhry Waqas    schedule 29.08.2015


Ответы (2)


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

person baao    schedule 28.08.2015
comment
спасибо, что познакомили меня с работой, я попробую и дам вам знать. - person Chaudhry Waqas; 29.08.2015
comment
каждый раз, когда я отправляю любую форму, она говорит, что действие не найдено. - person Chaudhry Waqas; 29.08.2015
comment
Вы уверены, что отправляете проверяемые поля? @Адамник - person baao; 29.08.2015
comment
Отредактировал контроллер, попробуйте так пожалуйста. @Adamnick Если это не сработает, попробуйте dd($request) в верхней части метода. - person baao; 29.08.2015
comment
не могли бы вы дать мне ссылку, где я могу узнать больше о вакансиях? - person Chaudhry Waqas; 29.08.2015
comment
большой! Пожалуйста! Вы можете найти больше о вакансиях в документации laravel здесь. Это в разделе событий, но важные части там! @Адамник - person baao; 29.08.2015
comment
У меня проблема, пожалуйста, посмотрите, сможете ли вы ответить. ссылка - person Chaudhry Waqas; 31.08.2015

Если цель состоит только в том, чтобы поддерживать 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-адрес в случае возникновения каких-либо проблем, иначе действие попытается показать пользователю хитрый МАРШРУТ (yoursite.com/message ) при любой ошибке.

person binmosa    schedule 23.09.2017