کنسول Artisan
- معرفی
- دستورات نوشتن
- تعریف انتظارات ورودی
- دستور I/O
- ثبت دستورات
- اجرای دستورات به صورت برنامه ای
- کنترل سیگنال
- سفارشی سازی خرد
- مناسبت ها
معرفی
Artisan رابط خط فرمان است که در لاراول گنجانده شده است. Artisan در ریشه برنامه شما به عنوان
artisan
اسکریپت وجود دارد و تعدادی دستورات مفید را ارائه می دهد که می تواند در حین ساخت برنامه به شما کمک کند. برای مشاهده لیستی از تمام دستورات Artisan موجود، می توانید از
list
دستور زیر استفاده کنید:
php artisan list
هر دستور همچنین شامل یک صفحه "راهنما" است که آرگومان ها و گزینه های موجود دستور را نمایش و توصیف می کند. برای مشاهده صفحه راهنما، قبل از نام دستور زیر را قرار دهید
help
:
php artisan help migrate
بادبان لاراول
اگر از Laravel Sail
به عنوان محیط توسعه محلی خود
استفاده می کنید ، به یاد داشته باشید که از
sail
خط فرمان برای فراخوانی دستورات Artisan استفاده کنید. Sail دستورات Artisan شما را در کانتینرهای Docker برنامه شما اجرا می کند:
./vendor/bin/sail artisan list
Tinker (REPL)
Laravel Tinker یک REPL قدرتمند برای چارچوب لاراول است که توسط بسته PsySH پشتیبانی می شود .
نصب و راه اندازی
تمام برنامه های لاراول به طور پیش فرض شامل Tinker می شوند. با این حال، اگر قبلاً آن را از برنامه خود حذف کرده اید، می توانید با استفاده از Composer آن را نصب کنید:
composer require laravel/tinker
در هنگام تعامل با برنامه لاراول خود به دنبال بارگذاری مجدد، ویرایش کد چند خطی و تکمیل خودکار هستید؟ تینکرول را بررسی کنید !
استفاده
Tinker به شما امکان می دهد با کل برنامه لاراول خود در خط فرمان تعامل داشته باشید، از جمله مدل های Eloquent، مشاغل، رویدادها و موارد دیگر. برای ورود به محیط Tinker
tinker
دستور Artisan را اجرا کنید:
php artisan tinker
شما می توانید فایل پیکربندی Tinker را با استفاده از
vendor:publish
دستور زیر منتشر کنید:
php artisan vendor:publish --provider="Laravel\Tinker\TinkerServiceProvider"
تابع
dispatch
وdispatch
متد کمکی رویDispatchable
کلاس به جمع آوری زباله برای قرار دادن کار در صف بستگی دارد. بنابراین، هنگام استفاده از tinker، باید از کارها استفاده کنیدBus::dispatch
یاQueue::push
برای ارسال کارها استفاده کنید.
فرمان Allow List
Tinker از یک لیست "اجازه" استفاده می کند تا تعیین کند کدام دستورات Artisan مجاز به اجرا در پوسته آن هستند. به طور پیش فرض، می توانید
دستورات
clear-compiled
،،،،،،
و
را
اجرا
down
کنید
. اگر می خواهید دستورات بیشتری را مجاز کنید، می توانید آنها را به
آرایه موجود در
فایل پیکربندی خود اضافه کنید:
env
inspire
migrate
optimize
up
commands
tinker.php
'commands' => [ // App\Console\Commands\ExampleCommand::class,],
کلاس هایی که نباید مستعار شوند
به طور معمول، Tinker به طور خودکار کلاس ها را با نام مستعار زمانی که شما با آنها در Tinker تعامل می کنید، نام گذاری می کند. با این حال، ممکن است بخواهید هرگز برخی از کلاس ها را مستعار نکنید. شما می توانید این کار را با لیست کردن کلاس ها در
dont_alias
آرایه فایل پیکربندی خود انجام دهید
tinker.php
:
'dont_alias' => [ App\Models\User::class,],
دستورات نوشتن
علاوه بر دستورات ارائه شده با Artisan، می توانید دستورات سفارشی خود را بسازید. دستورات معمولاً در
app/Console/Commands
دایرکتوری ذخیره می شوند. با این حال، شما آزاد هستید که مکان ذخیره سازی خود را انتخاب کنید تا زمانی که دستورات شما توسط Composer بارگیری شود.
تولید دستورات
برای ایجاد یک دستور جدید، می توانید از
make:command
دستور Artisan استفاده کنید. این دستور یک کلاس دستوری جدید در
app/Console/Commands
دایرکتوری ایجاد می کند. اگر این دایرکتوری در برنامه شما وجود ندارد نگران نباشید - اولین باری که
make:command
دستور Artisan را اجرا می کنید ایجاد می شود:
php artisan make:command SendEmails
ساختار فرماندهی
پس از تولید دستور خود، باید مقادیر مناسبی را برای خصوصیات
signature
و
description
خصوصیات کلاس تعریف کنید. این ویژگی ها هنگام نمایش دستور شما بر روی صفحه استفاده می شود
list
. این ویژگی همچنین به شما امکان می دهد
انتظارات ورودی فرمان خود را
signature
تعریف کنید
. زمانی که دستور شما اجرا شود
متد
فراخوانی می شود. می توانید منطق فرمان خود را در این متد قرار دهید.
handle
بیایید به یک دستور مثال نگاهی بیندازیم. توجه داشته باشید که ما می توانیم هر وابستگی مورد نیاز خود را از طریق
handle
متد دستور درخواست کنیم.
کانتینر سرویس
لاراول
به طور خودکار تمام وابستگی هایی را که در امضای این متد به صورت تایپ مشخص شده اند تزریق می کند:
<?php namespace App\Console\Commands; use App\Models\User;use App\Support\DripEmailer;use Illuminate\Console\Command; class SendEmails extends Command{ /** * The name and signature of the console command. * * @var string */ protected $signature = 'mail:send {user}'; /** * The console command description. * * @var string */ protected $description = 'Send a marketing email to a user'; /** * Execute the console command. */ public function handle(DripEmailer $drip): void { $drip->send(User::find($this->argument('user'))); }}
برای استفاده مجدد بیشتر از کد، تمرین خوبی است که دستورات کنسول خود را سبک نگه دارید و به آنها اجازه دهید تا برای انجام وظایف خود به سرویس های برنامه موکول شوند. در مثال بالا، توجه داشته باشید که ما یک کلاس خدماتی را برای انجام "بالا بردن سنگین" ارسال ایمیل ها تزریق می کنیم.
دستورات بستن
دستورات مبتنی بر بسته شدن، جایگزینی برای تعریف دستورات کنسول به عنوان کلاس ارائه میکنند. همانطور که بسته شدن مسیرها جایگزینی برای کنترلرها هستند، بسته شدن فرمان را به عنوان جایگزینی برای کلاس های فرمان در نظر بگیرید.
حتی اگر
routes/console.php
فایل فایل مسیرهای HTTP را تعریف نمی کند، نقاط ورودی (مسیرها) مبتنی بر کنسول را در برنامه شما تعریف می کند. در این فایل، می توانید تمام دستورات کنسول مبتنی بر بسته شدن خود را با استفاده از
Artisan::command
روش تعریف کنید. این
command
متد دو آرگومان را می پذیرد:
امضای فرمان
و یک بسته که آرگومان ها و گزینه های فرمان را دریافت می کند:
Artisan::command('mail:send {user}', function (string $user) { $this->info("Sending email to: {$user}!");});
بسته شدن مربوط به نمونه دستور زیرین است، بنابراین شما به تمام روشهای کمکی که معمولاً در یک کلاس فرمان کامل میتوانید به آنها دسترسی داشته باشید، دسترسی کامل دارید.
وابستگی های نوع اشاره
بسته شدن فرمان علاوه بر دریافت آرگومانها و گزینههای فرمان شما، ممکن است وابستگیهای دیگری را نیز تایپ کند که میخواهید خارج از کانتینر سرویس برطرف شوند :
use App\Models\User;use App\Support\DripEmailer; Artisan::command('mail:send {user}', function (DripEmailer $drip, string $user) { $drip->send(User::find($user));});
توضیحات فرمان بستن
هنگام تعریف یک دستور مبتنی بر بسته شدن، می توانید از
purpose
روشی برای اضافه کردن توضیحات به دستور استفاده کنید. هنگامی که دستورات
php artisan list
یا را
اجرا می کنید، این توضیحات نمایش داده می شود
php artisan help
:
Artisan::command('mail:send {user}', function (string $user) { // ...})->purpose('Send a marketing email to a user');
دستورات قابل جداسازی
برای استفاده از این ویژگی، برنامه شما باید از
memcached
,redis
,dynamodb
,database
,file
یاarray
کش به عنوان درایور کش پیش فرض برنامه شما استفاده کند. علاوه بر این، همه سرورها باید با یک سرور حافظه مرکزی یکسان در ارتباط باشند.
گاهی اوقات ممکن است بخواهید اطمینان حاصل کنید که فقط یک نمونه از یک دستور می تواند در یک زمان اجرا شود. برای انجام این کار، می توانید
Illuminate\Contracts\Console\Isolatable
اینترفیس را در کلاس فرمان خود پیاده سازی کنید:
<?php namespace App\Console\Commands; use Illuminate\Console\Command;use Illuminate\Contracts\Console\Isolatable; class SendEmails extends Command implements Isolatable{ // ...}
هنگامی که یک فرمان به عنوان علامت گذاری می شود ، لاراول به طور خودکار
گزینه ای را به دستور
Isolatable
اضافه می کند .
--isolated
هنگامی که دستور با آن گزینه فراخوانی می شود، لاراول اطمینان حاصل می کند که هیچ نمونه دیگری از آن دستور در حال اجرا نیست. لاراول این کار را با تلاش برای به دست آوردن یک قفل اتمی با استفاده از درایور کش پیش فرض برنامه شما انجام می دهد. اگر نمونه های دیگری از دستور در حال اجرا باشند، دستور اجرا نمی شود. با این حال، دستور همچنان با یک کد وضعیت خروج موفق خارج می شود:
php artisan mail:send 1 --isolated
اگر می خواهید کد وضعیت خروجی را مشخص کنید که در صورت عدم اجرای دستور باید آن را برگرداند، می توانید کد وضعیت مورد نظر را از طریق گزینه ارائه کنید
isolated
:
php artisan mail:send 1 --isolated=12
شناسه قفل
به طور پیش فرض، لاراول از نام دستور برای تولید کلید رشته ای استفاده می کند که برای به دست آوردن قفل اتمی در حافظه نهان برنامه شما استفاده می شود. با این حال، میتوانید این کلید را با تعریف
isolatableId
متدی در کلاس فرمان Artisan شخصیسازی کنید، که به شما امکان میدهد آرگومانها یا گزینههای فرمان را در کلید ادغام کنید:
/** * Get the isolatable ID for the command. */public function isolatableId(): string{ return $this->argument('user');}
قفل زمان انقضا
به طور پیش فرض، قفل های ایزوله پس از پایان فرمان منقضی می شوند. یا اگر دستور قطع شود و قادر به اتمام نباشد، قفل پس از یک ساعت منقضی می شود. با این حال، می توانید زمان انقضای قفل را با تعریف
isolationLockExpiresAt
روشی در دستور خود تنظیم کنید:
use DateTimeInterface;use DateInterval; /** * Determine when an isolation lock expires for the command. */public function isolationLockExpiresAt(): DateTimeInterface|DateInterval{ return now()->addMinutes(5);}
تعریف انتظارات ورودی
هنگام نوشتن دستورات کنسول، جمع آوری ورودی از کاربر از طریق آرگومان ها یا گزینه ها معمول است. لاراول تعریف ورودی مورد انتظار کاربر را با استفاده
signature
از ویژگی دستورات شما بسیار راحت می کند. این
signature
ویژگی به شما امکان میدهد نام، آرگومانها و گزینههای دستور را در یک نحو منفرد، رسا و مسیر مانند تعریف کنید.
استدلال ها
همه آرگومان ها و گزینه های ارائه شده توسط کاربر در پرانتزهای فرفری پیچیده شده اند. در مثال زیر، دستور یک آرگومان مورد نیاز را تعریف می کند
user
:
/** * The name and signature of the console command. * * @var string */protected $signature = 'mail:send {user}';
همچنین می توانید آرگومان ها را اختیاری کنید یا مقادیر پیش فرض را برای آرگومان ها تعریف کنید:
// Optional argument...'mail:send {user?}' // Optional argument with default value...'mail:send {user=foo}'
گزینه ها
گزینهها، مانند آرگومانها، شکل دیگری از ورودی کاربر هستند.
--
هنگامی که گزینه ها از طریق خط فرمان ارائه می شوند،
با دو خط فاصله ( ) پیشوند می شوند .
دو نوع گزینه وجود دارد: آنهایی که یک مقدار دریافت می کنند و آنهایی که دریافت نمی کنند. گزینه هایی که مقداری دریافت نمی کنند به عنوان یک "سوئیچ" بولی عمل می کنند. بیایید نگاهی به نمونه ای از این نوع گزینه بیندازیم:
/** * The name and signature of the console command. * * @var string */protected $signature = 'mail:send {user} {--queue}';
در این مثال،
--queue
سوئیچ ممکن است هنگام فراخوانی دستور Artisan مشخص شود. اگر
--queue
سوئیچ پاس شود، مقدار گزینه خواهد بود
true
. در غیر این صورت، مقدار این خواهد بود
false
:
php artisan mail:send 1 --queue
گزینه های با ارزش
در مرحله بعد، بیایید نگاهی به گزینه ای بیندازیم که انتظار یک مقدار را دارد. اگر کاربر باید مقداری را برای یک گزینه مشخص کند، باید نام گزینه را با یک
=
علامت پسوند کنید:
/** * The name and signature of the console command. * * @var string */protected $signature = 'mail:send {user} {--queue=}';
در این مثال، کاربر ممکن است مقداری را برای گزینه ای مانند آن ارسال کند. اگر هنگام فراخوانی دستور، گزینه مشخص نشده باشد، مقدار آن به صورت زیر خواهد بود
null
:
php artisan mail:send 1 --queue=default
می توانید با تعیین مقدار پیش فرض پس از نام گزینه، مقادیر پیش فرض را به گزینه ها اختصاص دهید. اگر هیچ مقدار گزینه ای توسط کاربر ارسال نشود، از مقدار پیش فرض استفاده می شود:
'mail:send {user} {--queue=default}'
میانبرهای گزینه
برای اختصاص یک میانبر هنگام تعریف یک گزینه، می توانید آن را قبل از نام گزینه مشخص کنید و از
|
کاراکتر به عنوان جداکننده برای جدا کردن میانبر از نام کامل گزینه استفاده کنید:
'mail:send {user} {--Q|queue}'
هنگام فراخوانی دستور در ترمینال خود، میانبرهای گزینه باید با یک خط فاصله پیشوند شوند و
=
هنگام تعیین مقدار برای گزینه، هیچ کاراکتری درج نشود:
php artisan mail:send 1 -Qdefault
آرایه های ورودی
اگر میخواهید آرگومانها یا گزینههایی برای انتظار مقادیر ورودی چندگانه تعریف کنید، میتوانید از
*
کاراکتر استفاده کنید. ابتدا، بیایید به مثالی نگاه کنیم که چنین استدلالی را مشخص می کند:
'mail:send {user*}'
هنگام فراخوانی این متد،
user
آرگومان ها ممکن است به خط فرمان ارسال شوند. به عنوان مثال، دستور زیر مقدار
user
یک آرایه را با
1
و
2
به عنوان مقادیر آن تنظیم می کند:
php artisan mail:send 1 2
این
*
کاراکتر را می توان با یک تعریف آرگومان اختیاری ترکیب کرد تا اجازه صفر یا چند نمونه از یک آرگومان را بدهد:
'mail:send {user?*}'
آرایه های گزینه
هنگام تعریف گزینه ای که انتظار چندین مقدار ورودی دارد، هر مقدار گزینه ارسال شده به فرمان باید با نام گزینه پیشوند شود:
'mail:send {--id=*}'
چنین دستوری ممکن است با ارسال چندین
--id
آرگومان فراخوانی شود:
php artisan mail:send --id=1 --id=2
توضیحات ورودی
میتوانید با جدا کردن نام آرگومان از توضیحات با استفاده از دو نقطه، توضیحاتی را به آرگومانهای ورودی و گزینهها اختصاص دهید. اگر برای تعریف دستور خود به فضای کمی نیاز دارید، با خیال راحت این تعریف را در چندین خط پخش کنید:
/** * The name and signature of the console command. * * @var string */protected $signature = 'mail:send {user : The ID of the user} {--queue : Whether the job should be queued}';
درخواست ورودی گمشده
اگر دستور شما حاوی آرگومان های مورد نیاز باشد، کاربر در صورت عدم ارائه یک پیغام خطا دریافت می کند. از طرف دیگر، میتوانید فرمان خود را به گونهای پیکربندی کنید که بهطور خودکار هنگام گم شدن آرگومانهای مورد نیاز، با پیادهسازی
PromptsForMissingInput
رابط، از کاربر درخواست کند:
<?php namespace App\Console\Commands; use Illuminate\Console\Command;use Illuminate\Contracts\Console\PromptsForMissingInput; class SendEmails extends Command implements PromptsForMissingInput{ /** * The name and signature of the console command. * * @var string */ protected $signature = 'mail:send {user}'; // ...}
اگر لاراول نیاز به جمع آوری یک آرگومان مورد نیاز از کاربر داشته باشد، به طور خودکار با بیان هوشمندانه سوال با استفاده از نام آرگومان یا توضیحات، از کاربر آرگومان می خواهد. اگر میخواهید سؤالی را که برای جمعآوری آرگومان مورد نیاز استفاده میشود سفارشی کنید، میتوانید این
promptForMissingArgumentsUsing
روش را پیادهسازی کنید و آرایهای از سؤالات کلید خورده با نام آرگومانها را برگردانید:
/** * Prompt for missing input arguments using the returned questions. * * @return array<string, string> */protected function promptForMissingArgumentsUsing(): array{ return [ 'user' => 'Which user ID should receive the mail?', ];}
همچنین میتوانید با استفاده از یک تاپل حاوی سؤال و مکاننما، متن مکاندار ارائه کنید:
return [ 'user' => ['Which user ID should receive the mail?', 'E.g. 123'],];
اگر میخواهید کنترل کاملی روی درخواست داشته باشید، میتوانید بستهای را ارائه کنید که باید از کاربر خواسته شود و پاسخ او را برگرداند:
use App\Models\User;use function Laravel\Prompts\search; // ... return [ 'user' => fn () => search( label: 'Search for a user:', placeholder: 'E.g. Taylor Otwell', options: fn ($value) => strlen($value) > 0 ? User::where('name', 'like', "%{$value}%")->pluck('name', 'id')->all() : [] ),];
مستندات جامع Laravel Prompts شامل اطلاعات اضافی در مورد دستورهای موجود و استفاده از آنها است.
اگر میخواهید از کاربر بخواهید که
گزینهها را
انتخاب یا وارد کنید ، میتوانید دستورات را در روش دستور خود بگنجانید
handle
. با این حال، اگر میخواهید فقط زمانی از کاربر درخواست کنید که آرگومانهای گمشده بهطور خودکار از او خواسته شود، میتوانید این
afterPromptingForMissingArguments
روش را پیادهسازی کنید:
use Symfony\Component\Console\Input\InputInterface;use Symfony\Component\Console\Output\OutputInterface;use function Laravel\Prompts\confirm; // ... /** * Perform actions after the user was prompted for missing arguments. */protected function afterPromptingForMissingArguments(InputInterface $input, OutputInterface $output): void{ $input->setOption('queue', confirm( label: 'Would you like to queue the mail?', default: $this->option('queue') ));}
دستور I/O
بازیابی ورودی
در حالی که فرمان شما در حال اجرا است، احتمالاً باید به مقادیر آرگومان ها و گزینه های پذیرفته شده توسط فرمان خود دسترسی داشته باشید. برای انجام این کار، می توانید از روش
argument
و استفاده کنید
option
. اگر آرگومان یا گزینه ای وجود نداشته باشد،
null
برگردانده می شود:
/** * Execute the console command. */public function handle(): void{ $userId = $this->argument('user');}
اگر می خواهید همه آرگومان ها را به صورت یک بازیابی کنید
array
، متد را فراخوانی کنید
arguments
:
$arguments = $this->arguments();
گزینه ها ممکن است به آسانی آرگومان ها با استفاده از
option
روش بازیابی شوند. برای بازیابی همه گزینه ها به عنوان یک آرایه،
options
متد را فراخوانی کنید:
// Retrieve a specific option...$queueName = $this->option('queue'); // Retrieve all options as an array...$options = $this->options();
درخواست ورودی
Laravel Prompts یک بسته PHP برای افزودن فرمهای زیبا و کاربرپسند به برنامههای خط فرمان شما، با ویژگیهای مرورگر مانند متن مکاننما و اعتبارسنجی است.
علاوه بر نمایش خروجی، ممکن است از کاربر بخواهید که در هنگام اجرای دستور شما ورودی ارائه دهد. این
ask
روش از کاربر سوال داده شده را درخواست می کند، ورودی او را می پذیرد و سپس ورودی کاربر را به دستور شما برمی گرداند:
/** * Execute the console command. */public function handle(): void{ $name = $this->ask('What is your name?'); // ...}
این
ask
متد یک آرگومان دوم اختیاری را نیز می پذیرد که مقدار پیش فرضی را که در صورت عدم ارائه ورودی کاربر باید برگردانده شود را مشخص می کند:
$name = $this->ask('What is your name?', 'Taylor');
روش
secret
مشابه است
ask
، اما ورودی کاربر هنگام تایپ در کنسول برای آنها قابل مشاهده نخواهد بود. این روش هنگام درخواست اطلاعات حساس مانند رمز عبور مفید است:
$password = $this->secret('What is the password?');
درخواست تایید
اگر نیاز دارید که از کاربر یک تأیید ساده «بله یا نه» بخواهید، میتوانید از این
confirm
روش استفاده کنید. به طور پیش فرض، این روش برمی گردد
false
. با این حال، اگر کاربر وارد شود
y
یا
yes
در پاسخ به درخواست، متد برمیگردد
true
.
if ($this->confirm('Do you wish to continue?')) { // ...}
در صورت لزوم، می توانید تعیین کنید که درخواست تایید باید
true
به طور پیش فرض با ارسال
true
آرگومان دوم به
confirm
متد بازگردد:
if ($this->confirm('Do you wish to continue?', true)) { // ...}
تکمیل خودکار
این
anticipate
روش می تواند برای ارائه تکمیل خودکار برای انتخاب های احتمالی استفاده شود. کاربر همچنان می تواند هر پاسخی را بدون توجه به نکات تکمیل خودکار ارائه دهد:
$name = $this->anticipate('What is your name?', ['Taylor', 'Dayle']);
از طرف دیگر، ممکن است یک بسته را به عنوان آرگومان دوم برای
anticipate
متد ارسال کنید. هر بار که کاربر یک کاراکتر ورودی را تایپ می کند، بسته شدن فراخوانی می شود. بسته شدن باید یک پارامتر رشتهای که تا کنون حاوی ورودی کاربر است را بپذیرد و آرایهای از گزینهها را برای تکمیل خودکار بازگرداند:
$name = $this->anticipate('What is your address?', function (string $input) { // Return auto-completion options...});
سوالات چند گزینه ای
اگر لازم است هنگام پرسیدن سوال به کاربر مجموعه ای از انتخاب های از پیش تعریف شده بدهید، می توانید از این
choice
روش استفاده کنید. اگر هیچ گزینه ای انتخاب نشده باشد، می توانید با ارسال ایندکس به عنوان آرگومان سوم به متد، فهرست آرایه را با مقدار پیش فرض بازگردانید:
$name = $this->choice( 'What is your name?', ['Taylor', 'Dayle'], $defaultIndex);
علاوه بر این، این
choice
روش آرگومان های چهارم و پنجم اختیاری را برای تعیین حداکثر تعداد تلاش ها برای انتخاب یک پاسخ معتبر و مجاز بودن انتخاب های متعدد می پذیرد:
$name = $this->choice( 'What is your name?', ['Taylor', 'Dayle'], $defaultIndex, $maxAttempts = null, $allowMultipleSelections = false);
خروجی نوشتن
برای ارسال خروجی به کنسول، میتوانید از روشهای
line
,
info
,
comment
,
question
,
warn
و استفاده کنید
error
. هر یک از این روش ها از رنگ های ANSI مناسب برای هدف خود استفاده می کنند. به عنوان مثال، اجازه دهید برخی از اطلاعات عمومی را به کاربر نمایش دهیم. به طور معمول، این
info
روش در کنسول به صورت متن سبز رنگ نمایش داده می شود:
/** * Execute the console command. */public function handle(): void{ // ... $this->info('The command was successful!');}
برای نمایش پیغام خطا از
error
روش استفاده کنید. متن پیام خطا معمولاً با رنگ قرمز نمایش داده می شود:
$this->error('Something went wrong!');
می توانید از
line
روش برای نمایش متن ساده و بدون رنگ استفاده کنید:
$this->line('Display this on the screen');
newLine
برای نمایش یک خط خالی
می توانید از روش زیر استفاده کنید :
// Write a single blank line...$this->newLine(); // Write three blank lines...$this->newLine(3);
جداول
این
table
روش قالب بندی صحیح چندین ردیف / ستون داده را آسان می کند. تنها کاری که باید انجام دهید این است که نام ستون ها و داده های جدول را ارائه دهید و لاراول به طور خودکار عرض و ارتفاع جدول را برای شما محاسبه می کند:
use App\Models\User; $this->table( ['Name', 'Email'], User::all(['name', 'email'])->toArray());
نوارهای پیشرفت
برای کارهای طولانی مدت، نشان دادن یک نوار پیشرفت که به کاربران اطلاع می دهد کار چقدر کامل است، می تواند مفید باشد. با استفاده از این
withProgressBar
روش، لاراول یک نوار پیشرفت نمایش می دهد و پیشرفت آن را برای هر تکرار بر روی یک مقدار قابل تکرار معین پیش می برد:
use App\Models\User; $users = $this->withProgressBar(User::all(), function (User $user) { $this->performTask($user);});
گاهی اوقات، ممکن است به کنترل دستی بیشتری در مورد چگونگی پیشرفت نوار پیشرفت نیاز داشته باشید. ابتدا تعداد کل مراحلی که فرآیند طی آن تکرار می شود را مشخص کنید. سپس، پس از پردازش هر مورد، نوار پیشرفت را پیش ببرید:
$users = App\Models\User::all(); $bar = $this->output->createProgressBar(count($users)); $bar->start(); foreach ($users as $user) { $this->performTask($user); $bar->advance();} $bar->finish();
برای گزینههای پیشرفتهتر، مستندات مؤلفه نوار پیشرفت Symfony را بررسی کنید .
ثبت دستورات
به طور پیش فرض، لاراول به طور خودکار تمام دستورات را در
app/Console/Commands
دایرکتوری ثبت می کند. با این حال، میتوانید به لاراول دستور دهید تا دایرکتوریهای دیگر را برای دستورات Artisan با استفاده از
withCommands
روش موجود در فایل برنامهتان اسکن کند
bootstrap/app.php
:
->withCommands([ __DIR__.'../app/Domain/Orders/Commands',])
در صورت لزوم، می توانید با ارائه نام کلاس دستور به
withCommands
روش، دستورات را به صورت دستی ثبت کنید:
use App\Domain\Orders\Commands\SendEmails; ->withCommands([ SendEmails::class,])
هنگامی که Artisan بوت می شود، تمام دستورات موجود در برنامه شما توسط کانتینر سرویس حل شده و در Artisan ثبت می شود.
اجرای دستورات به صورت برنامه ای
گاهی اوقات ممکن است بخواهید دستور Artisan را خارج از CLI اجرا کنید. برای مثال، ممکن است بخواهید یک دستور Artisan را از یک مسیر یا کنترلر اجرا کنید.
برای انجام این کار
می توانید از
call
روش روی نما استفاده کنید.
Artisan
متد
call
نام امضای فرمان یا نام کلاس را به عنوان اولین آرگومان خود و آرایه ای از پارامترهای فرمان را به عنوان آرگومان دوم می پذیرد. کد خروج برگردانده می شود:
use Illuminate\Support\Facades\Artisan; Route::post('/user/{user}/mail', function (string $user) { $exitCode = Artisan::call('mail:send', [ 'user' => $user, '--queue' => 'default' ]); // ...});
از طرف دیگر، می توانید کل دستور Artisan را
call
به عنوان یک رشته به متد ارسال کنید:
Artisan::call('mail:send 1 --queue=default');
عبور مقادیر آرایه
اگر دستور شما گزینه ای را تعریف می کند که یک آرایه را می پذیرد، می توانید یک آرایه از مقادیر را به آن گزینه ارسال کنید:
use Illuminate\Support\Facades\Artisan; Route::post('/mail', function () { $exitCode = Artisan::call('mail:send', [ '--id' => [5, 13] ]);});
عبور از مقادیر بولی
اگر نیاز به تعیین مقدار گزینه ای دارید که مقادیر رشته ای را نمی پذیرد، مانند پرچم
--force
روی
migrate:refresh
دستور، باید
true
یا
false
به عنوان مقدار گزینه را ارسال کنید:
$exitCode = Artisan::call('migrate:refresh', [ '--force' => true,]);
دستورات صنعتگر صف
با استفاده از
queue
روش روی نما، حتی ممکن است دستورات Artisan را در صف قرار دهید تا در پسزمینه توسط
کارگران صف
Artisan
پردازش شوند
. قبل از استفاده از این روش، مطمئن شوید که صف خود را پیکربندی کرده اید و یک شنونده صف اجرا می کنید:
use Illuminate\Support\Facades\Artisan; Route::post('/user/{user}/mail', function (string $user) { Artisan::queue('mail:send', [ 'user' => $user, '--queue' => 'default' ]); // ...});
با استفاده از
onConnection
و
onQueue
متدها، میتوانید اتصال یا صفی را که دستور Artisan باید به آن ارسال شود را مشخص کنید:
Artisan::queue('mail:send', [ 'user' => 1, '--queue' => 'default'])->onConnection('redis')->onQueue('commands');
فراخوانی دستورات از دستورات دیگر
گاهی اوقات ممکن است بخواهید دستورات دیگری را از یک دستور Artisan موجود فراخوانی کنید. شما می توانید این کار را با استفاده از
call
روش انجام دهید. این
call
متد نام فرمان و آرایهای از آرگومانها/گزینههای فرمان را میپذیرد:
/** * Execute the console command. */public function handle(): void{ $this->call('mail:send', [ 'user' => 1, '--queue' => 'default' ]); // ...}
اگر میخواهید فرمان کنسول دیگری را فراخوانی کنید و تمام خروجی آن را متوقف کنید، میتوانید از این
callSilently
روش استفاده کنید. متد
callSilently
امضای مشابه متد دارد
call
:
$this->callSilently('mail:send', [ 'user' => 1, '--queue' => 'default']);
کنترل سیگنال
همانطور که می دانید، سیستم عامل ها اجازه می دهند سیگنال ها به فرآیندهای در حال اجرا ارسال شوند. به عنوان مثال،
SIGTERM
سیگنال این است که چگونه سیستم عامل ها از یک برنامه می خواهند تا پایان یابد. اگر میخواهید به سیگنالها در فرمانهای کنسول Artisan گوش دهید و در صورت وقوع کد را اجرا کنید، میتوانید از
trap
روش زیر استفاده کنید:
/** * Execute the console command. */public function handle(): void{ $this->trap(SIGTERM, fn () => $this->shouldKeepRunning = false); while ($this->shouldKeepRunning) { // ... }}
برای گوش دادن همزمان چندین سیگنال، میتوانید آرایهای از سیگنالها را به
trap
روش ارائه دهید:
$this->trap([SIGTERM, SIGQUIT], function (int $signal) { $this->shouldKeepRunning = false; dump($signal); // SIGTERM / SIGQUIT});
سفارشی سازی خرد
دستورات کنسول Artisan
make
برای ایجاد کلاسهای مختلف مانند کنترلرها، جابها، مهاجرتها و تستها استفاده میشود. این کلاس ها با استفاده از فایل های "خرد" که با مقادیر بر اساس ورودی شما پر شده اند، تولید می شوند. با این حال، ممکن است بخواهید تغییرات کوچکی در فایل های تولید شده توسط Artisan ایجاد کنید. برای انجام این کار، میتوانید از
stub:publish
دستور انتشار رایجترین موارد خرد در برنامه خود استفاده کنید تا بتوانید آنها را سفارشی کنید:
php artisan stub:publish
stubs
مقالات خرد منتشر شده در یک فهرست در ریشه برنامه شما
قرار خواهند گرفت . هر تغییری که در این خردهها ایجاد کنید، زمانی که کلاسهای مربوط به آنها را با استفاده از
make
دستورات
Artisan ایجاد کنید، منعکس میشود .
مناسبت ها
Artisan سه رویداد را هنگام اجرای دستورات ارسال می کند:
Illuminate\Console\Events\ArtisanStarting
,
Illuminate\Console\Events\CommandStarting
و
Illuminate\Console\Events\CommandFinished
. این
ArtisanStarting
رویداد بلافاصله هنگامی که Artisan شروع به اجرا می کند، ارسال می شود. در مرحله بعد،
CommandStarting
رویداد بلافاصله قبل از اجرای یک فرمان ارسال می شود. در نهایت،
CommandFinished
پس از پایان اجرای یک فرمان، رویداد ارسال می شود.