使用正则表达式使Laravel管理中的菜单项处于活动状态

时间:2019-05-11 17:45:23

标签: php regex laravel adminlte

我正在将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存储库中创建了一个问题,因为我怀疑这可能是软件包的问题。

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

4 个答案:

答案 0 :(得分:2)

在项目的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

答案 1 :(得分:0)

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

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

这将适用于以下测试方案:

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

您可以使用REGEX_Solution

上提供的解决方案来检查需求

希望它能起作用!

答案 2 :(得分:0)

这是路由命名真正有用的地方。因此,在我的代码中,该路由将命名为admin:post.index之类的东西。然后,要检查它是否处于活动状态,可以使用请求帮助器和名为routeIs()的方法。

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

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

现在,如果我希望此链接对创建,编辑,删除等路由有效,我将执行以下操作:

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

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

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

答案 3 :(得分:0)

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

我已经编辑了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进行比较。