【问题标题】:Using regex to make menu item active in laravel adminlte使用正则表达式在 laravel adminlte 中激活菜单项
【发布时间】:2019-09-29 06:19:03
【问题描述】:

2021: 这实际上是包裹的问题。此后,正则表达式链接匹配已使用我为自己解决的解决方案实施。您可以在文档here 中了解它。


我正在使用 Laravel 5.8 和 AdminLTE for Laravel

有几个选项可以创建菜单,其中之一是在我使用的提供的配置文件中创建它。

您可以在菜单中指定active 键,使菜单具有使菜单项处于活动状态并激活下拉菜单的类。

我有一个菜单项,我想在这些页面上激活它:

  • /posts(与active => ['/posts']一起使用)
  • /posts/{post_id}(id 只是数字)

这些 URL 不应该匹配:

  • /posts/create
  • /posts/anyotherlink
  • /posts/1text

我不能使用/posts/*,因为这会使创建页面和其他一些页面处于活动状态。

The readme 建议您也可以使用正则表达式来执行此操作。我根本不使用正则表达式,但我来到了这个,根据regex101 似乎与我需要的匹配:

^\/posts\/[0-9]+$

我试过这样实现它:

[
    'text'    => 'Posts overview',
    'url'     => '/posts',
    'icon'    => 'list',
    'active'  => ['/posts', '^\/posts\/[0-9]+$'],
    'active'  => ['/posts', '/posts/[^0-9]'] // also tried this
],

不幸的是,这似乎不起作用,因为它不会使菜单项在上面列出的页面上处于活动状态。

编辑:我还在 GitHub 存储库中创建了一个问题,因为我怀疑这可能是包的问题。

我是错过了什么,还是做错了什么?

【问题讨论】:

  • 试试'active' => ['/^\/posts(?:\/\d+)?$/']
  • @WiktorStribiżew 感谢您的建议,但结果保持不变:菜单不亮。我开始认为这可能是 GitHub 上的包的问题。
  • 好吧,我可能只是想指出 PHP 中的正则表达式是用正则表达式分隔符定义的,在大多数情况下添加它们就足够了。此外,'/^\/posts(?:\/\d+)?$/' 正则表达式匹配以/posts 开头并立即在此处结束或具有/ 和1+ 数字后的字符串(可选)。也许一旦你弄清楚如何使正则表达式在这段代码中工作,它会有所帮助。

标签: php regex laravel adminlte


【解决方案1】:

我已经为我的问题创建了一个解决方案,它绝不是最漂亮的解决方案,但它现在可以工作。

我已经编辑了ActiveChecker.php 文件并编辑了checkPattern() 函数,因此如果配置文件中的模式以regex: 开头,它将评估正则表达式。

protected function checkPattern($pattern)
{
    $fullUrlPattern = $this->url->to($pattern);

    $fullUrl = $this->request->fullUrl();

    if(mb_substr($pattern, 0, 6) === "regex:") {

      $regex = mb_substr($pattern, 6);

      if(preg_match($regex, request()->path()) == 1) {
        return true;
      }

      return false;
    }
    return Str::is($fullUrlPattern, $fullUrl);
}

在我的配置文件中,我现在可以这样做,使用正则表达式模式,只需使用 regex: 前缀。

'active'  => ['/suppliers', 'regex:@^posts/[0-9]+$@'],

例如posts/1 的请求路径将与正则表达式进行比较,而不是完整的 URL。

【讨论】:

    【解决方案2】:

    这就是路由命名真正有用的地方。因此,在我的代码中,这条路线将命名为 admin:post.index。然后检查它是否处于活动状态,我可以使用请求助手和一个名为 routeIs() 的方法。

    使用我要使用的名称,这是一个示例:

    request()->routeIs('admin:post.index')
    

    现在,如果我希望此链接在创建、编辑、删除等路由时处于活动状态,我会执行以下操作:

    request()->routeIs('admin:post.*')
    

    这会起作用,因为我按照点符号层次结构应用路由名称。

    如果您想匹配特定的路由,您可以选择为该方法提供多个模式。

    【讨论】:

      【解决方案3】:

      您可以尝试在代码中使用以下模式:

      /^\/posts(\/[0-9]+)?$/
      

      这将适用于以下测试场景:

      /posts
      /posts/3829
      /posts/921
      /posts/1
      

      您可以使用REGEX_Solution上提供的解决方案检查需求

      希望它有效!

      【讨论】:

        【解决方案4】:

        在项目的ActiveChecker.php类中可以找到这段代码

        protected function checkPattern($pattern)
        {
            $fullUrlPattern = $this->url->to($pattern);
        
            $fullUrl = $this->request->fullUrl();
        
            return Str::is($fullUrlPattern, $fullUrl);
        }
        

        根据 laravel 文档,Str::is 不运行正则表达式匹配,但只是支持星号作为通配符。

        在您的情况下,如果给定模式是正则表达式,您可以发布将使用 regexo 的 PR,否则,运行 Str::is

        【讨论】:

        • 我也在考虑这样的事情,但是检查一个字符串是否是一个正则表达式和另一个正则表达式是一种不适用于所有正则表达式的解决方案。另一种解决方案类似于this question 的公认答案。但这对我来说似乎真的很老套。
        • 嘿,我已经打开了pull request 以获得与您建议类似的解决方案,我会奖励您。
        • 谢谢!我看了一下PR,它是好东西。只需修复语法(我猜他们的 CI 不允许在提交中添加空行),然后推动将其合并
        猜你喜欢
        • 1970-01-01
        • 2015-10-04
        • 1970-01-01
        • 2018-08-06
        • 1970-01-01
        • 1970-01-01
        • 2010-11-26
        • 2020-09-14
        相关资源
        最近更新 更多