【问题标题】:Laravel - Customize the key in the route model binding with json fieldLaravel - 使用 json 字段自定义路由模型绑定中的键
【发布时间】: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); });
  • 很高兴您找到了解决方案。如果可以,请将其发布为将来参考的答案。

标签: php laravel routes


【解决方案1】:

我的解决方案是像这样在RouteServiceProvide.php 内显式绑定这条路由 -

Route::bind('post', function ($value) {
            $slug = "slug->".$subdomain;
                return Post::where($slug, $value)->firstOrFail();
        });

然后我可以轻松访问任何语言版本的帖子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 2021-05-24
    • 2016-06-04
    • 2018-12-17
    • 2023-03-27
    • 2018-06-12
    • 2017-06-22
    相关资源
    最近更新 更多