【问题标题】:Laravel routing real life use caseLaravel 路由现实生活用例
【发布时间】:2016-12-26 08:09:21
【问题描述】:

我正在发布 Laravel 5.2 现实生活中的路由用例,并希望得到答案。问题:多个不同数据库查找的相同 url 结构。 请不要发表关于如何简化 URL 结构的评论,这是结构必须的方式,许多网站在此段中使用它。

网址结构

domain.com/{slug1}/{slug2}/{slug3} 
// e.g. domain.com/cottages/slovakia/cheap
// {slug1} - DB table accommodation_types (20+)
// {slug2} - DB table locations (300+) 
// {slug3} - DB table accommodation_categories e.g. cheap etc. (100+)

domain.com/{slug1}/{slug2} 
// e.g. domain.com/cottages/cheap OR domain.com/slovakia/cheap
// {slug1} - DB table accommodation_types OR locations  
// {slug2} - DB table locations OR accommodation_categories 

domain.com/{slug}  
// DB table accommodation (10000+ entries)
// or
// accommodation_types OR locations OR accommodation_categories 

你会怎么做呢?我有这些想法。

一个。在检查 url 段后使用闭包并调用适当的控制器?

Route::get('{slug1}', function ($slug1, $slug2 = null, $slug3 = null)
{
    // Check accommodation
    $object = Accommodation::where('slug', $slug1)->first();

    if( !is_null($object) )
    {
        return app()->make('AccommodationDetailController')->view($object);
    }

    // Check type
    $type = AccommodationType::where('slug', $slug1)->first();

    if( !is_null($type) )
    {
        return app()->make('AccommodationListController')->view($type);
    }

    // etc.
});

b.通过for循环生成上千个url然后缓存呢?

我感谢任何其他出色的解决方案

【问题讨论】:

  • 为什么要投反对票?不明白。

标签: php database laravel laravel-5 routes


【解决方案1】:

我认为最好的方法是将所有这些路由发送到同一个控制器操作并根据发送的参数编辑您的查询。

例如,这将是您的路由文件:

<?php

Route::get('{slug1}', 'Controller@getPage');
Route::get('{slug1}/{slug2}', 'Controller@getPage');
Route::get('{slug1}/{slug2}/{slug3}', 'Controller@getPage');

在控制器中,您可以使用 Eloquent 或查询构建器根据您从路由接收到的变量构建 sql 查询。下面是一个简单的例子:

<?php

class Controler {

    public function getPage($slug1, $slug2 = null, $slug3 = null) {

        $models = Model::where(function ($query) use ($slug1) {
            $query->where('accomodation_types', $slug1)
                ->orWhere('location', $slug1);
        })
        ->where(function ($query) use ($slug2) {
            if (isset($slug2)) {
                // Slug2 query
            }
        })
        ->where(function ($query) use ($slug3) {
            if (isset($slug3)) {
                // Slug3 query
            }
        })
        ->get();

    }

}

【讨论】:

  • 但是对于住宿细节和住宿列表+搜索有不同的数据库表和完全不同的控制器。
猜你喜欢
  • 2018-06-17
  • 2018-08-02
  • 1970-01-01
  • 2013-08-25
  • 2020-12-29
  • 2022-01-02
  • 2020-09-09
  • 2014-06-04
  • 2011-12-13
相关资源
最近更新 更多