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

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
(أنشأ الصفحة ب'== البدء باستخدام Laravel == === التثبيت === === الضبط === === Laravel/structure|بنية...')
 
 
(28 مراجعة متوسطة بواسطة 3 مستخدمين غير معروضة)
سطر 1: سطر 1:
== البدء باستخدام Laravel ==
+
<noinclude>{{DISPLAYTITLE:الأمر Artisan console) Artisan) في  Laravel}}</noinclude>
=== [[Laravel/installation|التثبيت]] ===
+
== مقدمة ==
=== [[Laravel/configuration|الضبط]] ===
+
Artisan هي واجهة الأوامر المُرفقة ب [[Laravel]]. وهي تُوفّر عددًا من الأوامر المفيدة والتي ستساعدك في بناء التطبيق. لإظهار جميع الأوامر التي يوفّرها Artisan، يمكنك استعمال الأمر <code>list</code><syntaxhighlight lang="php">
=== [[Laravel/structure|بنية المجلدات في Laravel]] ===
+
php artisan list
=== [[Laravel/homestead|بيئة Laravel Homestead]] ===
+
</syntaxhighlight>
=== [[Laravel/valet|بيئة تطوير Valet Laravel]] ===
 
=== [[Laravel/deployment|النشر على الخادم الإنتاجي]] ===
 
  
== المفاهيم البنيوية ==
+
يحتوي كل أمر على صفحة مساعدة "help" تعرّف وتوضّح الأمر كما تُقدّم قائمة المعاملات والخيارات لكل أمر. يُستعمل الأمر مسبوقًا بالكلمة <code>help</code> لإظهار صفحة المساعدة:<syntaxhighlight lang="php">
=== [[Laravel/lifecycle|دورة حياة الطلب]] ===
+
php artisan help migrate
=== [[Laravel/container|حاوي الخدمات]] ===
+
</syntaxhighlight>
=== [[Laravel/providers|مقدمو الخدمات]] ===
 
=== [[Laravel/facades|الواجهات الساكنة (Facades)]] ===
 
=== [[Laravel/contracts|العقود]] ===
 
  
== الأساسيات ==
+
=== Laravel REPL ===
=== [[Laravel/routing|التوجيه]] ===
+
تأتي كل تطبيقات Laravel مُرفَقَةً ب Tinker، وهي REPL مشغّلة بواسطة حُزمة PsySH. يسمح Tinker بالتفاعل مع كافّة مكوّنات التطبيق من سطر الأوامر بما في ذلك رابط الكائنات بالعلاقات [[Laravel/eloquent|Eloquent]]، والمهام، و الأحداث و غيرها الكثير. للدخول لبيئة Tinker، استعمل الأمر <code>tinker</code>:
=== [[Laravel/middleware|البرمجيات الوسيطة]] ===
+
<syntaxhighlight lang="php">
=== [[Laravel/csrf|الحماية من هجمات CSRF]] ===
+
php artisan tinker
=== [[Laravel/controllers|المتحكمات]] ===
+
</syntaxhighlight>
=== [[Laravel/requests|الطلبات]] ===
 
=== [[Laravel/responses|الإجابات]] ===
 
=== [[Laravel/views|العروض]] ===
 
=== [[Laravel/urls|توليد روابط URL]] ===
 
=== [[Laravel/session|الجلسات]] ===
 
=== [[Laravel/validation|التحقق (Validation)]] ===
 
=== [[Laravel/errors|معالجة الأخطاء]] ===
 
=== [[Laravel/logging|التسجيل]] ===
 
  
== الواجهة الأمامية ==
+
== كتابة الأوامر ==
=== [[Laravel/blade|قوالب Blade]] ===
+
بالإضافة للأوامر التي يُوفّرها artisan، يمكنك إنشاء أوامرك الخاصّة. هذه الأوامر تحفظ عادةً في الدليل <code>app/console/Commands</code>. لكن يمكنك اختيار مكان حفظ خاص بك طالما بإمكان composer تحميل الأوامر.
=== [[Laravel/localization|التوطين]] ===
 
=== [[Laravel/frontend|بناء Javascript و CSS]] ===
 
=== [[Laravel/mix|ترجمة الأصول (Laravel Mix)]] ===
 
  
== الأمان والحماية ==
+
=== توليد الأوامر ===
=== [[Laravel/authentication|الاستيثاق]] ===
+
لتوليد أمر جديد، استعمل الأمر <code>make:command</code>. سينشئ هذا الأمر صنف أوامر جديدًا في الدليل <code>app/Console/Commands</code>. إن لم يكن الدليل موجودا في التطبيق فإن الأمر سينشئه أول مرّة يُنفّذ فيها. سيحتوي الأمر المنشأ على الخصائص والتوابع المبدئية الحاضرة في كل الأوامر:<syntaxhighlight lang="php">
=== [[Laravel/passport|الاستثياق باستخدام واجهة API خارجية]] ===
+
php artisan make:command SendEmails
=== [[Laravel/authorization|الترخيص]] ===
+
</syntaxhighlight>
=== [[Laravel/encryption|التشفير]] ===
 
=== [[Laravel/hashing|التجزئة ]] ===
 
=== [[Laravel/passwords|إعادة تعيين كلمات المرور]] ===
 
  
== التعمق في Laravel ==
+
=== هيكلة الأمر ===
=== [[Laravel/artisan|الأمر Artisan]] ===
+
بعد توليد الأمر، يجب ملأ الخاصّيتين <code>signature</code> <code>وdescription</code> في الصنف، والذين سيُستعملان حين إظهار الأمر الجديد في الصفحة list. سيُنادى التابع <code>handle</code> حين تنفيذ الأمر، يمكنك وضع منطق عمل الأمر في هذا التابع.
=== [[Laravel/broadcasting|البث (Broadcasting)]] ===
 
=== [[Laravel/cache|التخزين المؤقت]] ===
 
=== [[Laravel/collections|المجموعات]] ===
 
=== [[Laravel/events|الأحداث]] ===
 
=== [[Laravel/filesystem|تخزين الملفات]] ===
 
=== [[Laravel/helpers|الدوال المساعدة]] ===
 
=== [[Laravel/mail|التعامل مع البريد الإلكتروني]] ===
 
=== [[Laravel/notifications|التنبيهات]] ===
 
=== [[Laravel/packages|الحزم]] ===
 
=== [[Laravel/queues|Queues]] ===
 
=== [[Laravel/scheduling|جدولة المهام]] ===
 
  
== قواعد البيانات ==
+
<u>ملاحظة</u> : لاستعمالٍ أمثل للأمر، يفضّل إبقاء الأمر خفيفا وتحويل المهام الثقيلة لبقية خدمات التطبيق. في المثال الموالي لاحظ أننا نحقن صنف خدمات ليرسل الرسائل.
=== [[Laravel/database|مقدمة إلى التعامل مع قواعد البيانات]] ===
 
=== [[Laravel/queries|باني طلبيات قواعد البيانات Queries]] ===
 
=== [[Laravel/pagination|تعدد الصفحات عند التعامل مع قواعد البيانات Pagination]] ===
 
=== [[Laravel/migrations|Migrations]] ===
 
=== [[Laravel/seeding|ملء قواعد البيانات بالبيانات الاختبارية Seeding]] ===
 
=== [[Laravel/redis|التعامل مع قواعد بيانات Redis]] ===
 
  
== رابط الكائنات بالعلاقات Eloquent ==
+
لنلق نظرة على المثال الموالي، لاحظ أنّه بإمكاننا إضافة أي اعتماديات قد نحتاجها للدّالة البانية أو للتابع <code>handle</code>.ستضيف [[Laravel/container|حاوي الخدمات في Laravel]] تلقائيا كل الاعتماديات المذكورة في الدالة البانية أو في التابع <code>handle</code>:<syntaxhighlight lang="php">
=== [[Laravel/eloquent|مقدمة إلى رابط الكائنات بالعلاقات Eloquent]] ===
+
<?php
=== [[Laravel/eloquent_relationships|العلاقات في رابط الكائنات بالعلاقات Eloquent]] ===
 
=== [[Laravel/eloquent_collections|المجامع في رابط الكائنات بالعلاقات Eloquent]] ===
 
=== [[Laravel/eloquent_mutators|المعدلون في رابط الكائنات بالعلاقات Eloquent]] ===
 
=== [[Laravel/eloquent_resources|الموارد في رابط الكائنات بالعلاقات Eloquent]] ===
 
=== [[Laravel/eloquent_serialization|السلسلة في رابط الكائنات بالعلاقات Eloquent]] ===
 
  
== الاختبار ==
+
namespace App\Console\Commands;
=== [[Laravel/testing|مقدمة إلى التعامل مع الاختبارات]] ===
 
=== [[Laravel/http_tests|اختبارات HTTP]] ===
 
=== [[Laravel/dusk|اختبارات المتصفح (Laravel Dusk)]] ===
 
=== [[Laravel/database_testing|اختبارات قواعد البيانات]] ===
 
=== [[Laravel/mocking|تزييف الأحداث لأغراض الاختبارMocking]] ===
 
  
== الحزم الرسمية ==
+
use App\User; use App\DripEmailer;
=== [[Laravel/billing|Laravel Cashier]] ===
+
 
=== [[Laravel/envoy|مشغِّل المهام Envoy]] ===
+
use Illuminate\Console\Command;
=== [[Laravel/horizon|Laravel Horizon]] ===
+
 
=== [[Laravel/passport|الواجهة البرمجية للاستيثاق]] ===
+
class SendEmails extends Command
=== [[Laravel/scout|Laravel Scout]] ===
+
 
=== [[Laravel/socialite|Laravel Socialite]] ===
+
{
 +
 
 +
  /**
 +
    *اسم و توقيع الأمر
 +
    *
 +
    * @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')));
 +
  }
 +
 
 +
}
 +
</syntaxhighlight>
 +
 
 +
=== أوامر النطاق المغلق 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">
 +
/**
 +
* تثبيت أصول  الأوامر Closure
 +
*
 +
* @return void
 +
*/
 +
 
 +
protected function commands() {
 +
 
 +
  require base_path('routes/console.php');
 +
}
 +
</syntaxhighlight>
 +
 
 +
رغم أنّ هذا الملف لا يعرّف مسارات HTTP، إلّا أنّه يعرّف نقاط دخول (مسارات) تابعة لسطر الأوامر console. في هذا الملف يمكنك تعريف مسارات النطاق المغلق <code>Closure</code> باستعمال التابع  <code>Artisan::command</code>. يقبل التابع <code>command</code> معاملَيْن : توقيع الأمر و كائن <code>Closure</code> لاستقبال معاملات و خيارات الأمر:<syntaxhighlight lang="php">
 +
Artisan::command('build {project}', function ($project) {
 +
 
 +
  $this->info("Building {$project}!");
 +
});
 +
</syntaxhighlight>
 +
النطاق المغلق <code>Closure</code> مرتبط بنسخة الأمر، لذا بإمكانك استعمال جميع التوابع المساعدة التي تأتي مع صنف الأوامر.
 +
 
 +
==== التلميح إلى نوع الاعتماديات ====
 +
بالإضافة إلى استقبال معامِلات وخيارات الأوامر، يمكن لأوامر النطاق المغلق Closure التلميح إلى نوع بعض الاعتماديات التي قد تريد حلّها خارج حاوية الخدمات.<syntaxhighlight lang="php">
 +
use App\User;
 +
use App\DripEmailer;
 +
 
 +
Artisan::command('email:send {user}', function (DripEmailer $drip, $user) {
 +
    $drip->send(User::find($user));
 +
});
 +
</syntaxhighlight>
 +
 
 +
==== توصيف أوامر النطاق المغلق Closure ====
 +
عند تعريف أمر Closure، يمكنك استعمال التابع <code>describe</code> لإضافة تعريف للأمر. سيظهر هذا التعريف عند تنفيذ الأمر <code>php artisan list</code> أو <code>php artisan help</code>:<syntaxhighlight lang="php">
 +
Artisan::command('build {project}', function ($project) {
 +
  $this->info("Building {$project}!");
 +
 
 +
})->describe('Build the project');
 +
</syntaxhighlight>
 +
 
 +
== تعريف استثناءات الإدخال ==
 +
عند كتابة أوامر التحكم، من الطبيعي جمع البيانات المدخلة من المستخدم عن طريق الخيارات أو المعاملات. يجعل [[Laravel]] توقع البيانات المدخلة أمرًا سهلًا عبر تحديد خاصية الأمر <code>signature</code>. تسمح هذه الخاصية بتحديد إسم، ومعاملات، وخيارات الأمر في صياغة واحدة معبّرة، وشبيهة بصياغة المسارات.
 +
 
 +
=== المعاملات ===
 +
تُحاط كل المعاملات والخيارات المزوَّدة بأقواس معقّفة. في المثال التالي، يعرِّف الأمر خيارًا واحدًا '''إجباريًّا''' هو <code>user</code><syntaxhighlight lang="php">
 +
/**
 +
* إسم و إمضاء الأمر
 +
*
 +
* @var string
 +
*/
 +
 
 +
protected $signature = 'email:send {user}';
 +
</syntaxhighlight>
 +
يمكن أيضًا تعريف معاملات غير إجبارية و إعطاؤها قيما مبدئية:<syntaxhighlight lang="php">
 +
// معاملات غير إجبارية
 +
 
 +
email:send {user?}
 +
 
 +
// معاملات غير إجبارية بقيم مبدئية
 +
 
 +
email:send {user=foo}
 +
</syntaxhighlight>
 +
 
 +
=== الخيارات ===
 +
الخيارات، مثل المعاملات، هي شكل من أشكال البيانات التي يدخلها المستخدم. تُسبَق الخيارات في سطر الأمر بمطَّتين قصيرتين (--). يوجد نوعان من الخيارات :تلك التي تقبل قيمة ما وتلك التي لا تقبل. الخيارات التي لا تقبل قيمة تعمل كمبدّل بقيمة منطقية "<code>switch</code>". لنلاحظ المثال التالي:<syntaxhighlight lang="php">
 +
/**
 +
*
 +
* @var string
 +
*/
 +
 
 +
protected $signature = 'email:send {user} {--queue}';
 +
</syntaxhighlight>
 +
 
 +
في هذا المثال، يمكن ذكر المبدّل <code>queue--</code> عند استعمال الأمر. إذا مُرّر المبدّل، فإنّ قيمة الخيار ستكون "<code>true</code>"وإلّا فإنّ قيمته ستكون "<code>false</code>".<syntaxhighlight lang="php">
 +
php artisan email:send 1 --queue
 +
</syntaxhighlight>
 +
 
 +
==== الخيارات القابلة لقيمة ====
 +
لنلق نظرة على الخيارات التي تتوقّع أن يُدخِل المستخدم قيمة. إذا كان تمرير القيمة إجباريًّا للخيار، أتبع الخيار بالرمز =:<syntaxhighlight lang="php">
 +
/**
 +
*
 +
* @var string
 +
*/
 +
 
 +
protected $signature = 'email:send {user} {--queue=}';
 +
</syntaxhighlight>
 +
 
 +
في هذا المثال يمكن للمستخدم أن يُدخِل قيمة للخيار كما يلي:<syntaxhighlight lang="php">
 +
php artisan email:send 1 --queue=default
 +
</syntaxhighlight>
 +
 
 +
يمكن تخصيص قيمة مبدئية بعد اسم الخيار، إذا لم يمرّر المستخدم أي قيمة للخيار، تُعتمد القيمة المبدئية<syntaxhighlight lang="php">
 +
email:send {user} {--queue=default}
 +
</syntaxhighlight>
 +
 
 +
==== اختصار الخيارات ====
 +
لتخصيص اختصار لخيار ما، يمكنك تعريفه قبل اسم الخيار واستعمال الرمز | للتفريق بين الاختصار و الإسم الكامل:<syntaxhighlight lang="php">
 +
email:send {user} {--Q|queue}
 +
</syntaxhighlight>
 +
 
 +
=== إدخال مصفوفات البيانات ===
 +
إن أردت تعريف خيارات تتوقع مصفوفات كبيانات مُمرّرة، يمكنك استعمال الرمز * . لنلق نظرة على المثال الأول:<syntaxhighlight lang="php">
 +
email:send {user*}
 +
</syntaxhighlight>
 +
 
 +
عند استعمال هذا الأمر، ستُمرَّر القيم للخيار <code>user</code> بالترتيب. مثلا، الأمر الموالي سيغيّر قيمة <code>user</code> إلى <code>['foo', 'bar']</code>:<syntaxhighlight lang="php">
 +
php artisan email:send foo bar
 +
</syntaxhighlight>
 +
 
 +
عند تمرير مصفوفة بيانات للخيارات التي تقبل مصفوفات، يجب أن تُسبَق كل قيمة ممرّرة باسم الخيار:<syntaxhighlight lang="php">
 +
email:send {user} {--id=*}
 +
php artisan email:send --id=1 --id=2
 +
</syntaxhighlight>
 +
 
 +
=== وصف البيانات المدخلة ===
 +
يمكن تخصيص وصف أو تعريف للخيارات والمعاملات المدخلة عبر تفريق المعامل عن التعريف باستخدام نقطتين ":". إن احتجت مزيدا من المساحة لتعريف الأمر يمكنك توزيع التعريف على أكثر من سطر:<syntaxhighlight lang="php">
 +
/**
 +
* اسم و توقيع الأمر
 +
*
 +
* @var string
 +
*/
 +
 
 +
protected $signature = 'email:send
 +
                      {user : The ID of the user}
 +
                      {--queue= : Whether the job should be queued}';
 +
</syntaxhighlight>
 +
 
 +
== أوامر الإدخال والإخراج I/O ==
 +
 
 +
=== استرداد البيانات المدخَلة ===
 +
عندما يعمل الأمر، ستحتاج طبعا للإطلاع على قيم المعاملات والخيارات التي تلقاها الأمر. للقيام بهذا، يمكنك استعمال أحد التابعين <code>argument</code> و <code>option</code>:<syntaxhighlight lang="php">
 +
/**
 +
*  تنفيذ الأمر *
 +
* @return mixed
 +
*/
 +
 
 +
public function handle() {
 +
  $userId = $this->argument('user');
 +
  //
 +
 
 +
}
 +
</syntaxhighlight>
 +
إذا أردت استرداد كل المعاملات على شكل مصفوفة، يمكنك استعمال التابع <code>arguments</code>:<syntaxhighlight lang="php">
 +
$arguments = $this->arguments();
 +
</syntaxhighlight>
 +
تُسترجَع الخيارات بسهولة مثل المعاملات باستعمال التابع <code>option</code>. وتُسترجع كل الخيارات كمصفوفة باستعمال التابع <code>options</code>:<syntaxhighlight lang="php">
 +
//استرجاع خيار معيّن
 +
$queueName = $this->option('queue');
 +
 
 +
// استرجاع كل الخيارات
 +
$options = $this->options();
 +
</syntaxhighlight>
 +
 
 +
إن كان المعامل أو الخيار غير موجود، تُرجَع القيمة <code>null</code>.
 +
 
 +
=== الحث على إدخال البيانات ===
 +
بالإضافة إلى عرض البيانات المُخرجَة، يمكنك أن تطلب من المستخدم إدخال بيانات عند تنفيذ الأمر. سيُقدّم التابع <code>ask</code> السؤال المطروح للمستخدم ويقبل منه القيمة الممرّرة ويعيدها للأمر:<syntaxhighlight lang="php">
 +
/**
 +
*
 +
*
 +
* @return mixed
 +
*/
 +
 
 +
public function handle() {
 +
 
 +
  $name = $this->ask('What is your name?');
 +
}
 +
</syntaxhighlight>
 +
 
 +
التابع <code>secret</code> شبيه بالتابع <code>ask</code> لكن القيمة التي يُدخلها المستخدم لن تكون ظاهرة له عند كتابتها. هذا التابع مفيد عند إدخال بيانات حساسة مثل كلمات المرور:<syntaxhighlight lang="php">
 +
$password = $this->secret('What is the password?');
 +
</syntaxhighlight>
 +
 
 +
==== طلب التأكيد ====
 +
إذا أردت أن تطلب من المستخدم تأكيدًا بسيطًا، يمكنك استخدام التابع <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?')) {
 +
 
 +
  //
 +
 
 +
}
 +
</syntaxhighlight>
 +
 
 +
==== الإكمال الآلي ====
 +
يُستخدم التابع <code>anticipate</code> لتوفير خيارات إكمال آلي. مازال بإمكان المستخدم إدخال أي قيمة يريد رغم تلميحات الإكمال الآلي:<syntaxhighlight lang="php">
 +
$name = $this->anticipate('What is your name?', ['Taylor', 'Dayle']);
 +
</syntaxhighlight>
 +
 
 +
==== الأسئلة ذات الخيارات المتعدّدة ====
 +
إذا أردت أن تُقدّم للمستخدم مجموعة من الخيارات المٌعدّة مسبقا، يمكنك ذلك باستعمال التابع <code>choice</code>. يمكنك أيضًا تحديد مكان القيمة المبدئية من مصفوفة الخيارات في حال لم يُرجع المستخدم أي قيمة:<syntaxhighlight lang="php">
 +
$name = $this->choice('What is your name?', ['Taylor', 'Dayle'], $defaultIndex);
 +
</syntaxhighlight>
 +
 
 +
=== كتابة البيانات المخرجَة ===
 +
لإرسال بيانات لوحدة الأوامر، استعمل التوابع <code>line</code> ،<code>info</code> ،<code>comment</code> ،<code>question</code>، و <code>error</code>. ستستخدم كل هذه التوابع ألوان ANSII الملائمة. مثلًا، لإظهار بعض المعلومات العامة للمستخدم، تستخدم التابع <code>info</code> الذي يظهر البيانات عادة بالأخضر:<syntaxhighlight lang="php">
 +
/**
 +
* تنفيذ الأمر
 +
*
 +
* @return mixed
 +
*/
 +
 
 +
public function handle() {
 +
 
 +
  $this->info('Display this on the screen');
 +
 
 +
}
 +
</syntaxhighlight>
 +
 
 +
لإظهار رسالة خطأ، استعمل التابع <code>error</code> الذي يظهر البيانات عادة باللون الأحمر:<syntaxhighlight lang="php">
 +
$this->error('Something went wrong!');
 +
</syntaxhighlight>
 +
 
 +
إذا أردت إظهار البيانات دون لون، استخدم التابع <code>line</code>:<syntaxhighlight lang="php">
 +
$this->line('Display this on the screen');
 +
</syntaxhighlight>
 +
 
 +
==== أنساق الجداول ====
 +
يجعل التابع <code>table</code> تصميم و تنسيق سطور وأعمدة متعددة من البيانات أمرًا سهلًا. فقط مرّر ترويسة الجدول وسطور البيانات للتابع و سيحسب تلقائيًّا طول وعرض الجدول حسب البيانات المتوفّرة:<syntaxhighlight lang="php">
 +
$headers = ['Name', 'Email'];
 +
$users = App\User::all(['name', 'email'])->toArray();
 +
$this->table($headers, $users);
 +
</syntaxhighlight>
 +
 
 +
==== شريط التقدم ====
 +
بالنسبة للمهام التي تأخذ وقتا طويلًا، قد يكون من المفيد إظهار مؤشر تقدّم لها. باستخدام كائن الإخراج، بالإمكان بدء وتقديم وإيقاف شريط التقدّم. في البداية، حدّد عدد الخطوات التي سيمرّ بها العمل، ثم قدّم الشريط بعد نهاية كل خطوة:<syntaxhighlight lang="php">
 +
$users = App\User::all();
 +
$bar = $this->output->createProgressBar(count($users));
 +
 
 +
foreach ($users as $user) {
 +
 
 +
  $this->performTask($user);
 +
  $bar->advance();
 +
 
 +
}
 +
$bar->finish();
 +
</syntaxhighlight>
 +
 
 +
للمزيد من الخيارات، راجع [https://symfony.com/doc/current/components/console/helpers/progressbar.html شريط التقدم في توثيق symfony.]
 +
 
 +
== تسجيل الأوامر ==
 +
بسبب نداء التابع <code>load</code> في التابع <code>commands</code> من نواة وحدة الأوامر،تٌسجّل كل الأوامر في الدليل <code>app/console/Commands</code> تلقائيا في artisan. بإمكانك أيضا نداء التابع <code>load</code> للبحث عن أوامر artisan في أماكن أخرى:<syntaxhighlight lang="php">
 +
/**
 +
* تسجيل الأوامر للتطبيق
 +
*
 +
* @return void
 +
*/
 +
 
 +
protected function commands() {
 +
 
 +
  $this->load(__DIR__.'/Commands');
 +
  $this->load(__DIR__.'/MoreCommands');
 +
  // ...
 +
 
 +
}
 +
</syntaxhighlight>
 +
 
 +
يمكنك أيضا تسجيل الأوامر يدويًّا عبر إضافة إسم الصنف للخاصية <code>commands$</code> في الملف <code>app/console/kernel.php</code>. كل الأوامر الموجودة في هذه الخاصية ستحمل في حاوي الخدمات وتضاف لأوامر artisan:<syntaxhighlight lang="php">
 +
protected $commands = [
 +
 
 +
  Commands\SendEmails::class
 +
 
 +
];
 +
</syntaxhighlight>
 +
 
 +
== تنفيذ الأوامر بطريقة برمجية ==
 +
في بعض الأحيان، قد تريد تنفيذ أمر artisan خارج واجهة خطوط الأوامر(CLI). مثلا، قد تريد تنفيذ الأمر من مسار أو من وحدة تحكم. يمكنك استعمال التابع <code>call</code> في الواجهة الساكنة ل artisan. يقبل التابع <code>call</code> إسم أمر أو صنفا كمعامل أول، و مصفوفة من معامِلات الأمر كمعامل ثاني. يُعيد المعامل شيفرة خروج الأمر:<syntaxhighlight lang="php">
 +
Route::get('/foo', function () {
 +
 
 +
  $exitCode = Artisan::call('email:send', [
 +
      'user' => 1, '--queue' => 'default'
 +
  ]);
 +
 
 +
});
 +
</syntaxhighlight>
 +
باستعمال التابع <code>queue</code> في الواجهة الساكنة artisan، يمكنك صفّ الأوامر ليُنفّذها عمّال قائمة الانتظار في الخلفيّة. تثبت من الضبط الجيد لقوائم الانتظار والمستمعين على قوائم الإنتظار:<syntaxhighlight lang="php">
 +
 
 +
Route::get('/foo', function () {
 +
 
 +
  Artisan::queue('email:send', [
 +
      'user' => 1, '--queue' => 'default'
 +
  ]);
 +
  //
 +
 
 +
});
 +
</syntaxhighlight>
 +
يمكنك أيضًا تحديد الصلة أو قائمة الانتظار التي تُرسل إليها أوامر artisan:
 +
<syntaxhighlight lang="php">
 +
Artisan::queue('email:send', [
 +
 
 +
  'user' => 1, '--queue' => 'default'
 +
 
 +
])->onConnection('redis')->onQueue('commands');
 +
</syntaxhighlight>
 +
 
 +
=== تمرير مصفوفة قيم ===
 +
لو كان للأمر خيارات تقبل مصفوفة بيانات، يمكن تمرير هذه المصفوفة كما يلي:<syntaxhighlight lang="php">
 +
Route::get('/foo', function () {
 +
 
 +
  $exitCode = Artisan::call('email:send', [
 +
      'user' => 1, '--id' => [5, 13]
 +
  ]);
 +
 
 +
});
 +
</syntaxhighlight>
 +
 
 +
=== تمرير قيم منطقية ===
 +
إن احتجت أن تمرّر قيمة لخيار لا يقبل قيمة نصيّة، مثل الخيار <code>force--</code> من الأمر <code>migrate:refresh</code>، يجب أن تُمرِّر القيمة <code>true</code> أو <code>false</code>:
 +
<syntaxhighlight lang="php">
 +
$exitCode = Artisan::call('migrate:refresh', [
 +
 
 +
  '--force' => true,
 +
 
 +
]);
 +
</syntaxhighlight>
 +
 
 +
=== نداء الأوامر من أوامر أخرى ===
 +
في بعض الأحيان، قد تحتاج لنداء أمرٍ من أمر artisan آخر. يمكن القيام بذلك باستخدام التابع <code>call</code>. يقبل هذا التابع كمعاملات إسم الأمر و مصفوفة معاملاته:<syntaxhighlight lang="php">
 +
/**
 +
* تنفيذ الأمر
 +
*
 +
* @return mixed
 +
*/
 +
 
 +
public function handle() {
 +
 
 +
  $this->call('email:send', [
 +
      'user' => 1, '--queue' => 'default'
 +
  ]);
 +
  //
 +
 
 +
}
 +
</syntaxhighlight>
 +
إن أردت نداء أمر مع كبح كل مُخرجاته، يمكنك ذلك باستعمال التابع <code>callsilent</code>. يعمل هذا التابع تماما مثل التابع <code>call</code>:
 +
<syntaxhighlight lang="php">
 +
$this->callSilent('email:send', [
 +
 
 +
  'user' => 1, '--queue' => 'default'
 +
 
 +
]);
 +
</syntaxhighlight>
 +
 
 +
== مصادر ==
 +
* [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'

]);

مصادر