همیشه برای سئو دغدغه های زیادی داریم و با توجه به اینکه cms هایی همانند وردپرس با قدرت افزونه هایی که دارند عملا همیشه در لاراول آرزوی راحتی سئو را دارا هستیم .
برای سئو در لاراول بهترین راه استفاده از پکیج seotools هست مشکل بزرگی که این پکیج ها دارن اینه که توی هر متد از کنترلر ما باید این تایتل پاس داده بشه و اگر جایی بخواهیم تغییر بدیم باید توی تک تک جاهایی که تعریف کردیم این تغییر انجام بدیم.
برای این منظور راهکاری رو استفاده کردم که شاید به کار شما عزیزان هم بیاد و یکی از اصول سالید هم اینطوری خیلی بهتر رعایت خواهد شد.
composer require artesaos/seotools
شما باید بعد از نصب پکیج با دستور
php artisan make:middleware SEO
یک میدلویر با نام سئو بسازید و این میدلویر در بخش روت میدلویر ها در Kernel.php اضافه کنید.
بعد از اینکار شما باید یک کلاس Enum درست کنید در نسخه جدید پی اچ پی این امکان محیاست در نسخه های قدیمی هم کلاسی مشابه کلاس زیر باید بسازید
}<?phpclass SEOModelTypesEnum{const PAGE = 'pages';const PRODUCT = 'product/';const ARCHIVE = ['products'];const HOME = '/';const TYPES = ['PAGE' => self::PAGE,'PRODUCT' => self::PRODUCT,'ARCHIVE' => self::ARCHIVE,'HOME' => self::HOME,];
کد هایی که میبینید مربوط به یک سایت فروشگاهی می باشد که تمام صفحاتی که نیاز به سئو و تایتل و دیسکریپشن داینامیک را دارا هستند در کلاس بالا به شکلی که میبینید قرار خواهید داد تا تمام اجزای سایت یک پارچه شود.
حالا به سراغ میدلویری که ساختیم میرویم:
و طبق نمونه زیر کد ها را تغییر میدهیم در این کد ما از Enum هایی که تعریف کردیم استفاده میکنیم و به صورت کاملا داینامیک بر اساس محلی که کاربر درخواست ارسال کرده ما هم طبق آن درخواست تایتل و دیسکریپشن و حتی عکس را هم پر میکنیم
});<?phpnamespace App\Http\Middleware;use App\Enumoration\SEO\SEOModelTypesEnum;use Artesaos\SEOTools\Facades\SEOTools;use Closure;class Seo{/*** Handle an incoming request.** @param \Illuminate\Http\Request $request* @param \Closure $next* @return mixed*/public function handle($request, Closure $next, $seo=null){$seo = is_array($seo)? $seo: explode('|', $seo);$path = $request->path();$find = explode('/',$path);$type = null;$base_url = url('/');foreach (SEOModelTypesEnum::TYPES as $key=>$seoType){if(str_contains($path,is_array($seoType)?$seoType[0]:$seoType)){$type = $key;break;}}switch ($type){case 'HOME':$seo = ['Rocket - Home','آموزش برنامه نویسی','https://bareshacademy.com'.$path,"$base_url/آدرس عکس"];break;case 'Product':$product = Product::query()->whereSlug(end($find))->first();$seo = ["$product->title - ",'آموزش برنامه نویسی',$base_url.$path,"$base_url/$product->image"];break;case 'PAGE':$page = Page::query()->whereSlug(end($find))->first();$seo = ["$page->title - ",'آموزش برنامه نویسی',$base_url.$path,"$base_url/$page->image"];break;case 'ARCHIVE':$seo = [////////];break;و ....}SEOTools::setTitle($seo[0]??'Roocket');SEOTools::setDescription($seo[1]??'آموزش برنامه نویسی');SEOTools::opengraph()->setUrl('https://bareshacademy.com'.$seo[2]??'https://bareshacademy.com');SEOTools::twitter()->setSite('@twitter');SEOTools::jsonLd()->addImage($seo[3]??'');return $next($request);}}Route::middleware('seo')->group(function (){Route::get('/', 'HomeController@index')->name('home');
همانطور که دیدید این کد به سادگی جلوی تکرار هزاران خط کد اضافی را گرفت حالا برای استفاده فقط کافی است تا روت هایی که قصد دارید تا تایتل داشته باشند رو از روت میدلویر رد بکنید تا همه آن ها سئو شوند و دیگر دغدغه سئو و پکیج های مختلف را فراموش کنید
به همین راحتی ! جلوی تکرار کد گرفته شد ٬ کد یکپارچه تر شد و هر موقع خواستیم هر تغییری بدیم نهایت ۲ فایل را ویرایش میکنیم نه ۱۰۰ فایل! و واقعا خود من به شخصه این راهکار را برای اکثر کارها پیش میبرم حتی گاها بجای استفاده از چند کنترلر برای تفکیک api , view میشه خیلی راحت با میدلویر اینکارو انجام داد که سعی میکنم در آموزش های بعدی اینو بهتون آموزش بدم.
در نهایت برای نمایش و خروجی در blade هم از کد زیر در هد Head صفحه بهره میبرید:
{!! SEO::generate() !!}