نسخه:

کنسول Artisan

معرفی

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 پس از پایان اجرای یک فرمان، رویداد ارسال می شود.