الفرق بين المراجعتين لصفحة: «Laravel/artisan»

من موسوعة حسوب
لا ملخص تعديل
 
(9 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة)
سطر 1: سطر 1:
=== مقدمة ===
<noinclude>{{DISPLAYTITLE:الأمر Artisan console) Artisan) في  Laravel}}</noinclude>
Artisan هي واجهة الأوامر المُرفقة ب Laravel. وهي تُوفّر عددًا من الأوامر المفيدة والتي ستساعدك في بناء التطبيق. لإظهار جميع الأوامر التي يوفّرها artisan، يمكنك استعمال الأمر <code>list</code><syntaxhighlight lang="php">
== مقدمة ==
Artisan هي واجهة الأوامر المُرفقة ب [[Laravel]]. وهي تُوفّر عددًا من الأوامر المفيدة والتي ستساعدك في بناء التطبيق. لإظهار جميع الأوامر التي يوفّرها Artisan، يمكنك استعمال الأمر <code>list</code><syntaxhighlight lang="php">
php artisan list
php artisan list
</syntaxhighlight>
</syntaxhighlight>


يحتوي كل أمر على صفحة مساعدة "help" تعرّف وتوضّح الأمر كما تُقدّم قائمة المعاملات والخيارات لكل أمر. يُستعمل الأمر مسبوقًا بالكلمة help لإظهار صفحة المساعدة:<syntaxhighlight lang="php">
يحتوي كل أمر على صفحة مساعدة "help" تعرّف وتوضّح الأمر كما تُقدّم قائمة المعاملات والخيارات لكل أمر. يُستعمل الأمر مسبوقًا بالكلمة <code>help</code> لإظهار صفحة المساعدة:<syntaxhighlight lang="php">
php artisan help migrate
php artisan help migrate
</syntaxhighlight>
</syntaxhighlight>


==== Laravel REPL ====
=== Laravel REPL ===
تأتي كل تطبيقات Laravel مُرفَقَةً ب Tinker، وهي REPL مشغّلة بواسطة حُزمة PsySH. يسمح Tinker بالتفاعل مع كافّة مكوّنات التطبيق من سطر الأوامر بما في ذلك رابط الكائنات بالعلاقات Eloquent، والمهام، و الأحداث و غيرها الكثير. للدخول لبيئة Tinker، استعمل الأمر tinker:
تأتي كل تطبيقات Laravel مُرفَقَةً ب Tinker، وهي REPL مشغّلة بواسطة حُزمة PsySH. يسمح Tinker بالتفاعل مع كافّة مكوّنات التطبيق من سطر الأوامر بما في ذلك رابط الكائنات بالعلاقات [[Laravel/eloquent|Eloquent]]، والمهام، و الأحداث و غيرها الكثير. للدخول لبيئة Tinker، استعمل الأمر <code>tinker</code>:
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
php artisan tinker
php artisan tinker
</syntaxhighlight>
</syntaxhighlight>


=== كتابة الأوامر ===
== كتابة الأوامر ==
بالإضافة للأوامر التي يُوفّرها artisan، يمكنك إنشاء أوامرك الخاصّة. هذه الأوامر تحفظ عادةً في الدليل <code>app/console/Commands</code>. لكن يمكنك اختيار مكان حفظ خاص بك طالما بإمكان composer تحميل الأوامر.
بالإضافة للأوامر التي يُوفّرها artisan، يمكنك إنشاء أوامرك الخاصّة. هذه الأوامر تحفظ عادةً في الدليل <code>app/console/Commands</code>. لكن يمكنك اختيار مكان حفظ خاص بك طالما بإمكان composer تحميل الأوامر.


==== توليد الأوامر ====
=== توليد الأوامر ===
لتوليد أمر جديد، استعمل الأمر make:command. سينشئ هذا الأمر صنف أوامر جديدًا في الدليل <code>app/Console/Commands</code>. إن لم يكن الدليل موجودا في التطبيق فإن الأمر سينشئه أول مرّة يُنفّذ فيها. سيحتوي الأمر المنشأ على الخصائص والتوابع المبدئية الحاضرة في كل الأوامر:<syntaxhighlight lang="php">
لتوليد أمر جديد، استعمل الأمر <code>make:command</code>. سينشئ هذا الأمر صنف أوامر جديدًا في الدليل <code>app/Console/Commands</code>. إن لم يكن الدليل موجودا في التطبيق فإن الأمر سينشئه أول مرّة يُنفّذ فيها. سيحتوي الأمر المنشأ على الخصائص والتوابع المبدئية الحاضرة في كل الأوامر:<syntaxhighlight lang="php">
php artisan make:command SendEmails
php artisan make:command SendEmails
</syntaxhighlight>
</syntaxhighlight>


==== هيكلة الأمر ====
=== هيكلة الأمر ===
بعد توليد الأمر، يجب ملأ الخاصّيتين signature وdescription في الصنف، والذين سيُستعملان حين إظهار الأمر الجديد في الصفحة list. سيُنادى التابع handle حين تنفيذ الأمر، يمكنك وضع منطق عمل الأمر في هذا التابع.
بعد توليد الأمر، يجب ملأ الخاصّيتين <code>signature</code> <code>وdescription</code> في الصنف، والذين سيُستعملان حين إظهار الأمر الجديد في الصفحة list. سيُنادى التابع <code>handle</code> حين تنفيذ الأمر، يمكنك وضع منطق عمل الأمر في هذا التابع.


<u>ملاحظة</u> : لاستعمالٍ أمثل للأمر، يفضّل إبقاء الأمر خفيفا وتحويل المهام الثقيلة لبقية خدمات التطبيق. في المثال الموالي لاحظ أننا نحقن صنف خدمات ليرسل الرسائل.
<u>ملاحظة</u> : لاستعمالٍ أمثل للأمر، يفضّل إبقاء الأمر خفيفا وتحويل المهام الثقيلة لبقية خدمات التطبيق. في المثال الموالي لاحظ أننا نحقن صنف خدمات ليرسل الرسائل.


لنلق نظرة على المثال الموالي، لاحظ أنّه بإمكاننا إضافة أي اعتماديات قد نحتاجها للدّالة البانية أو للتابع handle.ستضيف حاوية الخدمات service container في Laravel تلقائيا كل الاعتماديات المذكورة في الدالة البانية أو في التابع handle:<syntaxhighlight lang="php">
لنلق نظرة على المثال الموالي، لاحظ أنّه بإمكاننا إضافة أي اعتماديات قد نحتاجها للدّالة البانية أو للتابع <code>handle</code>.ستضيف [[Laravel/container|حاوي الخدمات في Laravel]] تلقائيا كل الاعتماديات المذكورة في الدالة البانية أو في التابع <code>handle</code>:<syntaxhighlight lang="php">
<?php
<?php


سطر 82: سطر 83:
</syntaxhighlight>
</syntaxhighlight>


==== أوامر النطاق المغلق Closure ====
=== أوامر النطاق المغلق Closure ===
تُقدّم الأوامر المبنية على النطاق المغلق Closure بديلًا عن الأوامر المُعرَّفة كأصناف. كما تعوِّض مسارات النطاق المغلق Closure وحدات الأوامر. يمكن اعتبار أوامر النطاق المغلق Closure معوِّضاً لأصناف الأوامر. في تابع command من الملف <code>app/Console/Kernel.php</code> ، يحمّل Laravel الملف <code>routes/console.php</code>:<syntaxhighlight lang="php">
تُقدّم الأوامر المبنية على النطاق المغلق Closure بديلًا عن الأوامر المُعرَّفة كأصناف. كما تعوِّض مسارات النطاق المغلق <code>Closure</code> وحدات الأوامر. يمكن اعتبار أوامر النطاق المغلق <code>Closure</code> معوِّضاً لأصناف الأوامر. في تابع <code>command</code> من الملف <code>app/Console/Kernel.php</code> ، يحمّل [[Laravel]] الملف <code>routes/console.php</code>:<syntaxhighlight lang="php">
/**
/**
* تثبيت أصول  الأوامر Closure  
* تثبيت أصول  الأوامر Closure  
*
*
سطر 94: سطر 94:


   require base_path('routes/console.php');
   require base_path('routes/console.php');
}
}
</syntaxhighlight>
</syntaxhighlight>


رغم أنّ هذا الملف لا يعرّف مسارات HTTP، إلّا أنّه يعرّف نقاط دخول (مسارات) تابعة لسطر الأوامر console. في هذا الملف يمكنك تعريف مسارات النطاق المغلق Closure باستعمال التابع  <code>Artisan::command</code>. يقبل التابع command معاملَيْن : توقيع الأمر و كائن Closure لاستقبال معاملات و خيارات الأمر:<syntaxhighlight lang="php">
رغم أنّ هذا الملف لا يعرّف مسارات HTTP، إلّا أنّه يعرّف نقاط دخول (مسارات) تابعة لسطر الأوامر console. في هذا الملف يمكنك تعريف مسارات النطاق المغلق <code>Closure</code> باستعمال التابع  <code>Artisan::command</code>. يقبل التابع <code>command</code> معاملَيْن : توقيع الأمر و كائن <code>Closure</code> لاستقبال معاملات و خيارات الأمر:<syntaxhighlight lang="php">
Artisan::command('build {project}', function ($project) {
Artisan::command('build {project}', function ($project) {


   $this->info("Building {$project}!");
   $this->info("Building {$project}!");
});
});
</syntaxhighlight>
</syntaxhighlight>
النطاق المغلق Closure مرتبط بنسخة الأمر، لذا بإمكانك استعمال جميع التوابع المساعدة التي تأتي مع صنف الأوامر.
النطاق المغلق <code>Closure</code> مرتبط بنسخة الأمر، لذا بإمكانك استعمال جميع التوابع المساعدة التي تأتي مع صنف الأوامر.


===== التلميح إلى نوع الاعتماديات =====
==== التلميح إلى نوع الاعتماديات ====
بالإضافة إلى استقبال معامِلات وخيارات الأوامر، يمكن لأوامر النطاق المغلق Closure التلميح إلى نوع بعض الاعتماديات التي قد تريد حلّها خارج حاوية الخدمات.<syntaxhighlight lang="php">
بالإضافة إلى استقبال معامِلات وخيارات الأوامر، يمكن لأوامر النطاق المغلق Closure التلميح إلى نوع بعض الاعتماديات التي قد تريد حلّها خارج حاوية الخدمات.<syntaxhighlight lang="php">
use App\User;
use App\User;
سطر 117: سطر 115:
</syntaxhighlight>
</syntaxhighlight>


===== توصيف أوامر النطاق المغلق Closure =====
==== توصيف أوامر النطاق المغلق Closure ====
عند تعريف أمر Closure، يمكنك استعمال التابع describe لإضافة تعريف للأمر. سيظهر هذا التعريف عند تنفيذ الأمر <code>php artisan list</code> أو <code>php artisan help</code>:<syntaxhighlight lang="php">
عند تعريف أمر Closure، يمكنك استعمال التابع <code>describe</code> لإضافة تعريف للأمر. سيظهر هذا التعريف عند تنفيذ الأمر <code>php artisan list</code> أو <code>php artisan help</code>:<syntaxhighlight lang="php">
Artisan::command('build {project}', function ($project) {
Artisan::command('build {project}', function ($project) {
   $this->info("Building {$project}!");
   $this->info("Building {$project}!");


سطر 126: سطر 123:
</syntaxhighlight>
</syntaxhighlight>


=== تعريف استثناءات الإدخال ===
== تعريف استثناءات الإدخال ==
عند كتابة أوامر التحكم، من الطبيعي جمع البيانات المدخلة من المستخدم عن طريق الخيارات أو المعاملات. يجعل Laravel توقع البيانات المدخلة أمرًا سهلًا عبر تحديد خاصية الأمر signature. تسمح هذه الخاصية بتحديد إسم، ومعاملات، وخيارات الأمر في صياغة واحدة معبّرة، وشبيهة بصياغة المسارات.
عند كتابة أوامر التحكم، من الطبيعي جمع البيانات المدخلة من المستخدم عن طريق الخيارات أو المعاملات. يجعل [[Laravel]] توقع البيانات المدخلة أمرًا سهلًا عبر تحديد خاصية الأمر <code>signature</code>. تسمح هذه الخاصية بتحديد إسم، ومعاملات، وخيارات الأمر في صياغة واحدة معبّرة، وشبيهة بصياغة المسارات.


==== المعاملات ====
=== المعاملات ===
تُحاط كل المعاملات والخيارات المزوَّدة بأقواس معقّفة. في المثال التالي، يعرِّف الأمر خيارًا واحدًا '''إجباريًّا''' هو user<syntaxhighlight lang="php">
تُحاط كل المعاملات والخيارات المزوَّدة بأقواس معقّفة. في المثال التالي، يعرِّف الأمر خيارًا واحدًا '''إجباريًّا''' هو <code>user</code><syntaxhighlight lang="php">
/**
/**
* إسم و إمضاء الأمر
* إسم و إمضاء الأمر
*
*
سطر 150: سطر 146:
</syntaxhighlight>
</syntaxhighlight>


==== الخيارات ====
=== الخيارات ===
الخيارات، مثل المعاملات، هي شكل من أشكال البيانات التي يدخلها المستخدم. تُسبَق الخيارات في سطر الأمر بمطَّتين قصيرتين (--). يوجد نوعان من الخيارات :تلك التي تقبل قيمة ما وتلك التي لا تقبل. الخيارات التي لا تقبل قيمة تعمل كمبدّل بقيمة منطقية "switch". لنلاحظ المثال التالي:<syntaxhighlight lang="php">
الخيارات، مثل المعاملات، هي شكل من أشكال البيانات التي يدخلها المستخدم. تُسبَق الخيارات في سطر الأمر بمطَّتين قصيرتين (--). يوجد نوعان من الخيارات :تلك التي تقبل قيمة ما وتلك التي لا تقبل. الخيارات التي لا تقبل قيمة تعمل كمبدّل بقيمة منطقية "<code>switch</code>". لنلاحظ المثال التالي:<syntaxhighlight lang="php">
/**
/**
*
*
* @var string
* @var string
سطر 161: سطر 156:
</syntaxhighlight>
</syntaxhighlight>


في هذا المثال، يمكن ذكر المبدّل queue-- عند استعمال الأمر. إذا مُرّر المبدّل، فإنّ قيمة الخيار ستكون "true"وإلّا فإنّ قيمته ستكون "false".<syntaxhighlight lang="php">
في هذا المثال، يمكن ذكر المبدّل <code>queue--</code> عند استعمال الأمر. إذا مُرّر المبدّل، فإنّ قيمة الخيار ستكون "<code>true</code>"وإلّا فإنّ قيمته ستكون "<code>false</code>".<syntaxhighlight lang="php">
php artisan email:send 1 --queue
php artisan email:send 1 --queue
</syntaxhighlight>
</syntaxhighlight>


===== الخيارات القابلة لقيمة =====
==== الخيارات القابلة لقيمة ====
لنلق نظرة على الخيارات التي تتوقّع أن يُدخِل المستخدم قيمة. إذا كان تمرير القيمة إجباريًّا للخيار، أتبع الخيار بالرمز =:<syntaxhighlight lang="php">
لنلق نظرة على الخيارات التي تتوقّع أن يُدخِل المستخدم قيمة. إذا كان تمرير القيمة إجباريًّا للخيار، أتبع الخيار بالرمز =:<syntaxhighlight lang="php">
/**
/**
*
*
* @var string
* @var string
سطر 184: سطر 178:
</syntaxhighlight>
</syntaxhighlight>


===== اختصار الخيارات =====
==== اختصار الخيارات ====
لتخصيص اختصار لخيار ما، يمكنك تعريفه قبل اسم الخيار واستعمال الرمز | للتفريق بين الاختصار و الإسم الكامل:<syntaxhighlight lang="php">
لتخصيص اختصار لخيار ما، يمكنك تعريفه قبل اسم الخيار واستعمال الرمز | للتفريق بين الاختصار و الإسم الكامل:<syntaxhighlight lang="php">
email:send {user} {--Q|queue}
email:send {user} {--Q|queue}
</syntaxhighlight>
</syntaxhighlight>


==== إدخال مصفوفات البيانات ====
=== إدخال مصفوفات البيانات ===
إن أردت تعريف خيارات تتوقع مصفوفات كبيانات مُمرّرة، يمكنك استعمال الرمز * . لنلق نظرة على المثال الأول:<syntaxhighlight lang="php">
إن أردت تعريف خيارات تتوقع مصفوفات كبيانات مُمرّرة، يمكنك استعمال الرمز * . لنلق نظرة على المثال الأول:<syntaxhighlight lang="php">
email:send {user*}
email:send {user*}
</syntaxhighlight>
</syntaxhighlight>


عند استعمال هذا الأمر، ستُمرَّر القيم للخيار user بالترتيب. مثلا، الأمر الموالي سيغيّر قيمة user إلى ['foo', 'bar']:<syntaxhighlight lang="php">
عند استعمال هذا الأمر، ستُمرَّر القيم للخيار <code>user</code> بالترتيب. مثلا، الأمر الموالي سيغيّر قيمة <code>user</code> إلى <code>['foo', 'bar']</code>:<syntaxhighlight lang="php">
php artisan email:send foo bar
php artisan email:send foo bar
</syntaxhighlight>
</syntaxhighlight>
سطر 200: سطر 194:
عند تمرير مصفوفة بيانات للخيارات التي تقبل مصفوفات، يجب أن تُسبَق كل قيمة ممرّرة باسم الخيار:<syntaxhighlight lang="php">
عند تمرير مصفوفة بيانات للخيارات التي تقبل مصفوفات، يجب أن تُسبَق كل قيمة ممرّرة باسم الخيار:<syntaxhighlight lang="php">
email:send {user} {--id=*}
email:send {user} {--id=*}
php artisan email:send --id=1 --id=2
php artisan email:send --id=1 --id=2
</syntaxhighlight>
</syntaxhighlight>


==== وصف البيانات المدخلة ====
=== وصف البيانات المدخلة ===
يمكن تخصيص وصف أو تعريف للخيارات والمعاملات المدخلة عبر تفريق المعامل عن التعريف باستخدام نقطتين ":". إن احتجت مزيدا من المساحة لتعريف الأمر يمكنك توزيع التعريف على أكثر من سطر:<syntaxhighlight lang="php">
يمكن تخصيص وصف أو تعريف للخيارات والمعاملات المدخلة عبر تفريق المعامل عن التعريف باستخدام نقطتين ":". إن احتجت مزيدا من المساحة لتعريف الأمر يمكنك توزيع التعريف على أكثر من سطر:<syntaxhighlight lang="php">
/**
/**
* اسم و توقيع الأمر  
* اسم و توقيع الأمر  
*
*
سطر 214: سطر 206:


protected $signature = 'email:send
protected $signature = 'email:send
                       {user : The ID of the user}
                       {user : The ID of the user}
                       {--queue= : Whether the job should be queued}';
                       {--queue= : Whether the job should be queued}';
</syntaxhighlight>
</syntaxhighlight>


=== أوامر الإدخال والإخراج I/O ===
== أوامر الإدخال والإخراج I/O ==


==== استرداد البيانات المُدخَلة ====
=== استرداد البيانات المدخَلة ===
عندما يعمل الأمر، ستحتاج طبعا للإطلاع على قيم المعاملات والخيارات التي تلقاها الأمر. للقيام بهذا، يمكنك استعمال أحد التابعين argument و option:<syntaxhighlight lang="php">
عندما يعمل الأمر، ستحتاج طبعا للإطلاع على قيم المعاملات والخيارات التي تلقاها الأمر. للقيام بهذا، يمكنك استعمال أحد التابعين <code>argument</code> و <code>option</code>:<syntaxhighlight lang="php">
/**
/**
*  تنفيذ الأمر *
*  تنفيذ الأمر *
* @return mixed
* @return mixed
سطر 230: سطر 220:


public function handle() {
public function handle() {
   $userId = $this->argument('user');
   $userId = $this->argument('user');
   //
   //
سطر 236: سطر 225:
}
}
</syntaxhighlight>
</syntaxhighlight>
إذا أردت استرداد كل المعاملات على شكل مصفوفة، يمكنك استعمال التابع arguments:<syntaxhighlight lang="php">
إذا أردت استرداد كل المعاملات على شكل مصفوفة، يمكنك استعمال التابع <code>arguments</code>:<syntaxhighlight lang="php">
$arguments = $this->arguments();
$arguments = $this->arguments();
</syntaxhighlight>
</syntaxhighlight>
تُسترجَع الخيارات بسهولة مثل المعاملات باستعمال التابع option. وتُسترجع كل الخيارات كمصفوفة باستعمال التابع options:<syntaxhighlight lang="php">
تُسترجَع الخيارات بسهولة مثل المعاملات باستعمال التابع <code>option</code>. وتُسترجع كل الخيارات كمصفوفة باستعمال التابع <code>options</code>:<syntaxhighlight lang="php">
//استرجاع خيار معيّن
//استرجاع خيار معيّن
$queueName = $this->option('queue');
$queueName = $this->option('queue');


// استرجاع كل الخيارات
// استرجاع كل الخيارات
$options = $this->options();
$options = $this->options();
</syntaxhighlight>
</syntaxhighlight>


إن كان المعامل أو الخيار غير موجود، تُرجَع القيمة null.
إن كان المعامل أو الخيار غير موجود، تُرجَع القيمة <code>null</code>.


==== الحث على إدخال البيانات ====
=== الحث على إدخال البيانات ===
بالإضافة إلى عرض البيانات المُخرجَة، يمكنك أن تطلب من المستخدم إدخال بيانات عند تنفيذ الأمر. سيُقدّم التابع ask السؤال المطروح للمستخدم ويقبل منه القيمة الممرّرة ويعيدها للأمر:<syntaxhighlight lang="php">
بالإضافة إلى عرض البيانات المُخرجَة، يمكنك أن تطلب من المستخدم إدخال بيانات عند تنفيذ الأمر. سيُقدّم التابع <code>ask</code> السؤال المطروح للمستخدم ويقبل منه القيمة الممرّرة ويعيدها للأمر:<syntaxhighlight lang="php">
/**
/**
*
*
*
*
سطر 263: سطر 249:


   $name = $this->ask('What is your name?');
   $name = $this->ask('What is your name?');
}
}
</syntaxhighlight>
</syntaxhighlight>


التابع secret شبيه بالتابع ask لكن القيمة التي يُدخلها المستخدم لن تكون ظاهرة له عند كتابتها. هذا التابع مفيد عند إدخال بيانات حساسة مثل كلمات المرور:<syntaxhighlight lang="php">
التابع <code>secret</code> شبيه بالتابع <code>ask</code> لكن القيمة التي يُدخلها المستخدم لن تكون ظاهرة له عند كتابتها. هذا التابع مفيد عند إدخال بيانات حساسة مثل كلمات المرور:<syntaxhighlight lang="php">
$password = $this->secret('What is the password?');
$password = $this->secret('What is the password?');
</syntaxhighlight>
</syntaxhighlight>


===== طلب التأكيد =====
==== طلب التأكيد ====
إذا أردت أن تطلب من المستخدم تأكيدًا بسيطًا، يمكنك استخدام التابع confirm. يعيد هذا التابع تلقائيًّا القيمة false إلّا إذا أدخل المستخدم "y" أو "yes" فإنّ القيمة المعادة تصبح true:<syntaxhighlight lang="php">
إذا أردت أن تطلب من المستخدم تأكيدًا بسيطًا، يمكنك استخدام التابع <code>confirm</code>. يعيد هذا التابع تلقائيًّا القيمة <code>false</code> إلّا إذا أدخل المستخدم "<code>y</code>" أو "<code>yes</code>" فإنّ القيمة المعادة تصبح <code>true</code>:<syntaxhighlight lang="php">
if ($this->confirm('Do you wish to continue?')) {
if ($this->confirm('Do you wish to continue?')) {


سطر 280: سطر 265:
</syntaxhighlight>
</syntaxhighlight>


===== الإكمال الآلي =====
==== الإكمال الآلي ====
يُستخدم التابع anticipate لتوفير خيارات إكمال آلي. مازال بإمكان المستخدم إدخال أي قيمة يريد رغم تلميحات الإكمال الآلي:<syntaxhighlight lang="php">
يُستخدم التابع <code>anticipate</code> لتوفير خيارات إكمال آلي. مازال بإمكان المستخدم إدخال أي قيمة يريد رغم تلميحات الإكمال الآلي:<syntaxhighlight lang="php">
$name = $this->anticipate('What is your name?', ['Taylor', 'Dayle']);
$name = $this->anticipate('What is your name?', ['Taylor', 'Dayle']);
</syntaxhighlight>
</syntaxhighlight>


===== الأسئلة ذات الخيارات المتعدّدة =====
==== الأسئلة ذات الخيارات المتعدّدة ====
إذا أردت أن تُقدّم للمستخدم مجموعة من الخيارات المٌعدّة مسبقا، يمكنك ذلك باستعمال التابع choice. يمكنك أيضًا تحديد مكان القيمة المبدئية من مصفوفة الخيارات في حال لم يُرجع المستخدم أي قيمة:<syntaxhighlight lang="php">
إذا أردت أن تُقدّم للمستخدم مجموعة من الخيارات المٌعدّة مسبقا، يمكنك ذلك باستعمال التابع <code>choice</code>. يمكنك أيضًا تحديد مكان القيمة المبدئية من مصفوفة الخيارات في حال لم يُرجع المستخدم أي قيمة:<syntaxhighlight lang="php">
$name = $this->choice('What is your name?', ['Taylor', 'Dayle'], $defaultIndex);
$name = $this->choice('What is your name?', ['Taylor', 'Dayle'], $defaultIndex);
</syntaxhighlight>
</syntaxhighlight>


==== كتابة البيانات المُخرجَة ====
=== كتابة البيانات المخرجَة ===
لإرسال بيانات لوحدة الأوامر، استعمل التوابع line ،info ،comment ،question، و error. ستستخدم كل هذه التوابع ألوان ANSII الملائمة. مثلًا، لإظهار بعض المعلومات العامة للمستخدم، تستخدم التابع info الذي يظهر البيانات عادة بالأخضر:<syntaxhighlight lang="php">
لإرسال بيانات لوحدة الأوامر، استعمل التوابع <code>line</code> ،<code>info</code> ،<code>comment</code> ،<code>question</code>، و <code>error</code>. ستستخدم كل هذه التوابع ألوان ANSII الملائمة. مثلًا، لإظهار بعض المعلومات العامة للمستخدم، تستخدم التابع <code>info</code> الذي يظهر البيانات عادة بالأخضر:<syntaxhighlight lang="php">
/**
/**
* تنفيذ الأمر
* تنفيذ الأمر
*
*
سطر 306: سطر 290:
</syntaxhighlight>
</syntaxhighlight>


لإظهار رسالة خطأ، استعمل التابع error الذي يظهر البيانات عادة باللون الأحمر:<syntaxhighlight lang="php">
لإظهار رسالة خطأ، استعمل التابع <code>error</code> الذي يظهر البيانات عادة باللون الأحمر:<syntaxhighlight lang="php">
$this->error('Something went wrong!');
$this->error('Something went wrong!');
</syntaxhighlight>
</syntaxhighlight>


إذا أردت إظهار البيانات دون لون، استخدم التابع line:<syntaxhighlight lang="php">
إذا أردت إظهار البيانات دون لون، استخدم التابع <code>line</code>:<syntaxhighlight lang="php">
$this->line('Display this on the screen');
$this->line('Display this on the screen');
</syntaxhighlight>
</syntaxhighlight>


===== أنساق الجداول =====
==== أنساق الجداول ====
يجعل التابع table تصميم و تنسيق سطور وأعمدة متعددة من البيانات أمرًا سهلًا. فقط مرّر ترويسة الجدول وسطور البيانات للتابع و سيحسب تلقائيًّا طول وعرض الجدول حسب البيانات المتوفّرة:<syntaxhighlight lang="php">
يجعل التابع <code>table</code> تصميم و تنسيق سطور وأعمدة متعددة من البيانات أمرًا سهلًا. فقط مرّر ترويسة الجدول وسطور البيانات للتابع و سيحسب تلقائيًّا طول وعرض الجدول حسب البيانات المتوفّرة:<syntaxhighlight lang="php">
$headers = ['Name', 'Email'];
$headers = ['Name', 'Email'];
$users = App\User::all(['name', 'email'])->toArray();
$users = App\User::all(['name', 'email'])->toArray();
$this->table($headers, $users);
$this->table($headers, $users);
</syntaxhighlight>
</syntaxhighlight>


===== شريط التقدم =====
==== شريط التقدم ====
بالنسبة للمهام التي تأخذ وقتا طويلًا، قد يكون من المفيد إظهار مؤشر تقدّم لها. باستخدام كائن الإخراج، بالإمكان بدء وتقديم وإيقاف شريط التقدّم. في البداية، حدّد عدد الخطوات التي سيمرّ بها العمل، ثم قدّم الشريط بعد نهاية كل خطوة:<syntaxhighlight lang="php">
بالنسبة للمهام التي تأخذ وقتا طويلًا، قد يكون من المفيد إظهار مؤشر تقدّم لها. باستخدام كائن الإخراج، بالإمكان بدء وتقديم وإيقاف شريط التقدّم. في البداية، حدّد عدد الخطوات التي سيمرّ بها العمل، ثم قدّم الشريط بعد نهاية كل خطوة:<syntaxhighlight lang="php">
$users = App\User::all();
$users = App\User::all();
$bar = $this->output->createProgressBar(count($users));
$bar = $this->output->createProgressBar(count($users));


سطر 335: سطر 316:


}
}
$bar->finish();
$bar->finish();
</syntaxhighlight>
</syntaxhighlight>
سطر 341: سطر 321:
للمزيد من الخيارات، راجع [https://symfony.com/doc/current/components/console/helpers/progressbar.html شريط التقدم في توثيق symfony.]
للمزيد من الخيارات، راجع [https://symfony.com/doc/current/components/console/helpers/progressbar.html شريط التقدم في توثيق symfony.]


=== تسجيل الأوامر ===
== تسجيل الأوامر ==
بسبب نداء التابع load في التابع commands من نواة وحدة الأوامر،تٌسجّل كل الأوامر في الدليل <code>app/console/Commands</code> تلقائيا في artisan. بإمكانك أيضا نداء التابع load للبحث عن أوامر artisan في أماكن أخرى:<syntaxhighlight lang="php">
بسبب نداء التابع <code>load</code> في التابع <code>commands</code> من نواة وحدة الأوامر،تٌسجّل كل الأوامر في الدليل <code>app/console/Commands</code> تلقائيا في artisan. بإمكانك أيضا نداء التابع <code>load</code> للبحث عن أوامر artisan في أماكن أخرى:<syntaxhighlight lang="php">
/**
/**
* تسجيل الأوامر للتطبيق
* تسجيل الأوامر للتطبيق
*
*
سطر 359: سطر 338:
</syntaxhighlight>
</syntaxhighlight>


يمكنك أيضا تسجيل الأوامر يدويًّا عبر إضافة إسم الصنف للخاصية commands$ في الملف <code>app/console/kernel.php</code>. كل الأوامر الموجودة في هذه الخاصية ستحمل في حاوي الخدمات وتضاف لأوامر artisan:<syntaxhighlight lang="php">
يمكنك أيضا تسجيل الأوامر يدويًّا عبر إضافة إسم الصنف للخاصية <code>commands$</code> في الملف <code>app/console/kernel.php</code>. كل الأوامر الموجودة في هذه الخاصية ستحمل في حاوي الخدمات وتضاف لأوامر artisan:<syntaxhighlight lang="php">
protected $commands = [
protected $commands = [


سطر 367: سطر 346:
</syntaxhighlight>
</syntaxhighlight>


=== تنفيذ الأوامر بطريقة برمجية ===
== تنفيذ الأوامر بطريقة برمجية ==
في بعض الأحيان، قد تريد تنفيذ أمر artisan خارج واجهة خطوط الأوامر(CLI). مثلا، قد تريد تنفيذ الأمر من مسار أو من وحدة تحكم. يمكنك استعمال التابع call في الواجهة الساكنة ل artisan. يقبل التابع call إسم أمر أو صنفا كمعامل أول، و مصفوفة من معامِلات الأمر كمعامل ثاني. يُعيد المعامل شيفرة خروج الأمر:<syntaxhighlight lang="php">
في بعض الأحيان، قد تريد تنفيذ أمر artisan خارج واجهة خطوط الأوامر(CLI). مثلا، قد تريد تنفيذ الأمر من مسار أو من وحدة تحكم. يمكنك استعمال التابع <code>call</code> في الواجهة الساكنة ل artisan. يقبل التابع <code>call</code> إسم أمر أو صنفا كمعامل أول، و مصفوفة من معامِلات الأمر كمعامل ثاني. يُعيد المعامل شيفرة خروج الأمر:<syntaxhighlight lang="php">
Route::get('/foo', function () {
Route::get('/foo', function () {


سطر 377: سطر 356:
});
});
</syntaxhighlight>
</syntaxhighlight>
باستعمال التابع queue في الواجهة الساكنة artisan، يمكنك صفّ الأوامر ليُنفّذها عمّال قائمة الانتظار في الخلفيّة. تثبت من الضبط الجيد لقوائم اانتظار و المستمعين على قوائم الإنتظار:<syntaxhighlight lang="php">
باستعمال التابع <code>queue</code> في الواجهة الساكنة artisan، يمكنك صفّ الأوامر ليُنفّذها عمّال قائمة الانتظار في الخلفيّة. تثبت من الضبط الجيد لقوائم الانتظار والمستمعين على قوائم الإنتظار:<syntaxhighlight lang="php">


Route::get('/foo', function () {
Route::get('/foo', function () {
سطر 397: سطر 376:
</syntaxhighlight>
</syntaxhighlight>


===== تمرير مصفوفة قيم =====
=== تمرير مصفوفة قيم ===
لو كان للأمر خيارات تقبل مصفوفة بيانات، يمكن تمرير هذه المصفوفة كما يلي:<syntaxhighlight lang="php">
لو كان للأمر خيارات تقبل مصفوفة بيانات، يمكن تمرير هذه المصفوفة كما يلي:<syntaxhighlight lang="php">
Route::get('/foo', function () {
Route::get('/foo', function () {
سطر 408: سطر 387:
</syntaxhighlight>
</syntaxhighlight>


===== تمرير قيم منطقية =====
=== تمرير قيم منطقية ===
إن احتجت أن تمرّر قيمة لخيار لا يقبل قيمة نصيّة، مثل الخيار force-- من الأمر <code>migrate:refresh</code>، يجب أن تُمرِّر القيمة true أو false:
إن احتجت أن تمرّر قيمة لخيار لا يقبل قيمة نصيّة، مثل الخيار <code>force--</code> من الأمر <code>migrate:refresh</code>، يجب أن تُمرِّر القيمة <code>true</code> أو <code>false</code>:
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
$exitCode = Artisan::call('migrate:refresh', [
$exitCode = Artisan::call('migrate:refresh', [
سطر 418: سطر 397:
</syntaxhighlight>
</syntaxhighlight>


==== نداء الأوامر من أوامر أخرى ====
=== نداء الأوامر من أوامر أخرى ===
في بعض الأحيان، قد تحتاج لنداء أمرٍ من أمر artisan آخر. يمكن القيام بذلك باستخدام التابع call. يقبل هذا التابع كمعاملات إسم الأمر و مصفوفة معاملاته:<syntaxhighlight lang="php">
في بعض الأحيان، قد تحتاج لنداء أمرٍ من أمر artisan آخر. يمكن القيام بذلك باستخدام التابع <code>call</code>. يقبل هذا التابع كمعاملات إسم الأمر و مصفوفة معاملاته:<syntaxhighlight lang="php">
/**
/**
* تنفيذ الأمر
* تنفيذ الأمر
*
*
سطر 436: سطر 414:
}
}
</syntaxhighlight>
</syntaxhighlight>
إن أردت نداء أمر مع كبح كل مُخرجاته، يمكنك ذلك باستعمال التابع callsilent. يعمل هذا التابع تماما مثل التابع call:
إن أردت نداء أمر مع كبح كل مُخرجاته، يمكنك ذلك باستعمال التابع <code>callsilent</code>. يعمل هذا التابع تماما مثل التابع <code>call</code>:
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
$this->callSilent('email:send', [
$this->callSilent('email:send', [
سطر 444: سطر 422:
]);
]);
</syntaxhighlight>
</syntaxhighlight>
مصادر
 
== مصادر ==
* [https://laravel.com/docs/5.6/artisan صفحة Artisan console من توثيق Laravel الرسمي.]
* [https://laravel.com/docs/5.6/artisan صفحة Artisan console من توثيق Laravel الرسمي.]
[[تصنيف:Laravel|{{SUBPAGENAME}}]]
[[تصنيف:Laravel Digging deeper|{{SUBPAGENAME}}]]

المراجعة الحالية بتاريخ 14:02، 24 أكتوبر 2018

مقدمة

Artisan هي واجهة الأوامر المُرفقة ب Laravel. وهي تُوفّر عددًا من الأوامر المفيدة والتي ستساعدك في بناء التطبيق. لإظهار جميع الأوامر التي يوفّرها Artisan، يمكنك استعمال الأمر list

php artisan list

يحتوي كل أمر على صفحة مساعدة "help" تعرّف وتوضّح الأمر كما تُقدّم قائمة المعاملات والخيارات لكل أمر. يُستعمل الأمر مسبوقًا بالكلمة help لإظهار صفحة المساعدة:

php artisan help migrate

Laravel REPL

تأتي كل تطبيقات Laravel مُرفَقَةً ب Tinker، وهي REPL مشغّلة بواسطة حُزمة PsySH. يسمح Tinker بالتفاعل مع كافّة مكوّنات التطبيق من سطر الأوامر بما في ذلك رابط الكائنات بالعلاقات Eloquent، والمهام، و الأحداث و غيرها الكثير. للدخول لبيئة Tinker، استعمل الأمر tinker:

php artisan tinker

كتابة الأوامر

بالإضافة للأوامر التي يُوفّرها artisan، يمكنك إنشاء أوامرك الخاصّة. هذه الأوامر تحفظ عادةً في الدليل app/console/Commands. لكن يمكنك اختيار مكان حفظ خاص بك طالما بإمكان composer تحميل الأوامر.

توليد الأوامر

لتوليد أمر جديد، استعمل الأمر make:command. سينشئ هذا الأمر صنف أوامر جديدًا في الدليل app/Console/Commands. إن لم يكن الدليل موجودا في التطبيق فإن الأمر سينشئه أول مرّة يُنفّذ فيها. سيحتوي الأمر المنشأ على الخصائص والتوابع المبدئية الحاضرة في كل الأوامر:

php artisan make:command SendEmails

هيكلة الأمر

بعد توليد الأمر، يجب ملأ الخاصّيتين signature وdescription في الصنف، والذين سيُستعملان حين إظهار الأمر الجديد في الصفحة list. سيُنادى التابع handle حين تنفيذ الأمر، يمكنك وضع منطق عمل الأمر في هذا التابع.

ملاحظة : لاستعمالٍ أمثل للأمر، يفضّل إبقاء الأمر خفيفا وتحويل المهام الثقيلة لبقية خدمات التطبيق. في المثال الموالي لاحظ أننا نحقن صنف خدمات ليرسل الرسائل.

لنلق نظرة على المثال الموالي، لاحظ أنّه بإمكاننا إضافة أي اعتماديات قد نحتاجها للدّالة البانية أو للتابع handle.ستضيف حاوي الخدمات في Laravel تلقائيا كل الاعتماديات المذكورة في الدالة البانية أو في التابع handle:

<?php

namespace App\Console\Commands;

use App\User; use App\DripEmailer;

use Illuminate\Console\Command;

class SendEmails extends Command

{

   /**
    *اسم و توقيع الأمر 
    *
    * @var string
    */
   protected $signature = 'email:send {user}';
   /**
    * وصف الأمر
    *
    * @var string
    */
   protected $description = 'Send drip e-mails to a user';
   /**
    * خدمة الرسائل
    *
    * @var DripEmailer
    */
   protected $drip;
   /**
    *إنشاء نسخة أمر جديدة
    *
    * @param  DripEmailer  $drip
    * @return void
    */
   public function __construct(DripEmailer $drip)
   {
       parent::__construct();
       $this->drip = $drip;
   }
   /**
    * تنفيذ الأمر
    *
    * @return mixed
    */
   public function handle()
   {
       $this->drip->send(User::find($this->argument('user')));
   }

}

أوامر النطاق المغلق Closure

تُقدّم الأوامر المبنية على النطاق المغلق Closure بديلًا عن الأوامر المُعرَّفة كأصناف. كما تعوِّض مسارات النطاق المغلق Closure وحدات الأوامر. يمكن اعتبار أوامر النطاق المغلق Closure معوِّضاً لأصناف الأوامر. في تابع command من الملف app/Console/Kernel.php ، يحمّل Laravel الملف routes/console.php:

/**
* تثبيت أصول  الأوامر Closure 
*
* @return void
*/

protected function commands() {

   require base_path('routes/console.php');
}

رغم أنّ هذا الملف لا يعرّف مسارات HTTP، إلّا أنّه يعرّف نقاط دخول (مسارات) تابعة لسطر الأوامر console. في هذا الملف يمكنك تعريف مسارات النطاق المغلق Closure باستعمال التابع Artisan::command. يقبل التابع command معاملَيْن : توقيع الأمر و كائن Closure لاستقبال معاملات و خيارات الأمر:

Artisan::command('build {project}', function ($project) {

   $this->info("Building {$project}!");
});

النطاق المغلق Closure مرتبط بنسخة الأمر، لذا بإمكانك استعمال جميع التوابع المساعدة التي تأتي مع صنف الأوامر.

التلميح إلى نوع الاعتماديات

بالإضافة إلى استقبال معامِلات وخيارات الأوامر، يمكن لأوامر النطاق المغلق Closure التلميح إلى نوع بعض الاعتماديات التي قد تريد حلّها خارج حاوية الخدمات.

use App\User;
use App\DripEmailer;

Artisan::command('email:send {user}', function (DripEmailer $drip, $user) {
    $drip->send(User::find($user));
});

توصيف أوامر النطاق المغلق Closure

عند تعريف أمر Closure، يمكنك استعمال التابع describe لإضافة تعريف للأمر. سيظهر هذا التعريف عند تنفيذ الأمر php artisan list أو php artisan help:

Artisan::command('build {project}', function ($project) {
   $this->info("Building {$project}!");

})->describe('Build the project');

تعريف استثناءات الإدخال

عند كتابة أوامر التحكم، من الطبيعي جمع البيانات المدخلة من المستخدم عن طريق الخيارات أو المعاملات. يجعل Laravel توقع البيانات المدخلة أمرًا سهلًا عبر تحديد خاصية الأمر signature. تسمح هذه الخاصية بتحديد إسم، ومعاملات، وخيارات الأمر في صياغة واحدة معبّرة، وشبيهة بصياغة المسارات.

المعاملات

تُحاط كل المعاملات والخيارات المزوَّدة بأقواس معقّفة. في المثال التالي، يعرِّف الأمر خيارًا واحدًا إجباريًّا هو user

/**
* إسم و إمضاء الأمر
*
* @var string
*/

protected $signature = 'email:send {user}';

يمكن أيضًا تعريف معاملات غير إجبارية و إعطاؤها قيما مبدئية:

// معاملات غير إجبارية

email:send {user?}

// معاملات غير إجبارية بقيم مبدئية

email:send {user=foo}

الخيارات

الخيارات، مثل المعاملات، هي شكل من أشكال البيانات التي يدخلها المستخدم. تُسبَق الخيارات في سطر الأمر بمطَّتين قصيرتين (--). يوجد نوعان من الخيارات :تلك التي تقبل قيمة ما وتلك التي لا تقبل. الخيارات التي لا تقبل قيمة تعمل كمبدّل بقيمة منطقية "switch". لنلاحظ المثال التالي:

/**
*
* @var string
*/

protected $signature = 'email:send {user} {--queue}';

في هذا المثال، يمكن ذكر المبدّل queue-- عند استعمال الأمر. إذا مُرّر المبدّل، فإنّ قيمة الخيار ستكون "true"وإلّا فإنّ قيمته ستكون "false".

php artisan email:send 1 --queue

الخيارات القابلة لقيمة

لنلق نظرة على الخيارات التي تتوقّع أن يُدخِل المستخدم قيمة. إذا كان تمرير القيمة إجباريًّا للخيار، أتبع الخيار بالرمز =:

/**
*
* @var string
*/

protected $signature = 'email:send {user} {--queue=}';

في هذا المثال يمكن للمستخدم أن يُدخِل قيمة للخيار كما يلي:

php artisan email:send 1 --queue=default

يمكن تخصيص قيمة مبدئية بعد اسم الخيار، إذا لم يمرّر المستخدم أي قيمة للخيار، تُعتمد القيمة المبدئية

email:send {user} {--queue=default}

اختصار الخيارات

لتخصيص اختصار لخيار ما، يمكنك تعريفه قبل اسم الخيار واستعمال الرمز | للتفريق بين الاختصار و الإسم الكامل:

email:send {user} {--Q|queue}

إدخال مصفوفات البيانات

إن أردت تعريف خيارات تتوقع مصفوفات كبيانات مُمرّرة، يمكنك استعمال الرمز * . لنلق نظرة على المثال الأول:

email:send {user*}

عند استعمال هذا الأمر، ستُمرَّر القيم للخيار user بالترتيب. مثلا، الأمر الموالي سيغيّر قيمة user إلى ['foo', 'bar']:

php artisan email:send foo bar

عند تمرير مصفوفة بيانات للخيارات التي تقبل مصفوفات، يجب أن تُسبَق كل قيمة ممرّرة باسم الخيار:

email:send {user} {--id=*}
php artisan email:send --id=1 --id=2

وصف البيانات المدخلة

يمكن تخصيص وصف أو تعريف للخيارات والمعاملات المدخلة عبر تفريق المعامل عن التعريف باستخدام نقطتين ":". إن احتجت مزيدا من المساحة لتعريف الأمر يمكنك توزيع التعريف على أكثر من سطر:

/**
* اسم و توقيع الأمر 
*
* @var string
*/

protected $signature = 'email:send
                       {user : The ID of the user}
                       {--queue= : Whether the job should be queued}';

أوامر الإدخال والإخراج I/O

استرداد البيانات المدخَلة

عندما يعمل الأمر، ستحتاج طبعا للإطلاع على قيم المعاملات والخيارات التي تلقاها الأمر. للقيام بهذا، يمكنك استعمال أحد التابعين argument و option:

/**
*  تنفيذ الأمر *
* @return mixed
*/

public function handle() {
   $userId = $this->argument('user');
  //

}

إذا أردت استرداد كل المعاملات على شكل مصفوفة، يمكنك استعمال التابع arguments:

$arguments = $this->arguments();

تُسترجَع الخيارات بسهولة مثل المعاملات باستعمال التابع option. وتُسترجع كل الخيارات كمصفوفة باستعمال التابع options:

//استرجاع خيار معيّن
$queueName = $this->option('queue');

// استرجاع كل الخيارات
$options = $this->options();

إن كان المعامل أو الخيار غير موجود، تُرجَع القيمة null.

الحث على إدخال البيانات

بالإضافة إلى عرض البيانات المُخرجَة، يمكنك أن تطلب من المستخدم إدخال بيانات عند تنفيذ الأمر. سيُقدّم التابع ask السؤال المطروح للمستخدم ويقبل منه القيمة الممرّرة ويعيدها للأمر:

/**
*
*
* @return mixed
*/

public function handle() {

   $name = $this->ask('What is your name?');
}

التابع secret شبيه بالتابع ask لكن القيمة التي يُدخلها المستخدم لن تكون ظاهرة له عند كتابتها. هذا التابع مفيد عند إدخال بيانات حساسة مثل كلمات المرور:

$password = $this->secret('What is the password?');

طلب التأكيد

إذا أردت أن تطلب من المستخدم تأكيدًا بسيطًا، يمكنك استخدام التابع confirm. يعيد هذا التابع تلقائيًّا القيمة false إلّا إذا أدخل المستخدم "y" أو "yes" فإنّ القيمة المعادة تصبح true:

if ($this->confirm('Do you wish to continue?')) {

  //

}

الإكمال الآلي

يُستخدم التابع anticipate لتوفير خيارات إكمال آلي. مازال بإمكان المستخدم إدخال أي قيمة يريد رغم تلميحات الإكمال الآلي:

$name = $this->anticipate('What is your name?', ['Taylor', 'Dayle']);

الأسئلة ذات الخيارات المتعدّدة

إذا أردت أن تُقدّم للمستخدم مجموعة من الخيارات المٌعدّة مسبقا، يمكنك ذلك باستعمال التابع choice. يمكنك أيضًا تحديد مكان القيمة المبدئية من مصفوفة الخيارات في حال لم يُرجع المستخدم أي قيمة:

$name = $this->choice('What is your name?', ['Taylor', 'Dayle'], $defaultIndex);

كتابة البيانات المخرجَة

لإرسال بيانات لوحدة الأوامر، استعمل التوابع line ،info ،comment ،question، و error. ستستخدم كل هذه التوابع ألوان ANSII الملائمة. مثلًا، لإظهار بعض المعلومات العامة للمستخدم، تستخدم التابع info الذي يظهر البيانات عادة بالأخضر:

/**
* تنفيذ الأمر
*
* @return mixed
*/

public function handle() {

   $this->info('Display this on the screen');

}

لإظهار رسالة خطأ، استعمل التابع error الذي يظهر البيانات عادة باللون الأحمر:

$this->error('Something went wrong!');

إذا أردت إظهار البيانات دون لون، استخدم التابع line:

$this->line('Display this on the screen');

أنساق الجداول

يجعل التابع table تصميم و تنسيق سطور وأعمدة متعددة من البيانات أمرًا سهلًا. فقط مرّر ترويسة الجدول وسطور البيانات للتابع و سيحسب تلقائيًّا طول وعرض الجدول حسب البيانات المتوفّرة:

$headers = ['Name', 'Email'];
$users = App\User::all(['name', 'email'])->toArray();
$this->table($headers, $users);

شريط التقدم

بالنسبة للمهام التي تأخذ وقتا طويلًا، قد يكون من المفيد إظهار مؤشر تقدّم لها. باستخدام كائن الإخراج، بالإمكان بدء وتقديم وإيقاف شريط التقدّم. في البداية، حدّد عدد الخطوات التي سيمرّ بها العمل، ثم قدّم الشريط بعد نهاية كل خطوة:

$users = App\User::all();
$bar = $this->output->createProgressBar(count($users));

foreach ($users as $user) {

   $this->performTask($user);
   $bar->advance();

}
$bar->finish();

للمزيد من الخيارات، راجع شريط التقدم في توثيق symfony.

تسجيل الأوامر

بسبب نداء التابع load في التابع commands من نواة وحدة الأوامر،تٌسجّل كل الأوامر في الدليل app/console/Commands تلقائيا في artisan. بإمكانك أيضا نداء التابع load للبحث عن أوامر artisan في أماكن أخرى:

/**
* تسجيل الأوامر للتطبيق
*
* @return void
*/

protected function commands() {

   $this->load(__DIR__.'/Commands');
   $this->load(__DIR__.'/MoreCommands');
  // ...

}

يمكنك أيضا تسجيل الأوامر يدويًّا عبر إضافة إسم الصنف للخاصية commands$ في الملف app/console/kernel.php. كل الأوامر الموجودة في هذه الخاصية ستحمل في حاوي الخدمات وتضاف لأوامر artisan:

protected $commands = [

   Commands\SendEmails::class

];

تنفيذ الأوامر بطريقة برمجية

في بعض الأحيان، قد تريد تنفيذ أمر artisan خارج واجهة خطوط الأوامر(CLI). مثلا، قد تريد تنفيذ الأمر من مسار أو من وحدة تحكم. يمكنك استعمال التابع call في الواجهة الساكنة ل artisan. يقبل التابع call إسم أمر أو صنفا كمعامل أول، و مصفوفة من معامِلات الأمر كمعامل ثاني. يُعيد المعامل شيفرة خروج الأمر:

Route::get('/foo', function () {

   $exitCode = Artisan::call('email:send', [
       'user' => 1, '--queue' => 'default'
   ]);

});

باستعمال التابع queue في الواجهة الساكنة artisan، يمكنك صفّ الأوامر ليُنفّذها عمّال قائمة الانتظار في الخلفيّة. تثبت من الضبط الجيد لقوائم الانتظار والمستمعين على قوائم الإنتظار:

Route::get('/foo', function () {

   Artisan::queue('email:send', [
       'user' => 1, '--queue' => 'default'
   ]);
  //

});

يمكنك أيضًا تحديد الصلة أو قائمة الانتظار التي تُرسل إليها أوامر artisan:

Artisan::queue('email:send', [

   'user' => 1, '--queue' => 'default'

])->onConnection('redis')->onQueue('commands');

تمرير مصفوفة قيم

لو كان للأمر خيارات تقبل مصفوفة بيانات، يمكن تمرير هذه المصفوفة كما يلي:

Route::get('/foo', function () {

   $exitCode = Artisan::call('email:send', [
       'user' => 1, '--id' => [5, 13]
   ]);

});

تمرير قيم منطقية

إن احتجت أن تمرّر قيمة لخيار لا يقبل قيمة نصيّة، مثل الخيار force-- من الأمر migrate:refresh، يجب أن تُمرِّر القيمة true أو false:

$exitCode = Artisan::call('migrate:refresh', [

   '--force' => true,

]);

نداء الأوامر من أوامر أخرى

في بعض الأحيان، قد تحتاج لنداء أمرٍ من أمر artisan آخر. يمكن القيام بذلك باستخدام التابع call. يقبل هذا التابع كمعاملات إسم الأمر و مصفوفة معاملاته:

/**
* تنفيذ الأمر
*
* @return mixed
*/

public function handle() {

   $this->call('email:send', [
       'user' => 1, '--queue' => 'default'
   ]);
  //

}

إن أردت نداء أمر مع كبح كل مُخرجاته، يمكنك ذلك باستعمال التابع callsilent. يعمل هذا التابع تماما مثل التابع call:

$this->callSilent('email:send', [

   'user' => 1, '--queue' => 'default'

]);

مصادر