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 中的中间件是空的

Laravel 8 自定义路由在使用资源时返回 404

Laravel:如何根据路由响应自定义 404 错误

如何在没有范围的情况下在 laravel 路由中使用自定义键?

使用自定义 json 响应进行 Laravel 验证

Laravel 路由 - 相同路由的自定义域