簡體   English   中英

Laravel-如何將參數傳遞給路線? 有更好的做法嗎?

[英]Laravel - how to pass a parameter to a route? Is there a better practice?

簡化方案如下:

我在數據庫中有幾頁(理想情況下不超過10-20,但是沒有硬性限制)。 它們都有一些內容和一個“子彈”(如果有的話,有些子彈包含正斜杠)。 我正在嘗試將到這些條的路由注冊到顯示給定頁面內容的PageController 這是我對方法的想法:

  • 注冊一個“全部捕獲”路由(應該是最后注冊的路由)。 這絕對是不好的。
  • 查詢數據庫中的所有鏈接,並注冊指向它們的單個路由。 這很容易,但是我必須查詢數據庫(這可能不是最佳選擇)並注冊數十條(可能數百條)路由。
  • 我還嘗試了以下操作:注冊HTTP中間件,使用$request->path()獲取查詢參數,檢查這是否是現有的子對象,如果是,則將其傳遞給PageController 我可以通過簡單地調用Route::get($request->path(), 'PageController@show')

最后兩種方法似乎都可以使用,但是有一個問題: 我如何告訴Controller分配哪個頁面?

還是有更好的方法?

提前致謝

編輯 :我絕對不想使用“前綴”,並將子彈添加為參數。 定義的段應該是頁面的確切URL。

您列出的所有方法都可能是解決此問題的有效方法(如果在路徑上附加了where條件,則甚至是第一個方法)。 但是,我認為,從性能角度考慮,最好的方法是基於第二種解決方案,並且將在需要時生成路由並將其寫入文件,然后將其緩存。 所以這是我要做的事情:

警告:僅當您沒有任何基於封閉的路線時,此方法才有效

1.創建一個單獨的路由文件,用於存儲頁面路由,例如在app/Http/Routes/page.php 您將在此處編寫頁面的路線定義。 您還需要將其添加到App\\Providers\\RouteServiceProvider類的map方法中:

public function map(Router $router)
{
    $router->group(['namespace' => $this->namespace], function ($router) {
        require app_path('Http/routes.php');
        require app_path('Http/Routes/page.php');
    });
}

2.然后,您需要生成頁面的路由定義並將其寫入該文件。 這樣的事情就足夠了:

$path = app_path('Http/Routes/page.php');
$definition = "Route::get('%s', 'PageController@show');\n";

// Remove the routes file so you can regenerate it
if (File::exists($path)) {
    File::delete($path);
}

// Write the new routes to the file
foreach (App\Page::all() as $page) {
    File::append(sprintf($definition, $page));
}

// Rebuild Laravel's route cache so it includes the changes
Artisan::call('route:cache');

上面的代碼應該在具體執行的事件 ,您可以附加到Page模式: createddeletedupdated (但前提是塞在更新過程中修改)。

3.要訪問控制器中的頁面詳細信息,您只需要使用請求的path ,因為這很麻煩。 所以這樣做:

public function show(Request $request)
{
    // You need to prepend the slash for the condition since
    // the path() method returns the request path without one
    $page = App\Page::where('slug', '/' . $request->path())->get();

    // Do your stuff...
}

到此為止,現在您已為所有頁面定義了路由。 而且,它們被緩存的事實減輕了您在有很多路由時所遭受的性能損失,並且僅在更改這些路由時才觸及數據庫,而不是在每個請求上都如此。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM