آموزش مقدماتی لاراول - کار با واسط خط فرمان Artisan

ما تا الان عملیات متعددی رو با Artisan مانند تولید مدل‌ها و رخداد و کلی دستور دیگه رو انجام دادیم. در این مقاله در مورد این واسط خط فرمان CLI (مخفف Command line interface) که همراه با لاراول عرضه شده صحبت خواهم کرد و یاد خواهیم گرفت که چطور میشه command سفارشی خودمون رو ایجاد کنیم.


همانطور که گفتیم Artisan یه رابط خط فرمان در لاراول هست که دستورات مفیدی رو هنگام ساخت برنامه ارائه میده. برای مشاهده لیستی از تمام دستورات Artisan موجود، می توانید از دستور php artisan استفاده کنید. اما لاراول این امکان رو هم داده که ما بتونیم برای خودمون هم یک دستور سفارشی ایجاد کنیم. در ادامه پروژه‌ای که در این دوره آموزشی کار می‌کردیم می‌خواهیم یک command ایجاد کنیم که با کمک اون بتونیم Genre موسیقی به پروژه اضافه کنیم. برای این منظور ابتدا دستور زیر را وارد کنید:

php artisan make:command GenreCommand

سپس وارد مسیر جدید app/console/commands میشیم و GenreCommand رو باز می‌کنیم. همانطور که در دستور زیر مشاهده می‌کنید ما در این قسمت دو متغیر signature و description رو داریم که برای تعریف فرمان ما و توضیحات مربوط به اون کاربرد داره. من آنها رو بصورت زیر مقداردهی کردم.

Image for post
Image for post

حالا اگر لیست artisan رو مشاهده کنید خواهید دید که یک دستور جدید با کلید و توضیحات ما به این لیست اضافه شده:

Image for post
Image for post

نکته‌ای که جالب هست اینه که گروه‌بندی این دستور توسط artisan انجام شده و دستور ما در گروه song دسته‌بندی کرده.

برای نمایش پیغام‌ها از توابع پیش‌ تعریف شده‌‌ای چون info برای توضیحات، warn برای هشدار‌ها و error برای خطاها استفاده میشه. همچنین در این کلاس یک تابع بنام handle وجود دارد که زمانی که دستور خودمون رو اجرا می‌کنیم درواقع این تابع فراخوانی میشه. حالا بیاید با توابعی که معرفی کردیم به یک پیغام رو در خروجی داشته باشیم:

public function handle() {
	$this->info('This is an info!');
	$this->warn('This is a warn!');
	$this->error('This is an error!');
}

که با اجرای دستوری که ایجاد کردیم خروجی بصورت زیر خواهد بود:

Image for post
Image for post

در صورتیکه بخواهیم برای این دستور ورودی تعریف کنیم کافیه که در signature و با {} یک متغیر تعریف کنیم:

protected $signature = 'song:genre {name}';

حالا اگه دستور رو به همراه فلگ h- بزنیم خواهید دید که در قسمت آرگومان‌ها name تعریف شده:

Image for post
Image for post

حالا اگه این دستور رو اجرا کنید قطعا خطای الزامی بودن آرگومان name رو خواهید داشت. بیایید به دستورمان برگردیم و مقدار متغیری که در این دستور می‌گیریم رو در خروجی نشان دهیم:

$this->info('This is your input: ' . $this->argument('name'));

که با اجرا و مقدار دادن به دستور برای متغیر name خروجی بصورت زیر خواهد بود:

Image for post
Image for post

این امکان هم وجود داره که شما متغیر اختیاری تعریف کنید برای این منظور کافیه که به انتهای نام متغیر یک علامت سوال اضافه کنید:

protected $signature = 'song:genre {name} {description?}';

در نتیجه خواهیم داشت:

Image for post
Image for post

همانطور که مشاهده می‌کنید description داخل [] قرار گرفته به این معنی که این متغیر اختیاری هست. البته می‌تونید یک مقدار پیش‌فرض هم برای هر متغیر در نظر بگیرید که اگر کاربر چیزی وارد نکرد این مقدار رو در نظر بگیرید:

protected $signature = 'song:genre {name} {description=this is a genre}';

خروجی ترمینال:

Image for post
Image for post

حالا بیایید یک با کمک دستوری که ایجاد کردیم یک مدل genre ایجاد کنیم که مقدار name رو از کاربر دریافت می‌کنه:

public function handle()
{
	$genre = Genre::create([
		'name' => $this->argument('name')
	]);

	return $this->info('The genre ' . $genre->name . ' created!');
}

و خروجی:

Image for post
Image for post

به همین راحتی شما اولین فرمان artisan رو نوشتید. اما معمولا برای وارد کردن اطلاعات از فرم‌های پرسش و پاسخ استفاده می‌کنند. بیایید در همین مثال این مورد رو هم پیاده کنیم.

خب اگر بخواهیم در ترمینال از کاربر بخواهیم مقداری وارد کنه از دستور ask استفاده می‌کنیم، خروجی این دستور مقداری است که کاربر وارد وارد می‌کنه:

$value = $this->ask(‘you message’);

همچنین می‌توانیم دستور تایید گرفتن رو هم با confirm داشته باشیم که احتمالا تا به الان موقع نصب پکیج‌هاتون دیده باشید. نهایتا من تابع handle رو بصورت زیر بازنویسی کردم:

public function handle()
{
	$name = $this->ask('What\'s the song\'s genre?');

	if ($this->confirm('Are you ready to insert "' . $name . '"? ')) {
		$genre = Genre::create(['name' => $name]);
		
		return $this->info('The genre ' . $genre->name . ' created!');
	}
	
	$this->info('No new added genre was added.');
}

و خروجی هم بصورت زیر هست:

Image for post
Image for post

خب شما تا اینجا تونستید یک فرمان و دستور جدید به artisan اضافه کنید که یک مدل Genre اضافه می‌کنه. این قابلیت امکانات جالبی در اختیار شما قرار می‌ده و شما می‌تونید با کمک اون و بدون اینکه درگیر ui بشید قابلیت‌هایی رو برای خودتون ایجاد کنید. نظیر خروجی گرفتن از وضعیت سیستم، گزارش‌های مورد نیازتون و حتی میتونیم از اون برای تولید داده‌های تصادفی استفاده کنیم که کار بسیار سریع‌تر انجام خواهد شد.

اما در ادامه روش دیگری برای ایجاد دستور جدید رو بررسی می‌کنیم. اگر داخل routeها رو نگاه کرده باشید یک فایل به نام console وجود دارد. از این فایل برای ساخت دستورهای ساده استفاده می‌کنیم که دیگر نیازی به ایجاد Command نخواهیم داشت. اگر به این فایل نگاهی بیاندازید یک دستور ساده با کلاس Artisan نوشته شده که بصورت پیش فرض درون هر پروژه لاراولی وجود دارد و کارش نمایش یک نقل قول که بصورت تصادفی از درون یک آرایه انتخاب می‌کنه. 

روش کار در اینجا سادس و کار توسط تابع command از کلاس Artisan که دوتا آرگومان دارد. اولی نام دستور و دومی تابع بصورت callback که فرمانی که می‌خواهیم رو اجرا می‌کنه. در نهایت هم یک تابع که توضیحات مربوط به command رو تعریف می‌کنه. حالا بیایید برای پروژه خودمون یک دستور دیگه رو تعریف کنیم:

Image for post
Image for post

همانطور که مشاهده می‌کنید من یک دستور برای پاک کردن genre هایی که با هیچ آهنگی ارتباطی ندارند استفاده میشوند در مورد مدل‌ها و تابع رابطه در این مقاله صحبت شد اما حتما در آیند نگاه عمیق‌تری به آنها خواهیم داشت. 

Image for post
Image for post

در این مقاله ما با خط فرمان artisan آشنا شدیم و اینکه چطور می‌تونیم در لاراول دستورهای سفارشی خودمون را ایجاد کنیم. امیدوارم از این آموزش هم لذت برده باشید