یادگیری مقدماتی لاراول - پارت دهم

تذکر: این یک پست آموزشی برای عموم نیست! بلکه تنها جایی برای یادداشت‌های من حین یادگیریه تا بهتر به خاطر بسپارم و در صورت لزوم به اون‌ها مراجعه کنم.


قسمت ۱۳۰ تا ۱۴۰


آشنایی با دستورات Artisan Console:

برای ایجاد command اختصاصی برای Artisan دو راه داریم:
۱- ایجاد یک پوشه به اسم Comands در app/Console و قرار دادن commandها در آن
۲- ایجاد یک روت در فایل console.php در routes

روتی که به صورت دیفالت در console.php قرار دارد:

در واقع ما از یکی از دو روش بالا برای ایجاد کامند استفاده می‌کنیم و نیازی نیست که وقتی مثلا یک روت تعریف کردیم؛ همون کامند رو به Commands هم اضافه کنیم.

توی console.php ما از دستور Artisan::command برای تعریف کامند کمک می‌گیریم که آرگومان اول نام کامند و آرگومان دوم یک clouser function هست که در واقع با وارد کردن نام کامند (اینجا inspire) این clouser ران می‌شود.

وقتی می زنیم php artisan که لیست کامندها رو برای ما میاره، توی بخش Available Commands اسم دستور inspire هم اومده که description اینه که برای ما جملات انگیزشی نشون بده!

بریم برای ایجاد یک دستور سفارشی داخل console.php:

خیلی ساده اینجا خروجی کار رو داریم:

الان وقتی بزنیم php artisan برای ما توی کامندهای در دسترس، اسم test رو هم اضافه کرده:

اما description نداره که به راحتی قابل اضافه کردنه:

نکته: امکان استفاده از return به جای echo در Clouser function نیست.

ارسال پارامتر به Command:

برای این کار، اول داخل curly braces توی آرگومان اول clouser function اسم پارامتر دریافتی رو می‌نویسیم و به بعد به coluser function پاس می‌دیم:

حالا اگر به حالت عادی و بدون آرگومان دستور greeting رو صدا بزنیم؛ Artisan خطای زیر رو نشون میده:

اما وقتی بهش ورودی بدیم؛ خروجی زیر رو خواهیم داشت:

وقتی help می‌گیریم؛ به ما آرگومان‌های ورودی و نحوهٔ استفاده رو نشون میده:

اگر آرگومان ورودی ما توضیحات خاصی داشته باشه که باید توی help نشون بده، اینطوری واردش می‌کنیم:

با استفاده از علامت سوال ؟ می‌تونیم یک آرگومان رو اختیاری کنیم؛ اما باید دقت داشته باشیم که حتما مقدار دیفالت براش در نظر بگیریم تا دچار مشکل نشیم:

Artisan::command('greeting {name : Person Name} {family? : Person Family}', function($name, $family = ''){
    echo &quotHi &quot.$name.&quot &quot.$family.&quot , Welcome!"
})->describe(&quotPrints a Greeting Message&quot);

به جای اینکه مقدار دیفالت family رو توی clouser ست کنیم؛ می‌تونیم توی آگومان اول به شکل زیر ست کنیم:

Artisan::command('greeting {name : Person Name} {family=Alikhani : Person Family}', function($name, $family){     
    echo &quotHi &quot.$name.&quot &quot.$family.&quot , Welcome!" 
})->describe(&quotPrints a Greeting Message&quot);


اضافه کردن Option به دستورات Artisan:

برای این کار هم از {--name} استفاده می‌کنیم:

حالا برای دسترسی به آپشن‌ها باید از یک تابع کمک بگیریم:

حالا اگر این option رو توی command line وارد کنیم مقدار true برگشت داده میشه و اگر وارد نکنیم مقدار false.

اما چطور آپشن‌ها رو مقدار پذیر کنیم؟ باید بعد از --age یک مساوی قرار بدیم:

حالا توی کامندلاین وارد می‌کنیم و خروجی می‌گیریم:

نکته: توی تصاویر بالا دیدیم که ما می‌تونیم یک آپشن کوتاه برای آپشن‌های بزرگمون انتخاب کنیم؛ مثلا --A به جای --Age، اما نکتهٔ مهم اینه که اینجا باید آپشن با -- باشه، اما موقع استفاده یا توی help با تک -.

برای دسته‌بندی دستورات:

توی تصویر بالا داریم می‌بینیم که اسم دسته رو در اون آپشن اول آورده:

webprog:greeting


متدهای $this در فایل console.php که در واقع اشاره به Artisan دارد:

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

با متد info می‌تونیم مثل comment داده رو به خروجی بدیم ولی با رنگ سبز. error داده رو با بک‌گراند قرمز و رنگ سفید به خروجی میده، question داده رو با بک‌گراند آبی و متن سفید به خروجی میده.
متد line متن بدون بک‌گراند و سفید رنگ رو عین echo پرینت می‌کنه.

حتی میشه از سیستم تگ بندی هم استفاده کنیم:

متد table برای ایجاد جدول:

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

دریافت ورودی از کاربر:

برای دریافت ورودی، کافیه اون رو توی یک متغیر ذخیره کنیم و هر بلایی خواستیم سرش در بیاریم:

نمونه‌ای از خروجی کار:

آشنایی با متد confirm:

نحوه تغییر دادن مقدار دیفالت در confirm که در حالت عادی برابر با no هست:

مقدار true برابر با yes هست و مقدار false برابر با no.


متد choice برای انتخاب از بین چند گزینه:

تعیین گزینهٔ دیفالت در choice:

تعیین تعداد تلاش برای انتخاب از بین گزینه‌های choice:

در حالت عادی تا زمانی که کاربر مقدار صحیح رو وارد کنه، ادامه پیدا می‌کنه، اما ما می‌تونیم تعداد دفعات attemp رو محدود کنیم:

آخرین آرگومانی هم که متد choice قبول می‌کنه، تعیین حالت multiple هست؛ یعنی امکان انتخاب چندین گزینه وجود داره:

متد کاربردی بعدی، متد secret هست که برای دریافت ورودی حساس مورد استفاده قرار می‌گیره، مثلا دریافت پسورد از کاربر که نمی‌خوایم وقتی کاربر ورودی رو تایپ می کنه روی صفحهٔ کنسول چیزی به نمایش در بیاد:

$pass = $this->secret('Enter your password');

مبحث Generating Commands در لاراول:

برای ایجاد کامند در پوشهٔ Commands در داخل app باید از دستور زیر استفاده کنیم:

php artisan make:command Name

مثلا:

php artisan make:command Greeting

محتویات این فایل به شکل زیره:

خب توی تصویر بالا یک متغیر از نوع protected داریم به اسم signature که مقدار command:name رو داره، command در واقع اسم گروه دستور هست و name اسم دستور ما:

protected $signature = 'group:greeting';

این کلاس یک پروپرتی description هم داره که می‌تونیم توضیحات کامند رو توش قرار بدیم:

دستور make:command یک آپشن داره به اسم --command که می‌تونیم مستقیم اسم گروه و دستور رو توش مشخص کنیم و مجبور نشیم دستی signature رو تغییر بدیم:

php artisan make:command Name --command=group:command_name


دریافت ورودی در Generating Commands:

برای دادن ورودی به کامندهای موجود در app/Commands باید ورودی را در signature دریافت کنیم:

protected $signature = 'group:command_name {name : persion_name} {--A|--age : age}';

حالا کار clouser function رو توی کلاس‌های کامند، متد handle انجام میده:

public function handle()
{
    echo &quotHi &quot.$this->argument('name').&quot, your age is: &quot.$this->option('age');
}

روی $this دقیقا تمامی متدهایی که قبلا در مورشون خوندیم قابل ران شدن هست؛ مثل comment و input و... .

آشنایی با متد کاربردی Call در Artisan:

این متد زمانی کاربرد داره که ما قراره روی هاست اشتراکی سایت خودمون رو deploy کنیم و دسترسی به کامند لاین نداریم؛ پس وقتی کنسولی نباشه، نمی‌تونیم دستورات artisan رو ران کنیم؛ بنابراین باید از این روش استفاده کنیم؛ این روش اینطوری کار می‌کنه که ما یه route تعریف می‌کنیم و وقتی وارد این روت شدیم؛ اون کامند مربوط به artisan ران میشه:

وقتی وارد این route بشیم؛ این میشه خروجی کار:

خب، پس خیلی راحت می‌تونیم Jobهای Queue شده رو Listen و اجرا کنیم:

نکتهٔ مهم در این پروسه اینه که چون http نمی‌تونه پیش از حد منتظر بایسته، و بعد از مدتی timeout error میده، باید از متد once استفاده کنیم و چون once مقداری نمی‌گیره، بهش مقدار true می‌دیم:

توی تصویر بالا true رو نمیشد نشون داد، چون از صفحه ویدئو میزد بیرون، در واقع اینطوریه:

'--once' => true

اما اگر بهش false پاس بدیم؛ دیگه اون آپشن در نظر گرفته نمیشه.


مبحث Tinker:

در واقع Tinker یک REPL خیلی قدرتمند برای لاراوله و مخفف Read Evaluate Print Loop هست؛ REPL یک محیط برنامه‌نویسی تعاملی هست که از کاربر ورودی می‌گیره اون رو ارزیابی می‌کنه و خروجی رو به کاربر میده. مثل console هایی که توی لینوکس و ویندوز داریم. یعنی منتظر می‌مونه بهش یک ورودی بدیم؛ اون رو ارزیابی می‌کنه و نتیجه‌اش رو پرینت می‌کنه و دوباره منتظر دریافت ورودی وایمیسه.

برای دسترسی به Tinker از دستور زیر استفاده می‌کنیم:

php artisan tinker

تصویر زیر محیط تعاملی tinker رو نشون میده:

مثالی از کارکرد این محیط تعاملی در تصویر زیر اومده؛ اومدیم و از مدل User که در App قرار داره متد find رو فراخوانی کردیم و نتیحه رو در $user ذخیره کردیم:

این محیط تعاملی tinker به ما کمک می‌کنه تا یه سری تست‌ها یا عملیات خاص رو بدون نیاز به تعریف روت و کنترلر و... انجام بدیم؛ مثلا خیلی راحت می‌تونیم از doc برای خودندن مستندات یک تابع/... استفاده کنیم:

doc request

یا حتی می‌تونیم کدهای اون رو هم بخونیم: