我试图将访问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');
}
}
答案 0 :(得分:1)
您的控制器正在等待文章的实例。因此,如果您从闭包中返回RedirectResponse,它将无效。
目前,我只能想到两种通过路径模型绑定实现您想要的方法。
第一种方法更简单。只是不要输入提示文章。相反,检查它是否是RedirectResponse。如果是这样,请将其退回。如果没有,请返回视图。像这样:
public function show($article)
{
if ($article instanceof \Illuminate\Http\RedirectResponse)
{
return $article;
}
return view('blog.show', compact('article'));
}
你也可以检查它是否是文章的一个实例,只是为了绝对肯定,因为你不再是类型暗示。
app/Exceptions/Handler.php
内捕获它,然后从那里重定向。