Php Laravel-如何将参数传递给路由?有更好的做法吗?

Php Laravel-如何将参数传递给路由?有更好的做法吗?,php,laravel,laravel-5,laravel-5.2,Php,Laravel,Laravel 5,Laravel 5.2,简化方案如下所示: 我在数据库中有几页(理想情况下不超过10-20页,但没有硬限制)。它们都有一些内容和一个“slug”(如果有必要的话,有些slug包含正斜杠)。我正在尝试将这些slug的路由注册到显示给定页面内容的PageController。以下是我对该方法的看法: 注册一条“全部捕获”路线(应该是最后一条注册路线)。这绝对不好 查询数据库中的所有链接并注册到它们的各个路由。这很容易,但我必须查询数据库(这可能不是最优的)并注册数十条,甚至数百条路由 我还尝试了:注册一个HTTP中间件,

简化方案如下所示:

我在数据库中有几页(理想情况下不超过10-20页,但没有硬限制)。它们都有一些内容和一个“slug”(如果有必要的话,有些slug包含正斜杠)。我正在尝试将这些slug的路由注册到显示给定页面内容的
PageController
。以下是我对该方法的看法:

  • 注册一条“全部捕获”路线(应该是最后一条注册路线)。这绝对不好
  • 查询数据库中的所有链接并注册到它们的各个路由。这很容易,但我必须查询数据库(这可能不是最优的)并注册数十条,甚至数百条路由
  • 我还尝试了:注册一个HTTP中间件,通过使用
    $request->path()
    获取查询参数,检查这是否是一个现有的slug,如果是,将其传递给
    页面控制器。我只需调用
    Route::get($request->path(),”即可实现这一点PageController@show)
最后两种方法似乎都有效,但有一个问题:我如何告诉控制器要显示哪个页面?

还是有更好的方法

提前谢谢


编辑:我绝对不想使用“前缀”并将slug作为参数添加到其中。定义的slug应该是页面的准确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');
上述代码应在特定的位置执行,您可以将其附加到
页面
模型:
已创建
已删除
已更新
(但仅当slug在更新过程中被修改时)

3.要访问控制器中的页面详细信息,您只需使用请求的
路径,因为这是您的slug。这样做可以:

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...
}


现在,所有页面都有了路由定义。缓存这些路由的事实减轻了当存在大量路由且仅在对这些路由进行更改时才接触数据库时可能受到的性能损失,不是在每个请求上。

执行页面/id或页面/slug之类的路由,然后通过id或slug@AmirBar:这正是我想要避免的。谢谢,我没有想到缓存路由。这就是路!