2016-08-19 60 views
-3

我發佈了Laravel 5.2實際路由使用案例,並希望爲其提供答案。問題:用於多個不同數據庫查找的相同url結構。 請不要發表關於如何使URL結構更簡單的評論,這是結構必須的方式,許多網站在這個部分使用它。Laravel路由實際使用案例

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。檢查網址段後,使用關閉並調用相應的控制器?

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並緩存它呢?

我明白任何其他偉大的解決方案:)

+0

爲什麼downvoting?不明白。 – Kyzo

回答

0

我認爲最好的辦法是將所有這些路線發送到同一個控制器動作,並根據所發送的參數編輯您的查詢。

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

<?php 

Route::get('{slug1}', '[email protected]'); 
Route::get('{slug1}/{slug2}', '[email protected]'); 
Route::get('{slug1}/{slug2}/{slug3}', '[email protected]'); 

在控制器,你可以用雄辯或查詢生成器根據您的路線收到的變量來構建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(); 

    } 

} 
+0

但是住宿細節和AccommodationList +搜索有不同的數據庫表和完全不同的控制器。 – Kyzo