【问题标题】:Optimization suggestions for Laravel routingLaravel 路由优化建议
【发布时间】:2016-10-11 19:24:22
【问题描述】:

我正在创建一个在页面上列出产品的 Laravel 5.1 应用程序。现在数据库中的每个产品都有产品详细信息页面的 url。我已经完成了一个导出所有这些 url 并将它们转换为 laravel 路由的方法,这些路由被写入一个文件并包含在 laravel 路由中。我这样做是为了能够使用 laravel 的 routes:cache 命令优化路由。现在我的问题实际上是关于优化,哪种方式会更好,有一个包含所有路线的文件,比如说 100K 路线,或者有一个入口点来比较数据库中的相关路线并返回相应的产品。

【问题讨论】:

  • 后者。不要创建无数条路线。简化您的路线,让它们包含一个参数,然后您将其用于数据库查找。绝对的。
  • @Here2Help,我不太确定我是否完全同意这一点,向请求添加数据库查找只会增加请求时间,甚至可能对性能有害。也许一堆缓存会对情况有所帮助,但我认为这是个坏主意。
  • @vsharper 数据库查找正是产品驱动型网站应该做的事情。什么,你认为他应该在每次添加新产品时更新他的路线文件?那就干脆建个静态网站吧,忘掉 Laravel 和 PHP。
  • @Here2Help,恰恰相反,我认为下面的答案足以满足我的意思。因此路由将不可避免地将参数传递给将处理请求的控制器,而不是路由。我认为这个问题是在暗示数据库中存储了 100k 条路由,这同样是邪恶的。
  • @vsharper 我不同意你的评论。在网站上,产品的唯一入口点是 CSV 文件导入。每次导入文件时,虚拟路由组件都会将路由添加到站点。

标签: php laravel laravel-5 laravel-5.1 laravel-routing


【解决方案1】:

无需为每种产品设置单独的路线。可能在数据库中存储一个唯一的 slug(语义 URL)?然后有一条路线根据传递给路线的内容显示产品。

用户友好的 slug 可能类似于“t-shirt-9000”。如果您不希望这样,您可以随时使用您已经在数据库中为产品设置的唯一 ID。

在您的 show 方法中,您需要在对数据库的请求中使用 slug 查询数据库。

快速示例:

在 routes.php 中

Route::get('/products/{product}', 'ProductController@show');

产品控制器

public function show($product)
{
    $productRequested = Product::where('url_slug', $product)->first();
    // Do whatever from here
}

【讨论】:

  • 是的!这。除了,您在路由中调用参数product,但在控制器中调用$productRequested。可能想解决这个问题。
  • 是的,我忘了它需要同名。固定!
  • 它不需要命名相同,但最好不要混淆。
  • @AndrewNolan 我同意你的观点,我知道你的方法是最好的有效方法,但客户要求指定指向产品详细信息页面的 url 在 CSV 文件中指定,即用于导入系统上的产品。 url 没有 slug 没有哈希,只有客户端指定的。
【解决方案2】:

您使用框架的事实将强制您优化您的代码

路由文件允许您以最快的方式最小化映射 URL 的数量。

Symfony 为 laravel 提供的路由概念允许您使用单个路由来操作 url 的所有变量,例如:

route::get('{category}/{id}/{slug}/{var1}/{var2}/{var3}/{varX}','yourController@yourMethod');

此路由会将url中的所有变量发送到yourMethod();

【讨论】:

    猜你喜欢
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-26
    • 2016-06-28
    • 2015-02-20
    • 2023-03-28
    • 2016-10-09
    相关资源
    最近更新 更多