URL 路线友好
URL friendly in routes
我正在我的应用程序中创建 url 友好,但它不起作用,该应用程序给我一些与“-”相关的问题。
它给我一个错误:
ErrorException in PostController.php line 60:
Trying to get property of non-object
我的理想URL是:
http://domain.com/CATEGORY-title-of-post-ID
我的路线是:
Route::get('{category}-{title}-{id}', 'PostController@show');
PostController 显示函数:
public function show($category,$title,$id)
{
$post = Post::find($id);
$user = Auth::user();
$comments = Comment::where('post_id',$id)
->where('approved',1)
->get();
return view('posts.show',compact('post','comments','user'));
}
Blade 查看:
<?php
$title_seo = str_slug($feature->title, '-');
?>
<a href="{{url($feature->categories[0]->internal_name."-".$title_seo."-".$feature->id)}}" rel="bookmark">
...</a>
有一个名为 Eloquent-Sluggable 的库,它会为每个 post 创建一个唯一的 slug,并正确地 URL 对其进行编码。
安装(取自文档):
composer require cviebrock/eloquent-sluggable:^4.1
然后,通过添加服务提供商条目来更新 config/app.php
。
'providers' => [
// ...
Cviebrock\EloquentSluggable\ServiceProvider::class,
];
最后,再次从命令行发布默认配置文件:
php artisan vendor:publish --provider="Cviebrock\EloquentSluggable\ServiceProvider"
要使用,请将 Sluggable 特性添加到您的模型中:
use Cviebrock\EloquentSluggable\Sluggable;
class Post extends Model
{
use Sluggable;
/**
* Return the sluggable configuration array for this model.
*
* @return array
*/
public function sluggable()
{
return [
'slug' => [
'source' => 'title'
]
];
}
}
当您保存模型的实例时,库会自动创建一个 slug 并将其保存到模型 table 的新创建的 slug
列中。所以要访问 slug 你会使用 $model->slug
为了获得你想要的 slug,而不是从默认设置的 title
中创建它。您可以将字段名称数组传递给 sluggable
方法的 source
属性,使用点符号来访问相关模型的属性,如下所示:
public function sluggable()
{
return [
'slug' => [
'source' => ['category.name','title','id']
]
];
}
}
为什么要手动生成 "friendly URL"?
您有 route
辅助函数,可以根据给定的参数为您构建 URL。
Route::get('{category}-{title}-{id}', [
'as => 'post.show',
'uses' => 'PostController@show'
]);
echo route('post.show', ['testing', 'title', 'id']); // http://domain.dev/testing-title-id
无论如何,这不是实现 SEO 友好 URLs 的最佳方法。
在您的控制器中,您总是使用您的 ID 来查找 post,这意味着类别和标题对于确定需要为用户提供哪个资源完全没有用。
您可以通过以下方式让您的生活更轻松:
Route::get('{id}-{slug}', [
'as => 'post.show',
'uses' => 'PostController@show'
]);
echo route('post.show', ['id', 'slug']); // http://domain.dev/id-slug
在您的模型中,您创建了一个辅助函数来为您的 post:
生成 slug
class Post
{
[...]
public function slug()
{
return str_slug("{$this->category}-{$this->title}");
}
}
然后,在您的控制器中,您需要检查用于访问文章的 slug 是否正确,因为您不希望 Google 使用错误的 slug 索引 post。您基本上强制 URL 以某种方式出现,并且您不会丢失索引点。
class PostController
{
[...]
public function show($id, $slug)
{
$post = Post::findOrFail($id);
$user = Auth::user();
if ($post->slug() !== $slug) {
return redirect()->route('posts.show', ['id' => 1, 'slug' => $post->slug()]);
}
$comments = Comment::where('post_id', $id)->where('approved', 1)->get();
return view('posts.show', compact('post', 'comments', 'user'));
}
}
我正在我的应用程序中创建 url 友好,但它不起作用,该应用程序给我一些与“-”相关的问题。 它给我一个错误:
ErrorException in PostController.php line 60:
Trying to get property of non-object
我的理想URL是:
http://domain.com/CATEGORY-title-of-post-ID
我的路线是:
Route::get('{category}-{title}-{id}', 'PostController@show');
PostController 显示函数:
public function show($category,$title,$id)
{
$post = Post::find($id);
$user = Auth::user();
$comments = Comment::where('post_id',$id)
->where('approved',1)
->get();
return view('posts.show',compact('post','comments','user'));
}
Blade 查看:
<?php
$title_seo = str_slug($feature->title, '-');
?>
<a href="{{url($feature->categories[0]->internal_name."-".$title_seo."-".$feature->id)}}" rel="bookmark">
...</a>
有一个名为 Eloquent-Sluggable 的库,它会为每个 post 创建一个唯一的 slug,并正确地 URL 对其进行编码。
安装(取自文档):
composer require cviebrock/eloquent-sluggable:^4.1
然后,通过添加服务提供商条目来更新 config/app.php
。
'providers' => [
// ...
Cviebrock\EloquentSluggable\ServiceProvider::class,
];
最后,再次从命令行发布默认配置文件:
php artisan vendor:publish --provider="Cviebrock\EloquentSluggable\ServiceProvider"
要使用,请将 Sluggable 特性添加到您的模型中:
use Cviebrock\EloquentSluggable\Sluggable;
class Post extends Model
{
use Sluggable;
/**
* Return the sluggable configuration array for this model.
*
* @return array
*/
public function sluggable()
{
return [
'slug' => [
'source' => 'title'
]
];
}
}
当您保存模型的实例时,库会自动创建一个 slug 并将其保存到模型 table 的新创建的 slug
列中。所以要访问 slug 你会使用 $model->slug
为了获得你想要的 slug,而不是从默认设置的 title
中创建它。您可以将字段名称数组传递给 sluggable
方法的 source
属性,使用点符号来访问相关模型的属性,如下所示:
public function sluggable()
{
return [
'slug' => [
'source' => ['category.name','title','id']
]
];
}
}
为什么要手动生成 "friendly URL"?
您有 route
辅助函数,可以根据给定的参数为您构建 URL。
Route::get('{category}-{title}-{id}', [
'as => 'post.show',
'uses' => 'PostController@show'
]);
echo route('post.show', ['testing', 'title', 'id']); // http://domain.dev/testing-title-id
无论如何,这不是实现 SEO 友好 URLs 的最佳方法。
在您的控制器中,您总是使用您的 ID 来查找 post,这意味着类别和标题对于确定需要为用户提供哪个资源完全没有用。
您可以通过以下方式让您的生活更轻松:
Route::get('{id}-{slug}', [
'as => 'post.show',
'uses' => 'PostController@show'
]);
echo route('post.show', ['id', 'slug']); // http://domain.dev/id-slug
在您的模型中,您创建了一个辅助函数来为您的 post:
生成 slugclass Post
{
[...]
public function slug()
{
return str_slug("{$this->category}-{$this->title}");
}
}
然后,在您的控制器中,您需要检查用于访问文章的 slug 是否正确,因为您不希望 Google 使用错误的 slug 索引 post。您基本上强制 URL 以某种方式出现,并且您不会丢失索引点。
class PostController
{
[...]
public function show($id, $slug)
{
$post = Post::findOrFail($id);
$user = Auth::user();
if ($post->slug() !== $slug) {
return redirect()->route('posts.show', ['id' => 1, 'slug' => $post->slug()]);
}
$comments = Comment::where('post_id', $id)->where('approved', 1)->get();
return view('posts.show', compact('post', 'comments', 'user'));
}
}