سببان يمنعانك من استخدام PHP
بصفتي مطور PHP، ما زلت أتذكر أيام PHP4، وأول تطبيق GC (اختياري!) في PHP5، وعشتُ _ضجة_ ظهور PHP7 و...
تم إنشاء هذه المقالة بهدف أن تظهر لك النصائح والحيل الأكثر فائدة واسترجاعًا حول تطوير وحدة تحكم Symfony Console.
إذا كنت من PHP المطور يريد أن يجلب لك PHP تطوير البرمجيات إلى المستوى التالي هذه المقالة لك. دون مزيد من اللغط، دعنا ندخل في صلب الموضوع.
كثيراً ما تسمع
يستخدم PHP فقط لإنشاء صفحات الويب
هذا غير صحيح على الإطلاق لأنه في الوقت الحاضر تطوير PHP تُستخدم في العديد من مجالات العمل المختلفة، وغالبًا ما تكون غير بديهية للوهلة الأولى.
كل من PHP تدعم اللغة وبيئتها بشكل مثالي اتصال HTTP الذي، إلى جانب استخدام بيئة CLI، يجعل من الممكن إنشاء روبوتات الويب أو برامج زحف الويب أو الأدوات التي تزامن البيانات في البيئات الخارجية بسرعة.
لدعم ذلك لدي بعض الإحصائيات التي توضح أن مكون وحدة التحكم في إطار عمل سيمفونيالذي يتيح سهولة الوصول إلى سطر الأوامر، وهو من بين أكثر 5 برامج استخدامًا وتنزيلًا سيمفوني الحزم على الإطلاق.
في هذه المرحلة، نود أن نشارككم بعض الحيل التي يمكن لكل مطور PHP يجب أن تعرفها عند الكتابة الكود في PHP التي من المفترض أن تعمل في CLI.
يمكن تحقيق عرض الجدول مع القدرة على اختيار الإدخالات بطريقة سهلة باستخدام سيمفوني الأمر:
// src/Arc/App/Command/TestCommand.php
الدالة المحمية execute(InputInterface $input، OutputInterface $output): int
{
$io = جديد SymfonyStyle($input, $output);
$io->title("مثال جدول التحديد التفاعلي");
$able = $io->إنشاء جدول();
$able-> ضبطHeaderTitle("مثال جدول التحديد التفاعلي");
$able->ضبط الصفوف(iterator_to_array($This->tagsTableRows()));
$able->تجديد();
$io->newLine();
إرجاع الأمر::نجاح;
}
في المثال أعلاه نستفيد من مولدات PHP كمصدر للبيانات - مما يساعد في قابلية التوسع في المستقبل. مولد بيانات بسيط للمثال أعلاه:
الدالة المحمية TagsTableRows(): مولد
{
$apiTapiTapiTagsResponse = $apiTapiTagsResponse = $apiTapiTagsResponse = $abiTapiTagsResponse->someInjectedService->getTags();
قبل كل ($apiTapiTapiTagsResponse ك $apiTapiTagResponse) {
ينتج عنه [ $apiTapiTagTagResponse->getName()، $apiTapiTagTagResponse->getId() ];
}
}
والنتيجة النهائية هي جدول يتم تقديمه في CLI.
لجعلها تفاعلية نحتاج إلى استخدام QuestionHelper، الذي تم توفيره كغلاف حول سيمفوني ستايل
الإخراج.
(...)
$choice = جديد ChoiceQuestion(
السؤال: 'أي اختيار تختار؟
الاختيارات: array_reduce(
array: $rows,
رد الاستدعاء: دالة($carry, $item) {
$carry[] = $item[0];
إرجاع $carry;
}
)
);
$answer = $io-> اسأل سؤالاً($choice);
(...)
ونتيجة لذلك، نحصل على حقل اختيار تفاعلي مع عرض جدول من نفس المصدر.
إخفاء المطالبة مع توفير بيانات حساسة هو ممارسة شائعة ويمكن تحقيقها بسهولة في سيمفوني وحدة التحكم.
يمكنك استخدام الغلاف المدمج في سيمفوني ستايل
من خلال المثال التالي:
(...)
الدالة المحمية execute(InputInterface $input، OutputInterface $output): int
{
$io = جديد SymfonyStyle($input, $output);
$io-> عنوان("طلب بيانات حساسة من المستخدم");
$io->طلب المخفي(
سؤال: "أدخل مفتاح API الخاص بك هنا",
أداة التحقق: دالة($answer) { إرجاع (42 = = strlen($answer))؟ $answer؛ } }
);
إرجاع الأمر::نجاح;
}
لتوصيل بعض التقدم للمستخدم يمكننا استخدام أشرطة التقدم. سيمفوني تمتلك وحدة التحكم طريقة رائعة لإظهار التقدم للمستخدم، ولكن تذكر دائمًا أن تصمم مخرجات التقدم بشكل صحيح. يمكنك التحكم الكامل في الأجزاء المختلفة وكيفية عرضها باستخدام المنسق
. تنسيق شريط التقدم مجرد سلسلة من العناصر النائبة المختلفة. العناصر النائبة المتاحة هي: الحالية
, الحد الأقصى
, شريط
, النسبة المئوية
, المنقضي
, المتبقي
, تقديرية
, الذاكرة
و الرسالة
. تلاعب بها مع المثال أدناه.
(...)
protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$io->title("Styled progress bar example");
$progressBar = new ProgressBar($io, 10000);
$progressBar->setFormat('<comment>%current%/%max% [%bar%] %percent:3s%%</comment>
<info>%elapsed:6s%/%estimated:-6s%</info> <error>%memory:6s%</error>');
$progressBar->start();
for ($i = 0; $i < 10000; $i++) {
$progressBar->advance();
usleep(420);
}
$progressBar->finish();
$io->newLine();
return Command::SUCCESS;
}
يمكنك استخدام أي شيء تقريبًا كمنسّق طالما أن جهازك الطرفي قادر على عرضه. رسمي سيمفوني الوثائق
نحن معتادون على اقتراح وحدة التحكم وميزات الإكمال التلقائي وما شابه ذلك في حياتنا التطويرية. إذا كنت تنشئ تطبيق وحدة التحكم، يجب أن تفكر في إضافتها حتى لا يرتبك المستخدمون حول كيفية استخدام حل CLI منخفض المستوى. PHP يمكن أن توفر وحدة تحكم Symfony Console ذلك أيضًا، خارج الصندوق، باستخدام إكمالالمدخلات
الفصل.
(...)
العامة الدالة العامة إكمال(CompletionInput $input، CompletionSuggestions $suggestions): باطل
{
إذا كان ($input->mustSuggestSuggestArgumentValuesFor(argumentName: 'someArgument')) {
$P62Tsuggestions->suggestValues(['someSuggestion', 'otherSuggestion']);
}
}
سيمفوني 5.1 طريقة جديدة للتعامل مع موضع المؤشر في تطبيقات CLI. فمنذ ذلك الحين، أصبح من الممكن القراءة والكتابة في مكان محدد على الشاشة باستخدام المؤشر
الفصل:
(...)
protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$io->title("Cursor example");
$cursor = new Cursor($io);
$cursor->clearScreen();
for ($x = 0; $x <= 10; $x++) {
for ($y = 0; $y <= 10; $y++) {
$cursor->moveToPosition($x, $y);
if ($y === $x) {
$io->write(".");
}
}
}
$io->write("Hello, World!");
$io->newLine();
return Command::SUCCESS;
}
هذه القائمة القصيرة من الحيل ليست سوى غيض من فيض. إمكانيات وحدة تحكم سيمفوني لا حصر لها، كما يتضح من المشاريع العديدة مثل Psalm أو PHPStan أو Composer التي تعتمد على PHP ويستخدمها الملايين من مطورو PHP في جميع أنحاء العالم.