Laravel 5:重定向"博客/ {id}"到"博客/ {slug}" - 尝试获取非对象错误的属性

时间:2015-10-28 01:24:52

标签: php laravel laravel-5

我试图将访问blog / {id}的用户重定向到blog / {slug},其中slug是他们输入的id的slug。

我在做什么不起作用。我dd {$ 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();
        }
    });

这是我在控制器中的show方法:

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');
    }
}

1 个答案:

答案 0 :(得分:1)

您的控制器正在等待文章的实例。因此,如果您从闭包中返回RedirectResponse,它将无效。

目前,我只能想到两种通过路径模型绑定实现您想要的方法。

  1. 第一种方法更简单。只是不要输入提示文章。相反,检查它是否是RedirectResponse。如果是这样,请将其退回。如果没有,请返回视图。像这样:

    public function show($article)
    {
        if ($article instanceof \Illuminate\Http\RedirectResponse)
        {
            return $article;
        }
        return view('blog.show', compact('article'));
    }
    
  2. 你也可以检查它是否是文章的一个实例,只是为了绝对肯定,因为你不再是类型暗示。

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