我正在将Laravel 5.8与AdminLTE for Laravel一起使用。
有几个创建菜单的选项,其中一个是在我使用的提供的配置文件中创建菜单。
您可以在菜单中指定一个active
键,使您可以使菜单具有使菜单项处于活动状态并激活下拉菜单的类。
我有一个菜单项,我想在这些页面上将其激活:
active => ['/posts']
)这些URL不应该匹配:
我不能使用/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存储库中创建了一个问题,因为我怀疑这可能是软件包的问题。
我错过了什么,还是做错了什么?
答案 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进行比较。