Laravel同時接收路由引數和查詢字串中的引數

kevinyan發表於2019-02-16

Laravel捕捉路由引數

Laravel允許在controller方法中捕捉路由裡定義的引數,如下所示:

路由中定義引數:
Route::get(`post/{id}`, `PostController@content`);

控制器方法裡捕捉路由引數:

class PostController extends Controller
{

    public function content($id)
    {
        //
    }
}

Laravel同時捕獲路由引數和查詢字串引數

那在控制器裡怎麼既能捕捉到路由裡定義的引數又能接收到url查詢字串裡的引數呢,比如請求連結是這樣的http://example.com.cn/post/1?from=index
引用官網文件的解釋

Dependency Injection & Route Parameters

If your controller method is also expecting input from a route parameter you should list your route parameters after your other dependencies.

就是說如果想要在控制器方法注入依賴時仍然能使用路由裡的引數,你需要把路由裡的引數列舉在方法依賴的後面,比如:

<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
class PostController extends Controller
{

    public function content(Request $request, $id)
    {
        $from = $request->get(`from`)
    }
}

Laravel捕獲多個可選引數

此外laravel路由中我們還可以定義多個可選引數:

Route::get(`/article/{id}/{source?}/{medium?}/{campaign?}`, `ArticleController@detail`)

在控制器方法中可選引數需要定義成預設引數:

    public function detail(Request $request, $id, $source = ``, $mediun = ``, $campaign = ``)
    {
        //
    }

這樣定義完後路由裡URL裡可以傳遞0~3個可選引數,但是必須按照順序:即想傳第二個可選引數那麼第一個可選引數必須有。
URL示例:
http://example.com.cn/article/1/wx/h5?param1=val1&param2=val2
在這個例子中"wx"會傳遞給變數$source, "h5"會傳遞給變數$medium

相關文章