【问题标题】:Laravel routing varyingLaravel 路由变化
【发布时间】:2015-02-20 07:59:00
【问题描述】:

我有一个如下所示的类别表:

-- id   -- parent_id             -- name
    1             0              electronics
    2             1              Televisions
    3             2             LCD TVs
    4             2             Plasma Tvs
    5             1              DVD Players
    6             1              Bluray Players
    7             0             Home Appliances
    8             7            Cookers
    9             7            Fridges & Freezers
    10            0            Fashion
    11            10            Mens Clothing
    12            11             Shirts
    13            10            Womens Clothing
    14            13            Skirts

等等 - 我遇到的问题是一些类别只有单一的,而其他的可能是 3 或 4 深。

我有一个列表页面,它将对给定类别中的所有项目进行分页,并显示该类别的子类别以便进一步向下钻取,依此类推,直到到达最后一个子类别。

我有 2 个问题 1 是我如何路由它以便匹配 /products/{parent_category}/?if_exists_child_category/if_exists_child_child/if_exists_child_child_child

下一个是在主页上我有特色产品,需要链接到产品页面并包含完整的类别路径 product/parent_cat/if_exists_sub_cat/if_exists_sub_sub_cat/if_exists_sub_sub_sub_cat/product_name * 我知道如何做到这一点一个路由问题是我的主要问题。

或者即使我可以在产品之后捕获所有内容/然后我可以将其分解成一个数组并循环浏览类别,或者找到产品标签并显示正确的视图。

提前谢谢大家,圣诞节快乐:)

【问题讨论】:

  • 这些 URL 段是 id 还是类别名称(用于 SEO)?
  • 是的,它们是用于 SEO 的类别名称,我可以通过它的 slug 拉出产品

标签: php laravel routing


【解决方案1】:

我建议您更改您的 URL,以便它们有一部分用于路由,另一部分用于 SEO。这就是我的意思:

/products/view/{product_id}/{category_name}/{category_name}/{etc}/{product_name}
/products/category/{category_id}/{category_name}/{category_name}/{etc}

这样做的好处是您可以忽略您不会总是拥有相同数量的类别这一事实。您的路由仅取决于 URL 的前几段。

Route::get('products/view/{id}/{seo-slug?}', array('as' => 'product', function($id, $seoSlug){
    $product = Product::find($id);
    // ...
}))->where('seo-slug', '.*');

Route::get('products/category/{id}/{seo-slug?}', array('as' => 'category', function($id, $seoSlug){
    $category = Category::find($id);
    // ...
}))->where('seo-slug', '.*');

现在在生成链接时,您将很难仅使用 Laravel 辅助函数。让我们创建我们自己的。一种方法是向 Product 和 Category 模型添加功能。 (你也可以写一个独立于模型的函数,核心功能保持不变)

产品

public function getUrl(){
    $categoryNames = array('cat1', 'cat2', 'cat3'); // use/create a function on the category model that uses recursion to determine all the categories of the tree
    $seoSlug = implode('/', $categoryNames);
    // ... maybe add other stuff to $seoSlug
    return route('product', array($this->id, $seoSlug));
}

类别

public function getUrl(){
    $categoryNames = array('cat1', 'cat2', 'cat3'); // use the same function as above
    $seoSlug = implode('/', $categoryNames);
    // ... maybe add other stuff to $seoSlug
    return route('category', array($this->id, $seoSlug));
}

重定向“错误”网址

如果需要,您现在可以重定向具有错误 SEO slug 的 URL。这意味着也可以只输入:

/products/view/183

这也可以作为某种 URL 缩短,用于在电子邮件等中发送链接。

要验证 URL 然后重定向,您只需将当前 URL 与“新”生成的 URL 进行比较。像这样:

Route::get('products/view/{id}/{seo-slug?}', array('as' => 'product', function($id, $seoSlug){
    $product = Product::find($id);
    $productUrl = $product->getUrl()
    if(Request::url() !== $productUrl){
        return Redirect::to($productUrl);
    }
    // ...
}))->where('seo-slug', '.*');

哦,也祝你圣诞快乐!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 2019-02-03
    • 2018-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多