Laravel - 使用 json 字段自定义路由模型绑定中的键
Posted
技术标签:
【中文标题】Laravel - 使用 json 字段自定义路由模型绑定中的键【英文标题】:Laravel - Customize the key in the route model binding with json field 【发布时间】:2022-01-21 12:59:08 【问题描述】:我想自定义路由模型绑定中的键,我做了这样的事情-
use App\Models\Post;
Route::get('/posts/post:slug', function (Post $post)
return $post;
);
但我的 slug 是一个 json 多语言字段,并保存这样的数据 -
'en': 'hello'
'ru': 'привет',
'de': 'hallo',
我已经有一种机制来检索子域并将相应的前缀分配给某个 $subdomain 变量,所以我已经知道我应该从数据库中获取哪种语言,但是如何将这个 $subdomain 嵌入到路由本身中?有点像 -
Route::get('/posts/post:slug->$subdomain', function (Post $post)
return $post;
);
我什至尝试将整个路由放入一个预定义的字符串中,比如这样 -
$post_url = '/posts/post:slug->'.$subdomain.'';
Route::get($post_url, function (Post $post)
return $post;
);
而且它还导致了不断的 404 错误。 我做错了什么?
不用说它在简单地通过他们的 ID 检索帖子时非常有效,即使是非多语言的 slug 也是如此。问题始于这些 JSON 字段。【问题讨论】:
您可能需要在RouteServiceProvider 中编写自定义逻辑。 谢谢。我正要回应自己,这就是我最终所做的 -Route::bind('post', function ($value) $slug = "slug->".$subdomain; return Post::where($slug, $value)->first() ?? abort(404); );
很高兴您找到了解决方案。如果可以,请将其发布为将来参考的答案。
【参考方案1】:
我的解决方案是像这样在RouteServiceProvide.php
内显式绑定这条路由 -
Route::bind('post', function ($value)
$slug = "slug->".$subdomain;
return Post::where($slug, $value)->firstOrFail();
);
然后我可以轻松访问任何语言版本的帖子。
【讨论】:
以上是关于Laravel - 使用 json 字段自定义路由模型绑定中的键的主要内容,如果未能解决你的问题,请参考以下文章
使用自定义中间件会将我重定向到 /home,即使 Laravel 中的中间件是空的