Laravel Routes使用通配符时出现问题

时间:2013-10-17 15:20:00

标签: php 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 pagesController@find
    }
})->where('slug', '.*');

要区分页面和产品是好的,我只会在产品检查的if($ page)之后弹出一个elseif但是我知道如果我确定了如何到达PagesController url指向数据库中的页面。

任何帮助都会受到大力赞赏。

编辑:

我的页面控制器:

class PagesController extends BaseController {

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

我可以在时尚之后开始工作,但这不是我想要的。我需要保持url原样和PagesController来处理页面的处理和呈现。我能让它工作的唯一方法是在路由文件中添加一个Route :: controller('pages','PagesController'),然后将find函数修改为getFind,但最后会得到一个看起来像示例的url。 com / pages / find /而不是原始的url,可能是example.com/about-us的行。

2 个答案:

答案 0 :(得分:2)

试试这个

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

您还可以考虑使用路由过滤器以稍微更易读的方式实现此目的。

答案 1 :(得分:0)

我不知道这是否是超级糟糕的做法,但我能解决这个问题的唯一方法是在routes.php中执行以下操作。

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

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

这基本上得到了url的最后一部分,然后检查我们是否有一个带有该url的页面并为该特定页面添加路由,如果没有,它会检查我们是否有适合url的产品并添加路由对于那个产品。

如果有人有更清洁的解决方案,我很想知道。我无法想象laravel没有一种基于数据库页面创建路由的方法,而不必用“pages / page-url”之类的方式为它们添加前缀。