使用Regex使Laravel Adminlte中活动菜单项



2021: 这实际上是包装的问题。此后,将Regex链接匹配与我创建的解决方案实现,以便自己解决。您可以在此处的文档中阅读有关它的信息。


我正在将Laravel 5.8与Adminlte一起用于Laravel。

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

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

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

  • /帖子(使用active => ['/posts'](
  • /posts/{post_id}(id是数字(

这些URL不应匹配:

  • /posts/create
  • /posts/Anyotherlink
  • /posts/1Text

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

读书我建议您也可以使用正则表达式来执行此操作。我根本不使用Regex,但我来了,这是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.php类中,您可以找到此代码

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

基于Laravel文档,Str::is不运行REGEXP匹配,但Juss支持通配符的星号。

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

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

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

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

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

您可以在Regex_solution上使用提供的解决方案

检查要求

希望它有效!

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

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

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

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

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,将获得与正则un相比,而不是完整的URL。

最新更新