gpt4 book ai didi

php - Laravel 路由变量限制为 17 个字符

转载 作者:搜寻专家 更新时间:2023-10-31 20:39:05 25 4
gpt4 key购买 nike

在 Laravel 中,我试图实现在 URL 中具有可变数量类别的能力,然后是 slug。例如:

www.trashaccount.com/category1/category2/slug

我在 Laravel 中使用路由模式来识别类别

Route::pattern('cat', '([-a-zA-Z0-9]+\/?)*');

演示/测试路线如下所示:

Route::get('test/{cat}/{slug}', function($cat, $slug) {
$categories = explode('/', $cat);
$i = 1;
foreach($categories as $category) {
echo "category " . $i . ": " . $category . "<br>";
$i++;
}
echo "slug: " . $slug . "<br>";
});

这可以在 www.trashaccount.com/test/{cat}/.../{slug} 上测试

此代码成功提取了任意字符长度的可变数量的类别;例如这个作品:

http://www.trashaccount.com/test/cat1/cat2/cat3/abcdefghijklmnopqrstuvwxyzabcdevg/my-slug

它失败的地方在于最后一个元素 {slug} 的字符数。由于某种原因,超过 17 个字符的任何内容都会引发 NotFoundHttpException。所以,这是行不通的:

http://www.trashaccount.com/test/cat1/abcdefghijklmnopqr

但是如果你简单地删除“r”(18h 字符),它就有效。

澄清一下(因为我的帖子在另一个论坛上被误解了),您可以输入任意数量的类别,它们可以是任意长度(遵守 HTTP 限制),它们将被接受和处理。我标记为 {slug} 的最后一个元素不能超过 17 个字符而不会抛出 NotFoundHttpException 错误。

有人知道我做错了什么吗?

谢谢!

最佳答案

老实说,我觉得这种行为很奇怪。

我无事可做,所以我开始查看 Laravel 的内部代码,看看哪里出了问题,我得出的结论是,如果 路由的最后一部分 长于 17 个字符 然后失败。

一切都发生在 Illuminate\Routing\Matching\UriValidator->matches() line 25 .

这是一些使用 /test/first-category/testingslug 的调试打印:

preg_match("#^/assets/(?P(?!\.\.)(.*))$#s", "/test/first-category/testingslug");

// successful
preg_match("#^/test/(?P([-a-zA-Z0-9]+\/?)*)/(?P[^/]++)$#s", "/test/first-category/testingslug");

category 1: first-category
slug: testingslug

一切正常,直到我尝试使用超过 17 个字符的 slug。

我尝试使用 /test/first-category/testingslugmuchlonger:

preg_match("#^/assets/(?P(?!\.\.)(.*))$#s", "/test/first-category/testingslugmuchlonger");   

// fails
preg_match("#^/test/(?P([-a-zA-Z0-9]+\/?)*)/(?P[^/]++)$#s", "/test/first-category/testingslugmuchlonger");

preg_match("#^/assets/(?P(?!\.\.)(.*))$#s", "/test/first-category/testingslugmuchlonger");

// fails again
preg_match("#^/test/(?P([-a-zA-Z0-9]+\/?)*)/(?P[^/]++)$#s", "/test/first-category/testingslugmuchlonger");

之所以重复,是因为框架会检查是否有替代路由具有.. 中相同的路由但不同的方法 Illuminate/Routing/RouteCollection.php->match() line 141 .

现在我尝试在单独的文件中调试这两个 preg_matc():

$works = null;
preg_match("#^/test/(([-a-zA-Z0-9]+\/?)*)/([^/]++)$#s", "/test/first-category/testingslug", $works);
var_dump($works);

$fails = null;
preg_match("#^/test/(([-a-zA-Z0-9]+\/?)*)/([^/]++)$#s", "/test/first-category/testingslugmuchlonger", $fails);
var_dump($fails);

这是他们返回的内容:

array(4) {
[0]=>
string(32) "/test/first-category/testingslug"
[1]=>
string(14) "first-category"
[2]=>
string(14) "first-category"
[3]=>
string(11) "testingslug"
}

array(0) {
}

我认为 preg_match 一定有问题(?)。

关于php - Laravel 路由变量限制为 17 个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27698580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com