> هنگام انجام کارها یا آن ها را با عشق انجام دهید یا هرگز انجام ندهید.
این جمله از **گاندی** رضا را به این فکر فرو برده است که فکری برای انجام بسیاری از کارهای تکراری که باید بهطور متناوب انجام دهد بکند. بهعنوان مثال او از خط فرمان (*command-line*) خیلی استفاده میکند و همیشه آرزو داشت تا دستوراتی را خودش ایجاد و از آنها استفاده کند.
در این سؤال باید بههمراه او این آرزو را برآورده کنید.
## جزئیات پروژه
پروژهی اولیه را از [این لینک](/contest/assignments/35047/download_problem_initial_project/121220/) دانلود کنید.
<details class="grey">
<summary>ساختار فایلها</summary>
```
qcli
├── core
│ ├── Commands
│ └── Command.php
├── stubs
│ └── command.stub
├── test
│ └── QCliSampleTest.php
├── composer.json
├── composer.lock
└── qcli
```
</details>
<details class="brown">
<summary>راهاندازی پروژه</summary>
**برای اجرای پروژه، باید `php` و `composer` را از قبل نصب کرده باشید.**
+ پروژهی اولیه را دانلود و از حالت فشرده خارج کنید.
+ دستور `composer install` را در پوشهی اصلی پروژه برای نصب نیازمندیها اجرا کنید.
</details>
در دایرکتوری اصلی پروژه، فایلی به نام `qcli` وجود دارد که یک اسکریپت *PHP* است. از این فایل برای هندل کردن دستورات استفاده میشود. این فایل پس از دریافت دستور، پارامترهای ورودی را برای اجرا به متد `run` کلاس `QCli\Command` ارسال میکند.
در ابتدا باید برنامه را طوری پیادهسازی کنید که دستور `make:command <mark title="نام کلاس">name</mark> <mark title="امضای دستور">sign</mark>` بهصورت پیشفرض در برنامه موجود باشد. `name` نام کلاس دستور و `sign` امضای دستور است. وظیفهی این دستور این است که دستورات دلخواه را در دایرکتوری `core/Commands` ایجاد کند. قالب دستوراتی که ایجاد میشوند باید مطابق محتویات فایل `stubs/command.stub` باشد:
```php stubs/command.stub php
<?php
namespace QCli\Commands;
class <mark title="نام کلاس">{{ name }}</mark>
{
protected string $signature = '<mark title="امضای دستور">{{ sign }}</mark>';
protected string $description = '<mark title="نام کلاس">{{ name }}</mark> description';
public function handle()
{
echo 'Command ' . $this->signature . ' is ready to implement';
}
}
```
فرض کنید دستور زیر در خط فرمان وارد میشود:
```shell
php qcli make:command <mark title="نام کلاس">CustomCommand</mark> <mark title="امضای دستور">custom:command</mark>
```
با اجرای دستور فوق، باید فایل `CustomCommand.php` در مسیر `core/Commands` ساخته شود:
```php core/Commands/CustomCommand.php php
<?php
namespace QCli\Commands;
class CustomCommand
{
protected string $signature = 'custom:command';
protected string $description = 'CustomCommand description';
public function handle()
{
echo 'Command ' . $this->signature . ' is ready to implement';
}
}
```
همچنین ممکن است کلاسهایی بهصورت دستی (بدون استفاده از دستور پیشفرض `make:command`) در مسیر `core/Commands` ایجاد شوند. برنامه باید بتواند این دستورات را نیز شناسایی کند. **تضمین میشود** که این کلاسها نیز مطابق محتویات فایل `stubs/command.stub` هستند.
اگر دستور ایجادشده در خط فرمان وارد شود، باید متد `handle` از کلاس دستور اجرا شود، یعنی در مثال قبل اگر دستور زیر وارد شود:
```shell
php qcli <mark title="امضای دستور">custom:command</mark>
```
باید عبارت `Command custom:command is ready to implement` چاپ شود.
## نکات
+ **تضمین میشود** که دو دستور با نام کلاس یا امضای یکسان ایجاد نخواهد شد.
+ این پروژه از استاندارد [*PSR-4*](https://www.php-fig.org/psr/psr-4/) برای *autoloading* کلاسها استفاده میکند.
+ شما تنها مجاز به اعمال تغییرات در دایرکتوری `core` هستید. میتوانید فایلها و دایرکتوریهای جدیدی نیز در این دایرکتوری ایجاد کنید.
+ در صورت نیاز، میتوانید متدهای دیگری نیز در کلاس `QCli\Command` پیادهسازی کنید.
## آنچه باید آپلود کنید
پس از اعمال تغییرات، پوشهی `core` را زیپ کرده و آپلود کنید.