处理多个帖子请求到同一个网址Laravel 5

时间:2015-08-28 20:31:50

标签: php post laravel-routing laravel-5.1

我在页面上有两个表单都通过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";
        }

问题是只有第二条路线有效。如果我做对或错,我不会。请引导我走向正确的方向。

2 个答案:

答案 0 :(得分: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()方法中,您可以在控制器中执行您想要执行的操作。

现在路线,让我们做

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 :(得分:1)

如果目的只是为了维护浏览器中显示的URL,您可以将提交请求的技巧应用于专门用于处理目的的不同ROUTES,然后重定向回相同的URL。 / p>

例如:

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)任何错误。