使用正则表达式在 laravel adminlte 中激活菜单项
Using regex to make menu item active in laravel adminlte
2021: 这实际上是软件包的问题。正则表达式 link 匹配已经通过我创建的解决方案实现了自己解决它。您可以在文档 here.
中阅读相关内容
我正在使用 Laravel 5.8 和 AdminLTE for Laravel。
创建菜单有多种选择,其中之一是在我使用的提供的配置文件中创建它。
您可以在菜单中指定一个 active
键,使菜单具有 class,使菜单项处于活动状态并激活下拉菜单。
我有一个菜单项,我想在这些页面上激活它:
- /posts(与
active => ['/posts']
一起工作)
- /posts/{post_id}(id只是数字)
这些 URL 不应该匹配:
- /posts/create
- /posts/anyotherlink
- /posts/1text
我不能使用 /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.php
class中可以找到这段代码
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。
2021: 这实际上是软件包的问题。正则表达式 link 匹配已经通过我创建的解决方案实现了自己解决它。您可以在文档 here.
中阅读相关内容我正在使用 Laravel 5.8 和 AdminLTE for Laravel。
创建菜单有多种选择,其中之一是在我使用的提供的配置文件中创建它。
您可以在菜单中指定一个 active
键,使菜单具有 class,使菜单项处于活动状态并激活下拉菜单。
我有一个菜单项,我想在这些页面上激活它:
- /posts(与
active => ['/posts']
一起工作) - /posts/{post_id}(id只是数字)
这些 URL 不应该匹配:
- /posts/create
- /posts/anyotherlink
- /posts/1text
我不能使用 /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.php
class中可以找到这段代码
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。