簡體   English   中英

Laravel 路由現實生活用例

[英]Laravel routing real life use case

我正在發布 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 

你會怎么做? 我有這些想法。

a. 在檢查 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.
});

通過 for 循環生成數千個 url 然后緩存它?

我很欣賞任何其他偉大的解決方案

我認為最好的方法是將所有這些路由發送到同一個控制器操作並根據發送的參數編輯您的查詢。

例如,這將是您的路由文件:

<?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();

    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM