Laravel 5:重定向“;博客/{id}”;至“;博客/{slug}”-尝试获取非对象的属性时出错


Laravel 5: Redirect "blog/{id}" to "blog/{slug}" - Trying to get property of non-object error

我正试图将访问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'));
}

任何想法都将不胜感激!

项目迁移文件:

class CreateArticlesTable extends Migration
{
    public function up()
    {
        Schema::create('articles', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('user_id')->unsigned();
            $table->string('title');
            $table->string('slug');
            $table->text('body');
            $table->timestamps();
            $table->foreign('user_id')
                  ->references('id')
                  ->on('users')
                  ->onDelete('cascade');
        });
    }
    public function down()
    {
        Schema::drop('articles');
    }
}

您的控制器需要一个Article实例。因此,如果您从关闭返回RedirectResponse,它将不起作用。

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

  1. 第一种方法比较简单。只是不要键入提示文章。相反,请检查它是否为重定向响应。如果是,则返回它。如果不是,则返回视图。类似这样的东西:

    public function show($article)
    {
        if ($article instanceof 'Illuminate'Http'RedirectResponse)
        {
            return $article;
        }
        return view('blog.show', compact('article'));
    }
    

你也可以检查它是否是一个文章的实例,只是为了绝对确定,因为你不再是类型提示。

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