拉拉维尔路由 使用通配符时出现问题


Laravel Routes Issues when using wildcards

我已经看了很多地方都无济于事,所以我认为是时候请问专家了。

我正在玩拉拉维尔,我在路由方面遇到了一些问题。

我有一个各种各样的CMS和一个产品目录,每个目录都不使用页面前缀。

产品可能是"example.com/my-product",页面可能是"example.com/my-page"

在我的路由中,我想检查 url 是否与页面或产品匹配,或者两者都不匹配,然后重定向到特定的控制器/操作,具体取决于它。

目前我有

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

为了区分页面和产品很好,我只会在产品检查的 if($page) 之后弹出一个 elseif,但是一旦我确定 url 指向数据库上的页面,我就不知道如何访问 PagesController 。

任何帮助将不胜感激。

编辑:

我的页面控制器:

class PagesController extends BaseController {
    public function find()
    {
        echo 'asdaasda'; die;
    }
}

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

试试这个

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

您还可以考虑使用路由筛选器以稍微更具可读性的方式实现此目的。

我不知道

这是否是超级糟糕的做法,但我可以看到解决此问题的唯一方法是在路由中执行以下操作.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"之类的前缀。