Php Laravel 5:重定向“;blog/{id}";至;blog/{slug}";-试图获取非对象错误的属性

Php Laravel 5:重定向“;blog/{id}";至;blog/{slug}";-试图获取非对象错误的属性,php,laravel,laravel-5,Php,Laravel,Laravel 5,我试图将进入blog/{id}的用户重定向到blog/{slug},slug是他们输入的id的slug 我正在做的是不工作。我添加了{$article->slug}并获得了正确的字符串,但是当我尝试重定向时,我得到了“尝试获取非对象的属性”错误 我正在使用路由/模型绑定。这是我的RouteServiceProvider: $router->bind('blog', function($slug) { if ($slug) { if(i

我试图将进入blog/{id}的用户重定向到blog/{slug},slug是他们输入的id的slug

我正在做的是不工作。我添加了{$article->slug}并获得了正确的字符串,但是当我尝试重定向时,我得到了“尝试获取非对象的属性”错误

我正在使用路由/模型绑定。这是我的RouteServiceProvider:

    $router->bind('blog', function($slug)
    {
        if ($slug) {
            if(is_numeric($slug)) {
                $article = Article::findOrFail($slug);

                return redirect('blog/' . $article->slug);
            }

            return Article::with('images')->where('slug', $slug)->first();
        }
    });
这是我在控制器中的显示方法:

public function show(Article $article)
{
    return view('blog.show', compact('article'));
}
任何想法都将不胜感激

项目迁移文件:


您的控制器需要文章的实例。因此,如果您从闭包返回重定向响应,它将不起作用

目前,我只能想出两种方法来实现路由模型绑定的目的

  • 第一种方法更简单。只是不要在文章中键入提示。相反,检查它是否是重定向响应。如果是,请退回。如果不是,则返回视图。大概是这样的:

    public function show($article)
    {
        if ($article instanceof \Illuminate\Http\RedirectResponse)
        {
            return $article;
        }
        return view('blog.show', compact('article'));
    }
    
  • 您还可以检查它是否是一篇文章的实例,以便绝对确定,因为您不再是类型暗示

  • 在我看来,第二种方法对于简单的检查来说过于复杂。您必须抛出一个自定义异常,从app/Exceptions/Handler.php中捕获它,然后从那里重定向

  • 由于此问题与您的文章表架构相关,您能否使用文章表的信息更新您的问题?那会更容易理解。。。文章迁移丢失,且不在回收站中。呵呵。。。?这可能就是我出错的原因。太棒了!是的,这对于这么简单的逻辑来说太复杂了。我希望将来路由模型绑定不会像这样阻碍我,只是想让我的控制器更干净一点。如果是这样的话,我就从现在开始在控制器中写东西。谢谢
    public function show($article)
    {
        if ($article instanceof \Illuminate\Http\RedirectResponse)
        {
            return $article;
        }
        return view('blog.show', compact('article'));
    }