使用正则表达式在 laravel adminlte 中激活菜单项

Using regex to make menu item active in laravel adminlte

2021: 这实际上是软件包的问题。正则表达式 link 匹配已经通过我创建的解决方案实现了自己解决它。您可以在文档 here.

中阅读相关内容

我正在使用 Laravel 5.8 和 AdminLTE for Laravel

创建菜单有多种选择,其中之一是在我使用的提供的配置文件中创建它。

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

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

这些 URL 不应该匹配:

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

The readme suggest that you can also use regex to do this. I don't use regex at all, but I came to this, which, according tot 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 存储库中创建了一个问题,因为我怀疑这可能是软件包的问题。

我是漏掉了什么,还是做错了什么?

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

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

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

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

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

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

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

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

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

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

您可以在 REGEX_Solution

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

希望有用!

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

的方法

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

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

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

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

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

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

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

我编辑了 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。