الفرق بين المراجعتين ل"Laravel/artisan"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
 
(22 مراجعة متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة)
سطر 1: سطر 1:
=== مقدمة ===
+
<noinclude>{{DISPLAYTITLE:الأمر Artisan console) Artisan) في  Laravel}}</noinclude>
Artisan هي واجهة الأوامر المُرفقة ب Laravel. وهي تُوفّر عددًا من الأوامر المفيدة والتي ستساعدك في بناء التطبيق. لإظهار جميع الأوامر التي يوفّرها artisan، يمكنك استعمال الأمر list<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، يمكنك إنشاء أوامرك الخاصّة. هذه الأوامر تحفظ عادةً في الدليل app/console/Commands. لكن يمكنك اختيار مكان حفظ خاص بك طالما بإمكان composer تحميل الأوامر.
+
بالإضافة للأوامر التي يُوفّرها artisan، يمكنك إنشاء أوامرك الخاصّة. هذه الأوامر تحفظ عادةً في الدليل <code>app/console/Commands</code>. لكن يمكنك اختيار مكان حفظ خاص بك طالما بإمكان composer تحميل الأوامر.
  
==== توليد الأوامر ====
+
=== توليد الأوامر ===
لتوليد أمر جديد، استعمل الأمر make:command. سينشئ هذا الأمر صنف أوامر جديدًا في الدليل app/Console/Commands. إن لم يكن الدليل موجودا في التطبيق فإن الأمر سينشئه أول مرّة يُنفّذ فيها. سيحتوي الأمر المنشأ على الخصائص والتوابع المبدئية الحاضرة في كل الأوامر:<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> : لاستعمالٍ أمثل للأمر، يفضّل إبقاء الأمر خفيفا وتحويل المهام الثقيلة لبقية خدمات التطبيق. في المثال الموالي لاحظ أننا نحقن صنف خدمات ليرسل الرسائل.
  
لنلق نظرة على المثال الموالي، لاحظ أنّه بإمكاننا إضافة أي اعتماديات قد نحتاجها للدّالة البانية أو للتابع handle.ستضيف حاوية الخدمات service container في Laravel تلقائيا كل الاعتماديات المذكورة في الدالة البانية أو في التابع handle:
+
لنلق نظرة على المثال الموالي، لاحظ أنّه بإمكاننا إضافة أي اعتماديات قد نحتاجها للدّالة البانية أو للتابع <code>handle</code>.ستضيف [[Laravel/container|حاوي الخدمات في Laravel]] تلقائيا كل الاعتماديات المذكورة في الدالة البانية أو في التابع <code>handle</code>:<syntaxhighlight lang="php">
 
<?php
 
<?php
  
 
namespace App\Console\Commands;
 
namespace App\Console\Commands;
  
use App\User;
+
use App\User; use App\DripEmailer;
use App\DripEmailer;
+
 
 
use Illuminate\Console\Command;
 
use Illuminate\Console\Command;
  
 
class SendEmails extends Command
 
class SendEmails extends Command
 +
 
{
 
{
    /**
 
    *اسم و توقيع الأمر
 
    *
 
    * @var string
 
    */
 
    protected $signature = 'email:send {user}';
 
  
     /**
+
  /**
    * وصف الأمر
+
     *اسم و توقيع الأمر
    *
+
    *
    * @var string
+
    * @var string
    */
+
    */
    protected $description = 'Send drip e-mails to a user';
+
  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')));
 +
  }
  
    /**
+
}
    * خدمة الرسائل
+
</syntaxhighlight>
    *
 
    * @var DripEmailer
 
    */
 
    protected $drip;
 
  
    /**
+
=== أوامر النطاق المغلق Closure ===
    *إنشاء نسخة أمر جديدة
+
تُقدّم الأوامر المبنية على النطاق المغلق 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">
    *
+
/**
    * @param  DripEmailer  $drip
+
* تثبيت أصول  الأوامر Closure
    * @return void
+
*
    */
+
* @return void
    public function __construct(DripEmailer $drip)
+
*/
    {
 
        parent::__construct();
 
  
        $this->drip = $drip;
+
protected function commands() {
    }
 
  
    /**
+
  require base_path('routes/console.php');
    * تنفيذ الأمر
 
    *
 
    * @return mixed
 
    */
 
    public function handle()
 
    {
 
        $this->drip->send(User::find($this->argument('user')));
 
    }
 
 
}
 
}
أوامر النطاق المغلق Closure
+
</syntaxhighlight>
تُقدّم الأوامر المبنية على النطاق المغلق 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 لاستقبال معاملات و خيارات الأمر:
 
  
 +
رغم أنّ هذا الملف لا يعرّف مسارات 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}!");
 
});
 
});
النطاق المغلق Closure مرتبط بنسخة الأمر، لذا بإمكانك استعمال جميع التوابع المساعدة التي تأتي مع صنف الأوامر.
+
</syntaxhighlight>
التلميح إلى نوع الاعتماديات
+
النطاق المغلق <code>Closure</code> مرتبط بنسخة الأمر، لذا بإمكانك استعمال جميع التوابع المساعدة التي تأتي مع صنف الأوامر.
بالإضافة إلى استقبال معامِلات وخيارات الأوامر، يمكن لأوامر النطاق المغلق Closure التلميح إلى نوع بعض الاعتماديات التي قد تريد حلّها خارج حاوية الخدمات.
+
 
 +
==== التلميح إلى نوع الاعتماديات ====
 +
بالإضافة إلى استقبال معامِلات وخيارات الأوامر، يمكن لأوامر النطاق المغلق Closure التلميح إلى نوع بعض الاعتماديات التي قد تريد حلّها خارج حاوية الخدمات.<syntaxhighlight lang="php">
 
use App\User;
 
use App\User;
 
use App\DripEmailer;
 
use App\DripEmailer;
سطر 107: سطر 113:
 
     $drip->send(User::find($user));
 
     $drip->send(User::find($user));
 
});
 
});
توصيف أوامر النطاق المغلق Closure
+
</syntaxhighlight>
عند تعريف أمر Closure، يمكنك استعمال التابع describe لإضافة تعريف للأمر. سيظهر هذا التعريف عند تنفيذ الأمر php artisan list أو php artisan help:
+
 
 +
==== توصيف أوامر النطاق المغلق Closure ====
 +
عند تعريف أمر 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}!");
 +
 
 
})->describe('Build the project');
 
})->describe('Build the project');
تعريف استثناءات الإدخال
+
</syntaxhighlight>
عند كتابة أوامر التحكم، من الطبيعي جمع البيانات المدخلة من المستخدم عن طريق الخيارات أو المعاملات. يجعل Laravel توقع البيانات المدخلة أمرًا سهلًا عبر تحديد خاصية الأمر signature. تسمح هذه الخاصية بتحديد إسم، ومعاملات، وخيارات الأمر في صياغة واحدة معبّرة، وشبيهة بصياغة المسارات.
+
 
المعاملات
+
== تعريف استثناءات الإدخال ==
تُحاط كل المعاملات والخيارات المزوَّدة بأقواس معقّفة. في المثال التالي، يعرِّف الأمر خيارًا
+
عند كتابة أوامر التحكم، من الطبيعي جمع البيانات المدخلة من المستخدم عن طريق الخيارات أو المعاملات. يجعل [[Laravel]] توقع البيانات المدخلة أمرًا سهلًا عبر تحديد خاصية الأمر <code>signature</code>. تسمح هذه الخاصية بتحديد إسم، ومعاملات، وخيارات الأمر في صياغة واحدة معبّرة، وشبيهة بصياغة المسارات.
  
واحدًا إجباريًّا هو user
+
=== المعاملات ===
 +
تُحاط كل المعاملات والخيارات المزوَّدة بأقواس معقّفة. في المثال التالي، يعرِّف الأمر خيارًا واحدًا '''إجباريًّا''' هو <code>user</code><syntaxhighlight lang="php">
 
/**
 
/**
* إسم و إمضاء الأمر
+
* إسم و إمضاء الأمر
*
+
*
* @var string
+
* @var string
*/
+
*/
 +
 
 
protected $signature = 'email:send {user}';
 
protected $signature = 'email:send {user}';
يمكن أيضًا تعريف معاملات غير إجبارية و إعطاؤها قيما مبدئية:
+
</syntaxhighlight>
 +
يمكن أيضًا تعريف معاملات غير إجبارية و إعطاؤها قيما مبدئية:<syntaxhighlight lang="php">
 
// معاملات غير إجبارية
 
// معاملات غير إجبارية
 +
 
email:send {user?}
 
email:send {user?}
  
 
// معاملات غير إجبارية بقيم مبدئية
 
// معاملات غير إجبارية بقيم مبدئية
 +
 
email:send {user=foo}
 
email:send {user=foo}
الخيارات
+
</syntaxhighlight>
الخيارات، مثل المعاملات، هي شكل من أشكال البيانات التي يدخلها المستخدم. تُسبَق الخيارات في سطر الأمر بمطَّتين قصيرتين (--). يوجد نوعان من الخيارات :تلك التي تقبل قيمة ما وتلك التي لا تقبل. الخيارات التي لا تقبل قيمة تعمل كمبدّل بقيمة منطقية "switch". لنلاحظ المثال التالي:
+
 
 +
=== الخيارات ===
 +
الخيارات، مثل المعاملات، هي شكل من أشكال البيانات التي يدخلها المستخدم. تُسبَق الخيارات في سطر الأمر بمطَّتين قصيرتين (--). يوجد نوعان من الخيارات :تلك التي تقبل قيمة ما وتلك التي لا تقبل. الخيارات التي لا تقبل قيمة تعمل كمبدّل بقيمة منطقية "<code>switch</code>". لنلاحظ المثال التالي:<syntaxhighlight lang="php">
 
/**
 
/**
*
+
*
* @var string
+
* @var string
*/
+
*/
 +
 
 
protected $signature = 'email:send {user} {--queue}';
 
protected $signature = 'email:send {user} {--queue}';
في هذا المثال، يمكن ذكر المبدّل queue-- عند استعمال الأمر. إذا مُرّر المبدّل، فإنّ قيمة الخيار ستكون "true"وإلّا فإنّ قيمته ستكون "false".
+
</syntaxhighlight>
 +
 
 +
في هذا المثال، يمكن ذكر المبدّل <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 lang="php">
 
/**
 
/**
*
+
*
* @var string
+
* @var string
*/
+
*/
 +
 
 
protected $signature = 'email:send {user} {--queue=}';
 
protected $signature = 'email:send {user} {--queue=}';
في هذا المثال يمكن للمستخدم أن يُدخِل قيمة للخيار كما يلي:
+
</syntaxhighlight>
 +
 
 +
في هذا المثال يمكن للمستخدم أن يُدخِل قيمة للخيار كما يلي:<syntaxhighlight lang="php">
 
php artisan email:send 1 --queue=default
 
php artisan email:send 1 --queue=default
يمكن تخصيص قيمة مبدئية بعد اسم الخيار، إذا لم يمرّر المستخدم أي قيمة للخيار، تُعتمد القيمة المبدئية
+
</syntaxhighlight>
 +
 
 +
يمكن تخصيص قيمة مبدئية بعد اسم الخيار، إذا لم يمرّر المستخدم أي قيمة للخيار، تُعتمد القيمة المبدئية<syntaxhighlight lang="php">
 
email:send {user} {--queue=default}
 
email:send {user} {--queue=default}
 +
</syntaxhighlight>
  
اختصار الخيارات
+
==== اختصار الخيارات ====
لتخصيص اختصار لخيار ما، يمكنك تعريفه قبل اسم الخيار واستعمال الرمز | للتفريق بين الاختصار و الإسم الكامل:
+
لتخصيص اختصار لخيار ما، يمكنك تعريفه قبل اسم الخيار واستعمال الرمز | للتفريق بين الاختصار و الإسم الكامل:<syntaxhighlight lang="php">
 
email:send {user} {--Q|queue}
 
email:send {user} {--Q|queue}
 +
</syntaxhighlight>
  
إدخال مصفوفات البيانات
+
=== إدخال مصفوفات البيانات ===
إن أردت تعريف خيارات تتوقع مصفوفات كبيانات مُمرّرة، يمكنك استعمال الرمز * . لنلق نظرة على المثال الأول:
+
إن أردت تعريف خيارات تتوقع مصفوفات كبيانات مُمرّرة، يمكنك استعمال الرمز * . لنلق نظرة على المثال الأول:<syntaxhighlight lang="php">
 
email:send {user*}
 
email:send {user*}
عند استعمال هذا الأمر، ستُمرَّر القيم للخيار user بالترتيب. مثلا، الأمر الموالي سيغيّر قيمة user إلى ['foo', 'bar']:
+
</syntaxhighlight>
 +
 
 +
عند استعمال هذا الأمر، ستُمرَّر القيم للخيار <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 lang="php">
 
email:send {user} {--id=*}
 
email:send {user} {--id=*}
 +
php artisan email:send --id=1 --id=2
 +
</syntaxhighlight>
  
php artisan email:send --id=1 --id=2
+
=== وصف البيانات المدخلة ===
وصف البيانات المدخلة
+
يمكن تخصيص وصف أو تعريف للخيارات والمعاملات المدخلة عبر تفريق المعامل عن التعريف باستخدام نقطتين ":". إن احتجت مزيدا من المساحة لتعريف الأمر يمكنك توزيع التعريف على أكثر من سطر:<syntaxhighlight lang="php">
يمكن تخصيص وصف أو تعريف للخيارات والمعاملات المدخلة عبر تفريق المعامل عن التعريف باستخدام نقطتين ":". إن احتجت مزيدا من المساحة لتعريف الأمر يمكنك توزيع التعريف على أكثر من سطر:
 
 
/**
 
/**
* اسم و توقيع الأمر  
+
* اسم و توقيع الأمر  
*
+
*
* @var string
+
* @var string
*/
+
*/
 +
 
 
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}';
أوامر الإدخال والإخراج I/O
+
</syntaxhighlight>
استرداد البيانات المُدخَلة
+
 
عندما يعمل الأمر، ستحتاج طبعا للإطلاع على قيم المعاملات والخيارات التي تلقاها الأمر. للقيام بهذا، يمكنك استعمال أحد التابعين argument و option:
+
== أوامر الإدخال والإخراج I/O ==
 +
 
 +
=== استرداد البيانات المدخَلة ===
 +
عندما يعمل الأمر، ستحتاج طبعا للإطلاع على قيم المعاملات والخيارات التي تلقاها الأمر. للقيام بهذا، يمكنك استعمال أحد التابعين <code>argument</code> و <code>option</code>:<syntaxhighlight lang="php">
 
/**
 
/**
*  تنفيذ الأمر *
+
*  تنفيذ الأمر *
* @return mixed
+
* @return mixed
*/
+
*/
public function handle()
+
 
{
+
public function handle() {
    $userId = $this->argument('user');
+
  $userId = $this->argument('user');
 +
  //
  
  //
 
 
}
 
}
إذا أردت استرداد كل المعاملات على شكل مصفوفة، يمكنك استعمال التابع arguments:
+
</syntaxhighlight>
 +
إذا أردت استرداد كل المعاملات على شكل مصفوفة، يمكنك استعمال التابع <code>arguments</code>:<syntaxhighlight lang="php">
 
$arguments = $this->arguments();
 
$arguments = $this->arguments();
تُسترجَع الخيارات بسهولة مثل المعاملات باستعمال التابع option. وتُسترجع كل الخيارات كمصفوفة باستعمال التابع options:
+
</syntaxhighlight>
 
+
تُسترجَع الخيارات بسهولة مثل المعاملات باستعمال التابع <code>option</code>. وتُسترجع كل الخيارات كمصفوفة باستعمال التابع <code>options</code>:<syntaxhighlight lang="php">
 
//استرجاع خيار معيّن
 
//استرجاع خيار معيّن
 
$queueName = $this->option('queue');
 
$queueName = $this->option('queue');
سطر 196: سطر 234:
 
// استرجاع كل الخيارات
 
// استرجاع كل الخيارات
 
$options = $this->options();
 
$options = $this->options();
إن كان المعامل أو الخيار غير موجود، تُرجَع القيمة null.
+
</syntaxhighlight>
الحث على إدخال البيانات
+
 
بالإضافة إلى عرض البيانات المُخرجَة، يمكنك أن تطلب من المستخدم إدخال بيانات عند تنفيذ الأمر. سيُقدّم التابع ask السؤال المطروح للمستخدم ويقبل منه القيمة الممرّرة ويعيدها للأمر:
+
إن كان المعامل أو الخيار غير موجود، تُرجَع القيمة <code>null</code>.
  
 +
=== الحث على إدخال البيانات ===
 +
بالإضافة إلى عرض البيانات المُخرجَة، يمكنك أن تطلب من المستخدم إدخال بيانات عند تنفيذ الأمر. سيُقدّم التابع <code>ask</code> السؤال المطروح للمستخدم ويقبل منه القيمة الممرّرة ويعيدها للأمر:<syntaxhighlight lang="php">
 +
/**
 +
*
 +
*
 +
* @return mixed
 +
*/
  
 +
public function handle() {
  
/**
+
  $name = $this->ask('What is your name?');
*
 
*
 
* @return mixed
 
*/
 
public function handle()
 
{
 
    $name = $this->ask('What is your name?');
 
 
}
 
}
التابع secret شبيه بالتابع ask لكن القيمة التي يُدخلها المستخدم لن تكون ظاهرة له عند كتابتها. هذا التابع مفيد عند إدخال بيانات حساسة مثل كلمات المرور:
+
</syntaxhighlight>
 +
 
 +
التابع <code>secret</code> شبيه بالتابع <code>ask</code> لكن القيمة التي يُدخلها المستخدم لن تكون ظاهرة له عند كتابتها. هذا التابع مفيد عند إدخال بيانات حساسة مثل كلمات المرور:<syntaxhighlight lang="php">
 
$password = $this->secret('What is the password?');
 
$password = $this->secret('What is the password?');
طلب التأكيد
+
</syntaxhighlight>
إذا أردت أن تطلب من المستخدم تأكيدًا بسيطًا، يمكنك استخدام التابع confirm. يعيد هذا التابع تلقائيًّا القيمة false إلّا إذا أدخل المستخدم "y" أو "yes" فإنّ القيمة المعادة تصبح true:
+
 
 +
==== طلب التأكيد ====
 +
إذا أردت أن تطلب من المستخدم تأكيدًا بسيطًا، يمكنك استخدام التابع <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?')) {
  //
+
 
 +
  //
 +
 
 
}
 
}
الإكمال الآلي
+
</syntaxhighlight>
يُستخدم التابع anticipate لتوفير خيارات إكمال آلي. مازال بإمكان المستخدم إدخال أي قيمة يريد رغم تلميحات الإكمال الآلي:
+
 
 +
==== الإكمال الآلي ====
 +
يُستخدم التابع <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>
  
الأسئلة ذات الخيارات المتعدّدة
+
==== الأسئلة ذات الخيارات المتعدّدة ====
إذا أردت أن تُقدّم للمستخدم مجموعة من الخيارات المٌعدّة مسبقا، يمكنك ذلك باستعمال التابع choice. يمكنك أيضًا تحديد مكان القيمة المبدئية من مصفوفة الخيارات في حال لم يُرجع المستخدم أي قيمة:
+
إذا أردت أن تُقدّم للمستخدم مجموعة من الخيارات المٌعدّة مسبقا، يمكنك ذلك باستعمال التابع <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>
لإرسال بيانات لوحدة الأوامر، استعمل التوابع line ،info ،comment ،question، و error. ستستخدم كل هذه التوابع ألوان ANSII الملائمة. مثلًا، لإظهار بعض المعلومات العامة للمستخدم، تستخدم التابع info الذي يظهر البيانات عادة بالأخضر:
+
 
 +
=== كتابة البيانات المخرجَة ===
 +
لإرسال بيانات لوحدة الأوامر، استعمل التوابع <code>line</code> ،<code>info</code> ،<code>comment</code> ،<code>question</code>، و <code>error</code>. ستستخدم كل هذه التوابع ألوان ANSII الملائمة. مثلًا، لإظهار بعض المعلومات العامة للمستخدم، تستخدم التابع <code>info</code> الذي يظهر البيانات عادة بالأخضر:<syntaxhighlight lang="php">
 
/**
 
/**
* تنفيذ الأمر
+
* تنفيذ الأمر
*
+
*
* @return mixed
+
* @return mixed
*/
+
*/
public function handle()
+
 
{
+
public function handle() {
    $this->info('Display this on the screen');
+
 
 +
  $this->info('Display this on the screen');
 +
 
 
}
 
}
لإظهار رسالة خطأ، استعمل التابع error الذي يظهر البيانات عادة باللون الأحمر:
+
</syntaxhighlight>
 +
 
 +
لإظهار رسالة خطأ، استعمل التابع <code>error</code> الذي يظهر البيانات عادة باللون الأحمر:<syntaxhighlight lang="php">
 
$this->error('Something went wrong!');
 
$this->error('Something went wrong!');
إذا أردت إظهار البيانات دون لون، استخدم التابع line:
+
</syntaxhighlight>
 +
 
 +
إذا أردت إظهار البيانات دون لون، استخدم التابع <code>line</code>:<syntaxhighlight lang="php">
 
$this->line('Display this on the screen');
 
$this->line('Display this on the screen');
أنساق الجداول
+
</syntaxhighlight>
يجعل التابع table تصميم و تنسيق سطور وأعمدة متعددة من البيانات أمرًا سهلًا. فقط مرّر ترويسة الجدول وسطور البيانات للتابع و سيحسب تلقائيًّا طول وعرض الجدول حسب البيانات المتوفّرة:
+
 
 +
==== أنساق الجداول ====
 +
يجعل التابع <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);
 +
</syntaxhighlight>
  
$this->table($headers, $users);
+
==== شريط التقدم ====
شريط التقدم
+
بالنسبة للمهام التي تأخذ وقتا طويلًا، قد يكون من المفيد إظهار مؤشر تقدّم لها. باستخدام كائن الإخراج، بالإمكان بدء وتقديم وإيقاف شريط التقدّم. في البداية، حدّد عدد الخطوات التي سيمرّ بها العمل، ثم قدّم الشريط بعد نهاية كل خطوة:<syntaxhighlight lang="php">
بالنسبة للمهام التي تأخذ وقتا طويلًا، قد يكون من المفيد إظهار مؤشر تقدّم لها. باستخدام كائن الإخراج، بالإمكان بدء وتقديم وإيقاف شريط التقدّم. في البداية، حدّد عدد الخطوات التي سيمرّ بها العمل، ثم قدّم الشريط بعد نهاية كل خطوة:
 
 
$users = App\User::all();
 
$users = App\User::all();
 
$bar = $this->output->createProgressBar(count($users));
 
$bar = $this->output->createProgressBar(count($users));
 +
 
foreach ($users as $user) {
 
foreach ($users as $user) {
    $this->performTask($user);
+
 
    $bar->advance();
+
  $this->performTask($user);
 +
  $bar->advance();
 +
 
 
}
 
}
 +
$bar->finish();
 +
</syntaxhighlight>
  
$bar->finish();
+
للمزيد من الخيارات، راجع [https://symfony.com/doc/current/components/console/helpers/progressbar.html شريط التقدم في توثيق symfony.]
للمزيد من الخيارات، راجع شريط التقدم في توثيق symfony.
 
  
تسجيل الأوامر
+
== تسجيل الأوامر ==
بسبب نداء التابع load في التابع commands من نواة وحدة الأوامر،تٌسجّل كل الأوامر في الدليل app/console/Commands تلقائيا في artisan. بإمكانك أيضا نداء التابع load للبحث عن أوامر artisan في أماكن أخرى:
+
بسبب نداء التابع <code>load</code> في التابع <code>commands</code> من نواة وحدة الأوامر،تٌسجّل كل الأوامر في الدليل <code>app/console/Commands</code> تلقائيا في artisan. بإمكانك أيضا نداء التابع <code>load</code> للبحث عن أوامر artisan في أماكن أخرى:<syntaxhighlight lang="php">
 
/**
 
/**
* تسجيل الأوامر للتطبيق
+
* تسجيل الأوامر للتطبيق
*
+
*
* @return void
+
* @return void
*/
+
*/
protected function commands()
+
 
{
+
protected function commands() {
    $this->load(__DIR__.'/Commands');
+
 
    $this->load(__DIR__.'/MoreCommands');
+
  $this->load(__DIR__.'/Commands');
 +
  $this->load(__DIR__.'/MoreCommands');
 +
  // ...
  
  // ...
 
 
}
 
}
يمكنك أيضا تسجيل الأوامر يدويًّا عبر إضافة إسم الصنف للخاصية commands$ في الملف app/console/kernel.php. كل الأوامر الموجودة في هذه الخاصية ستحمل في حاوي الخدمات وتضاف لأوامر artisan:
+
</syntaxhighlight>
 +
 
 +
يمكنك أيضا تسجيل الأوامر يدويًّا عبر إضافة إسم الصنف للخاصية <code>commands$</code> في الملف <code>app/console/kernel.php</code>. كل الأوامر الموجودة في هذه الخاصية ستحمل في حاوي الخدمات وتضاف لأوامر artisan:<syntaxhighlight lang="php">
 
protected $commands = [
 
protected $commands = [
    Commands\SendEmails::class
+
 
 +
  Commands\SendEmails::class
 +
 
 
];
 
];
تنفيذ الأوامر بطريقة برمجية
+
</syntaxhighlight>
في بعض الأحيان، قد تريد تنفيذ أمر artisan خارج واجهة خطوط الأوامر(CLI). مثلا، قد تريد تنفيذ الأمر من مسار أو من وحدة تحكم. يمكنك استعمال التابع call في الواجهة الساكنة ل artisan. يقبل التابع call إسم أمر أو صنفا كمعامل أول، و مصفوفة من معامِلات الأمر كمعامل ثاني. يُعيد المعامل شيفرة خروج الأمر:
+
 
 +
== تنفيذ الأوامر بطريقة برمجية ==
 +
في بعض الأحيان، قد تريد تنفيذ أمر artisan خارج واجهة خطوط الأوامر(CLI). مثلا، قد تريد تنفيذ الأمر من مسار أو من وحدة تحكم. يمكنك استعمال التابع <code>call</code> في الواجهة الساكنة ل artisan. يقبل التابع <code>call</code> إسم أمر أو صنفا كمعامل أول، و مصفوفة من معامِلات الأمر كمعامل ثاني. يُعيد المعامل شيفرة خروج الأمر:<syntaxhighlight lang="php">
 
Route::get('/foo', function () {
 
Route::get('/foo', function () {
    $exitCode = Artisan::call('email:send', [
+
 
        'user' => 1, '--queue' => 'default'
+
  $exitCode = Artisan::call('email:send', [
    ]);
+
      'user' => 1, '--queue' => 'default'
 +
  ]);
 +
 
 
});
 
});
باستعمال التابع queue في الواجهة الساكنة artisan، يمكنك صفّ الأوامر ليُنفّذها عمّال قائمة الانتظار في الخلفيّة. تثبت من الضبط الجيد لقوائم اانتظار و المستمعين على قوائم الإنتظار:
+
</syntaxhighlight>
 +
باستعمال التابع <code>queue</code> في الواجهة الساكنة artisan، يمكنك صفّ الأوامر ليُنفّذها عمّال قائمة الانتظار في الخلفيّة. تثبت من الضبط الجيد لقوائم الانتظار والمستمعين على قوائم الإنتظار:<syntaxhighlight lang="php">
  
 +
Route::get('/foo', function () {
  
Route::get('/foo', function () {
+
  Artisan::queue('email:send', [
    Artisan::queue('email:send', [
+
      'user' => 1, '--queue' => 'default'
        'user' => 1, '--queue' => 'default'
+
  ]);
    ]);
+
  //
  
  //
 
 
});
 
});
 +
</syntaxhighlight>
 
يمكنك أيضًا تحديد الصلة أو قائمة الانتظار التي تُرسل إليها أوامر artisan:
 
يمكنك أيضًا تحديد الصلة أو قائمة الانتظار التي تُرسل إليها أوامر artisan:
 +
<syntaxhighlight lang="php">
 
Artisan::queue('email:send', [
 
Artisan::queue('email:send', [
    'user' => 1, '--queue' => 'default'
+
 
 +
  'user' => 1, '--queue' => 'default'
 +
 
 
])->onConnection('redis')->onQueue('commands');
 
])->onConnection('redis')->onQueue('commands');
تمرير مصفوفة قيم
+
</syntaxhighlight>
لو كان للأمر خيارات تقبل مصفوفة بيانات، يمكن تمرير هذه المصفوفة كما يلي:
+
 
 +
=== تمرير مصفوفة قيم ===
 +
لو كان للأمر خيارات تقبل مصفوفة بيانات، يمكن تمرير هذه المصفوفة كما يلي:<syntaxhighlight lang="php">
 
Route::get('/foo', function () {
 
Route::get('/foo', function () {
    $exitCode = Artisan::call('email:send', [
+
 
        'user' => 1, '--id' => [5, 13]
+
  $exitCode = Artisan::call('email:send', [
    ]);
+
      'user' => 1, '--id' => [5, 13]
 +
  ]);
 +
 
 
});
 
});
 +
</syntaxhighlight>
  
تمرير قيم منطقية
+
=== تمرير قيم منطقية ===
إن احتجت أن تمرّر قيمة لخيار لا يقبل قيمة نصيّة، مثل الخيار force-- من الأمر migrate:refresh، يجب أن تُمرِّر القيمة true أو false:
+
إن احتجت أن تمرّر قيمة لخيار لا يقبل قيمة نصيّة، مثل الخيار <code>force--</code> من الأمر <code>migrate:refresh</code>، يجب أن تُمرِّر القيمة <code>true</code> أو <code>false</code>:
 +
<syntaxhighlight lang="php">
 
$exitCode = Artisan::call('migrate:refresh', [
 
$exitCode = Artisan::call('migrate:refresh', [
    '--force' => true,
+
 
 +
  '--force' => true,
 +
 
 
]);
 
]);
 +
</syntaxhighlight>
  
نداء الأوامر من أوامر أخرى
+
=== نداء الأوامر من أوامر أخرى ===
في بعض الأحيان، قد تحتاج لنداء أمرٍ من أمر artisan آخر. يمكن القيام بذلك باستخدام التابع call. يقبل هذا التابع كمعاملات إسم الأمر و مصفوفة معاملاته:
+
في بعض الأحيان، قد تحتاج لنداء أمرٍ من أمر artisan آخر. يمكن القيام بذلك باستخدام التابع <code>call</code>. يقبل هذا التابع كمعاملات إسم الأمر و مصفوفة معاملاته:<syntaxhighlight lang="php">
 
/**
 
/**
* تنفيذ الأمر
+
* تنفيذ الأمر
*
+
*
* @return mixed
+
* @return mixed
*/
+
*/
public function handle()
+
 
{
+
public function handle() {
    $this->call('email:send', [
+
 
        'user' => 1, '--queue' => 'default'
+
  $this->call('email:send', [
    ]);
+
      'user' => 1, '--queue' => 'default'
 +
  ]);
 +
  //
  
  //
 
 
}
 
}
إن أردت نداء أمر مع كبح كل مُخرجاته، يمكنك ذلك باستعمال التابع callsilent. يعمل هذا التابع تماما مثل التابع call:
+
</syntaxhighlight>
 +
إن أردت نداء أمر مع كبح كل مُخرجاته، يمكنك ذلك باستعمال التابع <code>callsilent</code>. يعمل هذا التابع تماما مثل التابع <code>call</code>:
 +
<syntaxhighlight lang="php">
 
$this->callSilent('email:send', [
 
$this->callSilent('email:send', [
    'user' => 1, '--queue' => 'default'
+
 
 +
  'user' => 1, '--queue' => 'default'
 +
 
 
]);
 
]);
مصادر
+
</syntaxhighlight>
صفحة 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'

]);

مصادر