[英]Laravel - how to pass a parameter to a route? Is there a better practice?
簡化方案如下:
我在數據庫中有幾頁(理想情況下不超過10-20,但是沒有硬性限制)。 它們都有一些內容和一個“子彈”(如果有的話,有些子彈包含正斜杠)。 我正在嘗試將到這些條的路由注冊到顯示給定頁面內容的PageController
。 這是我對方法的想法:
$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
模式: created
, deleted
, updated
(但前提是塞在更新過程中修改)。
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.