Laravel cviebrock/eloquent-sluggable 将@作为前缀或在路由中过滤

Laravel cviebrock/eloquent-sluggable put @ as prefix or filter it in route

Laravel 版本 7.0,我正在使用 cviebrock/eloquent-sluggable 包。

我想要的是把@作为用户名的前缀。

我在 User 模型中加入了 Sluggable trait 并设置成这样。

public function sluggable()
{
    return [
        'username' => [
            'source' => 'name',
            'separator' => '',
            'onUpdate' => true
        ]
    ];
}

现在我想要的是 https://mywebsite.com/@username url 显示用户配置文件。

我认为我们可以将 @ 作为前缀放在 sluggable 包中,或者我们可以在 laravel 路由中检测到它。

谁能建议我更好的方法?

谢谢

我建议您尝试 eloquent-sluggable 的 method 并在那里生成带前缀的 slug(即 @username 格式),而不是将 @ 保留为路线的一部分。

这个建议背后的基本原理是,当您在 slug 本身而不是路由中生成和存储 @ 时(据我了解,您是在质疑哪个更好),您可以轻松地引用用户@ 符号,因为您只需要查询匹配的条目,而无需关心进行转换(例如,在生成 link 时为 username 加上 @ 前缀) 来回.

更新:添加了 method 的基本示例,用户名前缀为 @

这是一个基本示例,展示了如何为用户添加前缀 @。确保添加自己处理的空格,以防用户名可能包含这些内容。

  return [
    'username' => [
      ...,
      'method' => function ($username, $separator) {
        // example from docs: strtolower(preg_replace('/[^a-z]+/i', $separator, $string));
        return "@{$username}";
      },
    ]
  ];

我找到了更好的解决方案。

我可以轻松地在 laravel 路由中添加 @。

Route::get('/@{username}', 'HomeController@user')->name('user.index');

我们可以在不带@的情况下保存用户名,并将@作为前缀放在laravel路由中。