我正试图将访问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,它将不起作用。
目前,我只能想出两种方法来实现您想要的路由模型绑定。
-
第一种方法比较简单。只是不要键入提示文章。相反,请检查它是否为重定向响应。如果是,则返回它。如果不是,则返回视图。类似这样的东西:
public function show($article) { if ($article instanceof 'Illuminate'Http'RedirectResponse) { return $article; } return view('blog.show', compact('article')); }
你也可以检查它是否是一个文章的实例,只是为了绝对确定,因为你不再是类型提示。
- 在我看来,第二种方法对于简单的检查来说过于复杂。您必须抛出一个自定义异常,从
app/Exceptions/Handler.php
中捕获它,然后从那里重定向