【问题标题】:Laravel Routes Issues when using wildcards使用通配符时的 Laravel 路由问题
【发布时间】:2013-10-17 15:20:00
【问题描述】:

我找了好几个地方都无济于事,所以我想是时候问问专家了。

我正在玩 laravel,但我遇到了一些路由问题。

我有一个 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 指向 db 上的一个页面。

任何帮助将不胜感激。

编辑:

我的页面控制器:

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 的东西。

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    试试这个

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

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

    【讨论】:

    • 感谢您,但它给了我一个“未知操作”错误,但页面控制器中有一个“查找”操作。
    • 能否请您也发布您的 PagesController 的代码?
    • @SamParmenter 将 pagesController 更改为 PagesController。我认为它区分大小写。
    • 我早些时候更正了这一点,恐怕它没有任何区别。我看到的所有 CMS 系统都只是将页面添加到所有 url 以解决这个问题,但那是一个非常肮脏的解决方案。我不想要 /pages/about-us 我只想要 /about-us
    • 我有这个:Route::get('test/{token}', function($token){ if($token == 'ok') { return Redirect::action("LoginController@passwordReset"); } })->where('token', '.*'); 在我自己的项目中,它工作正常......你的 routes.php 中还有什么?
    【解决方案2】:

    我不知道这是否是非常糟糕的做法,但我能看到解决此问题的唯一方法是在 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”之类的前缀。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-17
      • 1970-01-01
      • 1970-01-01
      • 2015-10-12
      • 2014-06-29
      • 1970-01-01
      • 2013-05-23
      • 2021-05-12
      相关资源
      最近更新 更多