Laravel 5.6中的getRouteKeyName()方法无效的问题
在Laravel 5.6中,getRouteKeyName()方法被用来自定义模型中URL路由的键名,以替代默认的"id"键。然而,有时候我们可能会遇到这个方法无效的情况,导致在URL中使用自定义键名时无法正确地查询数据库。本文将探讨这个问题,并提供解决方案。问题背景首先,让我们看一个简单的例子。假设我们有一个Post模型,其中包含一个自定义的slug字段作为URL路由的键名。我们期望通过访问"/posts/{slug}"来获取特定的文章。phpclass Post extends Model{ public function getRouteKeyName() { return 'slug'; }}然而,当我们尝试访问"/posts/hello-world"时,Laravel会默认使用"id"字段进行查询,而不是使用我们定义的"slug"字段。这是因为在Laravel 5.6中,默认情况下getRouteKeyName()方法不会自动应用于路由模型绑定。解决方案要解决这个问题,我们需要在相应的控制器中手动指定模型绑定时要使用的键名。在我们的例子中,我们需要在PostController的构造函数中添加以下代码:
phpuse App\Post;class PostController extends Controller{ public function __construct() { $this->middleware(function ($request, $next) { $slug = $request->route()->parameter('post'); $post = Post::where('slug', $slug)->firstOrFail(); $request->route()->setParameter('post', $post); return $next($request); }); }}在上面的代码中,我们使用了一个匿名函数作为中间件,该中间件会在每个请求到达PostController之前执行。它会从URL中获取slug参数,并使用该参数查询数据库以获取相应的文章。然后,我们使用setParameter()方法将查询到的文章模型设置到路由参数中。通过这样的设置,我们就能够使用自定义的slug字段进行路由模型绑定了。现在,当我们访问"/posts/hello-world"时,Laravel将会正确地获取到slug为"hello-world"的文章,并继续执行相应的操作。在本文中,我们讨论了Laravel 5.6中getRouteKeyName()方法无效的问题,并提供了解决方案。通过手动指定模型绑定时要使用的键名,我们能够使用自定义的字段进行路由查询。这对于需要使用非默认键名的URL路由非常有用,使我们能够更灵活地处理URL参数和数据库查询。希望本文能够帮助到遇到类似问题的开发者们,提高他们在使用Laravel框架时的开发效率和灵活性。