آموزش مقدماتی لاراول - کار با واسط خط فرمان Artisan
ما تا الان عملیات متعددی رو با Artisan مانند تولید مدلها و رخداد و کلی دستور دیگه رو انجام دادیم. در این مقاله در مورد این واسط خط فرمان CLI (مخفف Command line interface) که همراه با لاراول عرضه شده صحبت خواهم کرد و یاد خواهیم گرفت که چطور میشه command سفارشی خودمون رو ایجاد کنیم.
همانطور که گفتیم Artisan یه رابط خط فرمان در لاراول هست که دستورات مفیدی رو هنگام ساخت برنامه ارائه میده. برای مشاهده لیستی از تمام دستورات Artisan موجود، می توانید از دستور php artisan استفاده کنید. اما لاراول این امکان رو هم داده که ما بتونیم برای خودمون هم یک دستور سفارشی ایجاد کنیم. در ادامه پروژهای که در این دوره آموزشی کار میکردیم میخواهیم یک command ایجاد کنیم که با کمک اون بتونیم Genre موسیقی به پروژه اضافه کنیم. برای این منظور ابتدا دستور زیر را وارد کنید:
php artisan make:command GenreCommand
سپس وارد مسیر جدید app/console/commands
میشیم و GenreCommand رو باز میکنیم. همانطور که در دستور زیر مشاهده میکنید ما در این قسمت دو متغیر signature و description رو داریم که برای تعریف فرمان ما و توضیحات مربوط به اون کاربرد داره. من آنها رو بصورت زیر مقداردهی کردم.


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


نکتهای که جالب هست اینه که گروهبندی این دستور توسط 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!');
}
که با اجرای دستوری که ایجاد کردیم خروجی بصورت زیر خواهد بود:


در صورتیکه بخواهیم برای این دستور ورودی تعریف کنیم کافیه که در signature و با {} یک متغیر تعریف کنیم:
protected $signature = 'song:genre {name}';
حالا اگه دستور رو به همراه فلگ h- بزنیم خواهید دید که در قسمت آرگومانها name تعریف شده:


حالا اگه این دستور رو اجرا کنید قطعا خطای الزامی بودن آرگومان name رو خواهید داشت. بیایید به دستورمان برگردیم و مقدار متغیری که در این دستور میگیریم رو در خروجی نشان دهیم:
$this->info('This is your input: ' . $this->argument('name'));
که با اجرا و مقدار دادن به دستور برای متغیر name خروجی بصورت زیر خواهد بود:


این امکان هم وجود داره که شما متغیر اختیاری تعریف کنید برای این منظور کافیه که به انتهای نام متغیر یک علامت سوال اضافه کنید:
protected $signature = 'song:genre {name} {description?}';
در نتیجه خواهیم داشت:


همانطور که مشاهده میکنید description داخل [] قرار گرفته به این معنی که این متغیر اختیاری هست. البته میتونید یک مقدار پیشفرض هم برای هر متغیر در نظر بگیرید که اگر کاربر چیزی وارد نکرد این مقدار رو در نظر بگیرید:
protected $signature = 'song:genre {name} {description=this is a genre}';
خروجی ترمینال:


حالا بیایید یک با کمک دستوری که ایجاد کردیم یک مدل genre ایجاد کنیم که مقدار name رو از کاربر دریافت میکنه:
public function handle()
{
$genre = Genre::create([
'name' => $this->argument('name')
]);
return $this->info('The genre ' . $genre->name . ' created!');
}
و خروجی:


به همین راحتی شما اولین فرمان 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.');
}
و خروجی هم بصورت زیر هست:


خب شما تا اینجا تونستید یک فرمان و دستور جدید به artisan اضافه کنید که یک مدل Genre اضافه میکنه. این قابلیت امکانات جالبی در اختیار شما قرار میده و شما میتونید با کمک اون و بدون اینکه درگیر ui بشید قابلیتهایی رو برای خودتون ایجاد کنید. نظیر خروجی گرفتن از وضعیت سیستم، گزارشهای مورد نیازتون و حتی میتونیم از اون برای تولید دادههای تصادفی استفاده کنیم که کار بسیار سریعتر انجام خواهد شد.
اما در ادامه روش دیگری برای ایجاد دستور جدید رو بررسی میکنیم. اگر داخل routeها رو نگاه کرده باشید یک فایل به نام console وجود دارد. از این فایل برای ساخت دستورهای ساده استفاده میکنیم که دیگر نیازی به ایجاد Command نخواهیم داشت. اگر به این فایل نگاهی بیاندازید یک دستور ساده با کلاس Artisan نوشته شده که بصورت پیش فرض درون هر پروژه لاراولی وجود دارد و کارش نمایش یک نقل قول که بصورت تصادفی از درون یک آرایه انتخاب میکنه.
روش کار در اینجا سادس و کار توسط تابع command از کلاس Artisan که دوتا آرگومان دارد. اولی نام دستور و دومی تابع بصورت callback که فرمانی که میخواهیم رو اجرا میکنه. در نهایت هم یک تابع که توضیحات مربوط به command رو تعریف میکنه. حالا بیایید برای پروژه خودمون یک دستور دیگه رو تعریف کنیم:


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


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