Php 使用正则表达式使菜单项在laravel adminlte中处于活动状态

Php 使用正则表达式使菜单项在laravel adminlte中处于活动状态,php,regex,laravel,adminlte,Php,Regex,Laravel,Adminlte,我用的是Laravel5.8 有几个选项可以创建菜单,其中之一是在我使用的配置文件中创建菜单 您可以在菜单中指定一个active键,使菜单具有激活菜单项并激活下拉列表的类 我有一个菜单项,我想在这些页面上激活它: /帖子(与活动=>['/posts']一起使用) /posts/{post_id}(id仅为数字) 这些URL不应匹配: /发布/创建 /帖子/任何其他链接 /帖子/1文本 我不能使用/posts/*,因为这样会使创建页面和其他一些页面处于活动状态 建议您也可以使用正则表达式来

我用的是Laravel5.8

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

您可以在菜单中指定一个
active
键,使菜单具有激活菜单项并激活下拉列表的类

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

  • /帖子(与
    活动=>['/posts']
    一起使用)
  • /posts/{post_id}(id仅为数字)
这些URL不应匹配:

  • /发布/创建
  • /帖子/任何其他链接
  • /帖子/1文本
我不能使用
/posts/*
,因为这样会使创建页面和其他一些页面处于活动状态

建议您也可以使用正则表达式来完成此操作。我根本不使用正则表达式,但我想到了这一点,根据tot的说法,这似乎符合我的需要:

^\/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匹配,但justs支持通配符的星号


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

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

/^\/posts(\/[0-9]+)?$/
这将适用于以下测试场景:

/posts
/posts/3829
/posts/921
/posts/1
您可以使用上提供的解决方案检查需求


希望它能起作用

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

使用我将使用的名称,下面是一个示例:

request()->routeIs('admin:post.index'))
现在,如果我想为创建、编辑、删除等路线激活此链接,我将执行以下操作:

request()->routeIs('admin:post.*')
这将起作用,因为我应用了遵循点表示法层次结构的路由名称


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

我已经为我的问题创造了一个解决方案,它绝不是最漂亮的解决方案,但它会起作用,就目前而言

我已经编辑了
ActiveChecker.php
文件并编辑了
checkPattern()
函数,因此如果配置文件中的模式以
regex:
开头,它将计算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:
前缀即可使用regex模式

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

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

尝试
'active'=>['/^\/posts(?:\/\d+?$/']
@WiktorStribiżew感谢您的建议,但是结果仍然是一样的:菜单没有亮起。我开始认为这可能是GitHub上的包的问题。好吧,也许,我只是想指出PHP中的regexp是用regex分隔符定义的,在大多数情况下添加它们就足够了。另外,
'/^\/posts(?:\/\d+?$/'
正则表达式匹配一个字符串,该字符串以
/posts
开头,并立即在此处结束,或者后面有
//code>和1+个数字(可选)。也许一旦你弄明白如何让正则表达式在这段代码中工作,它会很有帮助。我也在考虑类似的事情,但是用另一个正则表达式检查一个字符串是否是正则表达式是一个解决方案,它不会适用于所有正则表达式。另一个解决方案类似于被接受的答案。但对我来说,这似乎真的很难。嘿,我已经为一个类似于你建议的解决方案打开了一个窗口,我将奖励你奖金。谢谢!我看了一下公共关系,这是很好的东西。只需修复语法(我想他们的CI不允许在提交中添加空行),然后推动合并即可