2013-10-17 29 views
0

我看了很多地方無濟於事,所以我認爲是時候請專家了。Laravel路線使用通配符時的問題

我在玩laravel,我在路由方面遇到了一些問題。

我有各種各樣的cms和一個產品目錄,每個目錄都不使用頁面的前綴。

的產品可能是「example.com/my-product」和頁面可能是「example.com/my-page」

在我的路線我要檢查,如果網址相符的網頁或產品或不是,然後重定向到一個特定的控制器/操作取決於它是。

目前我有

Route::any('/{slug}', function($slug) { 
    $page = App\Models\Page::firstByAttributes(['slug' => $slug]); 
    if($page) { 
    // go to [email protected] 
    } 
})->where('slug', '.*'); 

要和頁面之間的區分產品是好的,我就彈出如果($頁)後ELSEIF的產品檢查,但我難倒就如何一旦我確定url指向db上的一個頁面,就進入PagesController。

任何幫助將大規模讚賞。

編輯:

我的頁面控制器:

class PagesController extends BaseController { 

    public function find() 
    { 
     echo 'asdaasda'; die; 
    } 
} 

我能得到這個時尚後的工作,但它不是我想要的。我需要url保持原樣,並且需要PagesController來處理頁面的處理和呈現。唯一能讓它工作的方法是在路由文件中添加一個Route :: controller('pages','PagesController'),然後將find函數修改爲getFind,但最後只是一個看起來像example的url。 com/pages/find /而不是可能是example.com/about-us行的原始URL。

回答

1

試試這個

Route::any('/{slug}', function($slug) { 
    $page = App\Models\Page::firstByAttributes(['slug' => $slug]); 
    if($page) { 
     return Redirect::action('[email protected]', array($page)); 
    } 
})->where('slug', '.*'); 

您也可以考慮使用路由過濾器在一個稍微更可讀的方式來實現這一目標。

+0

感謝這一點,但它給了我一個「未知動作」錯誤,但在頁面控制器中有一個「查找」動作。 –

+0

您可以發佈您的PagesController的代碼嗎? –

+0

@SamParmenter使用PagesController更改pagesController。我認爲這是區分大小寫的。 –

0

我不知道這是否是超級糟糕的做法,但我可以看到解決此問題的唯一方法是在routes.php中執行以下操作。

$url = \URL::current(); 
$url = explode('/', $url); 
$end = end($url); 

if($page = App\Models\Page::firstByAttributes(['slug' => $end])) { 
    Route::get('/'.$end, '[email protected]'); 
} elseif($product = App\Models\Product::firstByAttributes(['slug' => $end])) { 
    Route::get('/'.$end, '[email protected]'); 
} 

這基本上得到URL的最後一部分,然後再檢查,如果我們有與該網址的網頁,並添加路由針對特定頁面,如果不是,它會檢查,如果我們有適合的URL產品並添加該產品的路線。

如果有人有更清潔的解決方案,我很想知道。我無法想象laravel沒有基於數據庫頁面創建路線的方法,而無需將其全部加上「pages/page-url」之類的前綴。