Tạo sitemap trong laravel 9
Khi bạn seo 1 trang web thì việc gửi sitemap nhằm hỗ trợ các bot Google chạm đến đích của website chứa nội dung nhanh chóng hơn bao giờ hết .Vì vậy việc tạo sitemaps là 1 công việc cơ bản và cần thiết với 1 trang web .Hôm nay mình sẽ cùng các bạn tạo 1 sitemap với laravel 9
Bước 1 : Tạo 1 project mới
composer create-project laravel/laravel lasitemap
Bước 2 : Kết nối database
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=lasitemap
DB_USERNAME=root
DB_PASSWORD=
Bước 3 : Chỉnh sửa model
Để vào việc nhanh hơn mình sử dụng command :
php artisan make:model Post --all
Chỉnh model Post app/Models/Post.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
use HasFactory;
protected $fillable=['title','content'];
}
Bước 4 : Chỉnh sửa migration
Ở đây mình sử dụng 1 table post demo
Tiếp theo chúng ta sẽ tạo 2 collumn title và content trong mục
database/migrations/2022_07_01_035401_create_posts_table.php
Với nội dung như sau :
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->string('content');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('posts');
}
};
Bước 5: Tạo database giả lập
Ở bước này mình sử dụng factories để tạo dữ liệu cho nhanh: database/factories/PostFactory.php
<?php
namespace Database\Factories;
use App\Models\Post;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Post>
*/
class PostFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
protected $model=Post::class;
public function definition()
{
return [
'title' => fake()->text(),
'content' => fake()->text(),
];
}
}
File database/seeders/PostSeeder.php
<?php
namespace Database\Seeders;
use App\Models\Post;
use Database\Factories\PostFactory;
use Faker\Generator;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Str;
class PostSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$faker = new Generator();
$post = Post::factory()->count(500)->create();
}
}
Tiếp theo chúng ta chạy lệnh command như sau :
php artisan db:seed --class=PostSeeder
Bước 6: Router Mình tao router cho mỗi bài viết
Route::get('/p/{id}',[\App\Http\Controllers\PostController::class,'post'])->name('post_slug');
Route::get('sitemap_post.xml',[\App\Http\Controllers\SitemapController::class,'post'])->name('sitemap_post');
Trong mục Controller
<?php
namespace App\Http\Controllers;
use App\Models\Post;
use App\Http\Requests\StorePostRequest;
use App\Http\Requests\UpdatePostRequest;
class PostController extends Controller
{
public function post($id)
{
$data = Post::find($id);
echo $data->title;
echo '<br/>';
echo $data->content;
}
}
Do ở đây mình chỉ demo nên ko cần viết nhiều
Bước 7: Sitemaps cho ứng dụng
Tạo controller sitemap
php artisan make:controller SitemapController
Controller code như sau :
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
class SitemapController extends Controller
{
public $array_return;
public function post()
{
/* cache trong 1 ngày */
$datas = Cache::remember('sitemap.post',86400,function(){
DB::table('posts')->chunkById(500,function($posts){
foreach($posts as $post)
{
$this->array_return[] = $post;
}
});
return $this->array_return;
});
return response()->view('sitemap.post',compact('datas'))->header('Content-Type','text/xml');;
}
}
File resources/views/sitemap/post.blade.php
<?php echo '<?xml version="1.0" encoding="UTF-8"?>'; ?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
@foreach ($datas as $data)
<url>
<loc>{{route('post_slug',['id'=>$data->id])}}</loc>
<lastmod>{{ \Illuminate\Support\Carbon::createFromTimeString($data->updated_at)->tz('UTC')->toAtomString() }}</lastmod>
<changefreq>weekly</changefreq>
<priority>0.9</priority>
</url>
@endforeach
</urlset>
Bước cuối cùng ta dùng lệnh
php artisan serve
Download project demo tại đây