مجید مدیر فنی یک استارتآپ است. او در راستای افزایش تعداد مشتریان، میخواهد سایتشان را چندزبانه کند. او ساختار فایلهای *PO* را نمیپسندد؛ بنابراین ساختار جدیدی ارائه داده تا با استفاده از آن بتوان سایت را چندزبانه کرد. از شما میخواهیم بخش ترجمهی جملات بر اساس ساختاری که مجید ارائه داده است را پیادهسازی کنید.
# جزئیات پروژه
مجید برای متن ترجمهها، یک آرایهی انجمنی در نظر گرفته که کلیدهای آن، کد زبانهای مختلف و مقادیر متناظر با آنها، آرایههایی انجمنی شامل نگاشتی از جملات با زبان مبدأ به زبان مقصد هستند. نمونهای از یک آرایه شامل ترجمهها بهصورت زیر است:
```php
$translations = [
'fa' => [
'Hello!' => 'درود!',
'Hi!' => 'درود!'
],
'fr' => [
'Hello!' => 'Bonjour!'
]
];
```
تابعی با نام `getTranslation` پیادهسازی کنید که به ترتیب آرایهی ترجمهها، کد زبان و جملهی ورودی را دریافت کرده و متن ترجمهشده را برگرداند. اگر جملهی ورودی در آرایهی ترجمهها موجود نبود، همان متن ورودی را برگردانید.
امضای تابع `getTranslation` بهصورت زیر خواهد بود:
```php
function getTranslation($translations, $lang, $statement)
{
// TODO: Implement
}
```
# مثال
```php
<?php
function getTranslation($translations, $lang, $statement)
{
// TODO: Implement
}
$translations = [
'fa' => [
'Hello!' => 'درود!',
'Hi!' => 'درود!'
],
'fr' => [
'Hello!' => 'Bonjour!'
]
];
echo getTranslation($translations, 'fa', 'Hello!');
echo PHP_EOL;
echo getTranslation($translations, 'fr', 'Hello!');
echo PHP_EOL;
echo getTranslation($translations, 'fr', 'Something');
```
خروجی مورد انتظار:
```
درود!
Bonjour!
Something
```
# آنچه باید آپلود کنید
یک فایل *PHP* که تابع `getTranslation` در آن پیادهسازی شده است آپلود کنید.
نیما در شرکت *کدنویسگستران شرق بهجز حسن* مشغول به کار است. او فردی مینیمالیست است و از کتابخانههای بزرگ و پیچیدهی *PHP* متنفر است. در حال حاضر، تیم *کدنویسگستران شرق بهجز حسن* از موتور قالب *Smarty* استفاده میکند. این موتور قالب از نظر نیما بسیار بزرگ و پیچیده است. او تصمیم گرفته تا موتور قالب سادهای با نام *Smarties* بسازد تا در پروژههای بعدیشان از آن استفاده کنند.
از شما میخواهیم *Smarties* را برای نیما پیادهسازی کنید.
# جزئیات پروژه
پروژهی اولیه را از [این لینک](/contest/assignments/21628/download_problem_initial_project/74650/) دانلود کنید.
## اینترفیس `SmartiesFilter`
*اسمارتیز* همانند سایر *template engine* ها امکان اعمال فیلتر روی مقادیر را داراست. البته، این فیلترها هیچ آرگومانی بهجز مقدار فعلی ندارد. همهی فیلترهای *اسمارتیز* اینترفیس `SmartiesFilter` را پیادهسازی میکنند. این اینترفیس تنها شامل متدی با نام `apply` است که متن ورودی را دریافت کرده و پس از اعمال تغییرات، متن نهایی را برمیگرداند.
```php
interface SmartiesFilter
{
public function apply($text);
}
```
## کلاس `SmartiesFilterFactory`
وظیفهی این کلاس، تبدیل یک تابع به آبجکتی از `SmartiesFilter` است. این کلاس شامل متدی *static* به نام `create` است که یک تابع را به شکل نام تابع یا *anonymous function* دریافت کرده و یک آبجکت از نوع `SmartiesFilter` برمیگرداند که عملکرد متد `apply` آن دقیقاً مطابق با تابع ورودی است.
اگر آرگومان ورودی نامعتبر بود (قابل فراخوانی نبود)، یک `InvalidArgumentException` با متن پیغام `filter must be callable` *throw* کنید.
```php
class SmartiesFilterFactory
{
public static function create($filter)
{
// TODO: Implement
}
}
```
**توجه:** برای پیادهسازی متد `create`، مجاز به ایجاد کلاس جدید (کلاسی که *anonymous* نباشد) در برنامه نیستید.
## کلاس `Smarties`
این کلاس، کلاس اصلی *اسمارتیز* است. این کلاس شامل متدهای زیر است:
1. متد `addFilter($name, $filter)`: این متد، یک فیلتر با نام `$name` را به فیلترها اضافه میکند. موارد زیر را برای پیادهسازی این متد در نظر داشته باشید:
+ اگر فیلتری با این نام از قبل موجود باشد، فیلتر جدید باید جایگزین فیلتر قبلی شود. اگر فیلتر ورودی از نوع `SmartiesFilter` نباشد، باید یک `InvalidArgumentException` با متن پیغام `filter must implement SmartiesFilter` *throw* کنید.
+ *اسمارتیز* نباید به کوچکی و بزرگی حروف در نام فیلترها حساس باشد.
2. متد `render($filepath, $parameters)`: این متد، نام فایل قالب ورودی و آرایهای انجمنی از پارامترها دریافت میکند و رشتهی خروجی را برمیگرداند. موارد زیر را برای پیادهسازی این متد در نظر داشته باشید:
+ اگر فایل `$filepath` موجود نباشد، باید یک `Exception` با متن پیغام `input file not exist` *throw* کنید.
+ اگر پارامتری موجود نباشد، باید یک `Exception` با متن پیغام `parameter "$parameterName" not provided` *throw* کنید (`$parameterName` نام پارامتر است).
+ اگر فیلتری موجود نباشد، باید یک `Exception` با متن پیغام `filter "$filter" does not exist` *throw* کنید (`$filter` نام فیلتر است).
+ *اسمارتیز* نباید به کوچکی و بزرگی حروف در نام پارامترها حساس باشد. **تضمین میشود** که دو پارامتر نظیر `a` و `A` بهصورت همزمان به این متد داده نمیشود.
پارامترها در قالب بهصورت زیر نوشته میشوند:
```
{{ parameter_name }}
```
برای اعمال فیلتر نیز از کاراکتر `|` استفاده میشود. میتوان یک یا چند فیلتر را بر روی یک پارامتر اعمال کرد:
```
{{ parameter1|uppercase }}
{{ parameter2|reverse|uppercase }}
```
فیلترها باید بهترتیب از چپ به راست روی پارامتر اعمال شوند.
```php
class Smarties
{
public function addFilter($name, $filter)
{
// TODO: Implement
}
public function render($filepath, $parameters)
{
// TODO: Implement
}
}
```
# مثال
با اجرای اسکریپت `index.php` موجود در پروژهی اولیه، خروجی باید بهصورت زیر باشد:
```html
<!DOCTYPE html>
<html>
<head>
<title>sample</title>
</head>
<body>
<p>WELCOME TO CODECUP!</p>
</body>
</html>
```
# آنچه باید آپلود کنید
فایلهای `Smarties.php` و `SmartiesFilterFactory` را *Zip* کرده و آپلود کنید.
همانطور که میدانید، در لاراول عملیات ورود بهصورت پیشفرض توسط ایمیل و رمز عبور انجام میشود. در این سؤال شما باید این فرآيند را طوری تغییر دهید که کاربر بتواند علاوه بر ایمیل با شماره موبایل نیز وارد شود.
# جزئیات پروژه
*در این پروژه از Laravel 8 استفاده شده است.*
پروژهی اولیه را از [این لینک](/contest/assignments/21628/download_problem_initial_project/74651/) دانلود کنید.
<details class="grey">
<summary>ساختار فایلها</summary>
```
login_phone
├── app
│ ├── Actions
│ │ ├── Fortify
│ │ │ ├── CreateNewUser.php
│ │ │ ├── PasswordValidationRules.php
│ │ │ ├── ResetUserPassword.php
│ │ │ ├── UpdateUserPassword.php
│ │ │ └── UpdateUserProfileInformation.php
│ │ └── Jetstream
│ │ └── DeleteUser.php
│ ├── Console
│ │ └── Kernel.php
│ ├── Exceptions
│ │ └── Handler.php
│ ├── Http
│ │ ├── Controllers
│ │ │ └── Controller.php
│ │ ├── Middleware
│ │ │ ├── Authenticate.php
│ │ │ ├── EncryptCookies.php
│ │ │ ├── PreventRequestsDuringMaintenance.php
│ │ │ ├── RedirectIfAuthenticated.php
│ │ │ ├── TrimStrings.php
│ │ │ ├── TrustHosts.php
│ │ │ ├── TrustProxies.php
│ │ │ └── VerifyCsrfToken.php
│ │ └── Kernel.php
│ ├── Models
│ │ └── User.php
│ ├── Providers
│ │ ├── AppServiceProvider.php
│ │ ├── AuthServiceProvider.php
│ │ ├── BroadcastServiceProvider.php
│ │ ├── EventServiceProvider.php
│ │ ├── FortifyServiceProvider.php
│ │ ├── JetstreamServiceProvider.php
│ │ └── RouteServiceProvider.php
│ └── View
│ └── Components
│ ├── AppLayout.php
│ └── GuestLayout.php
├── bootstrap
│ ├── cache
│ │ ├── .gitignore
│ │ ├── packages.php
│ │ └── services.php
│ └── app.php
├── config
│ ├── app.php
│ ├── auth.php
│ ├── broadcasting.php
│ ├── cache.php
│ ├── cors.php
│ ├── database.php
│ ├── filesystems.php
│ ├── fortify.php
│ ├── hashing.php
│ ├── jetstream.php
│ ├── logging.php
│ ├── mail.php
│ ├── queue.php
│ ├── sanctum.php
│ ├── services.php
│ ├── session.php
│ └── view.php
├── database
│ ├── factories
│ │ └── UserFactory.php
│ ├── migrations
│ │ ├── 2014_10_12_000000_create_users_table.php
│ │ ├── 2014_10_12_100000_create_password_resets_table.php
│ │ ├── 2014_10_12_200000_add_two_factor_columns_to_users_table.php
│ │ ├── 2019_08_19_000000_create_failed_jobs_table.php
│ │ ├── 2019_12_14_000001_create_personal_access_tokens_table.php
│ │ └── 2020_11_17_093623_create_sessions_table.php
│ ├── seeders
│ │ └── DatabaseSeeder.php
│ └── .gitignore
├── public
│ ├── css
│ │ └── app.css
│ ├── js
│ │ └── app.js
│ ├── storage
│ │ └── .gitignore
│ ├── .htaccess
│ ├── favicon.ico
│ ├── index.php
│ ├── mix-manifest.json
│ ├── robots.txt
│ └── web.config
├── resources
│ ├── css
│ │ └── app.css
│ ├── js
│ │ ├── app.js
│ │ └── bootstrap.js
│ ├── lang
│ │ └── en
│ │ ├── auth.php
│ │ ├── pagination.php
│ │ ├── passwords.php
│ │ └── validation.php
│ └── views
│ ├── api
│ │ ├── api-token-manager.blade.php
│ │ └── index.blade.php
│ ├── auth
│ │ ├── forgot-password.blade.php
│ │ ├── login.blade.php
│ │ ├── register.blade.php
│ │ ├── reset-password.blade.php
│ │ ├── two-factor-challenge.blade.php
│ │ └── verify-email.blade.php
│ ├── layouts
│ │ ├── app.blade.php
│ │ └── guest.blade.php
│ ├── profile
│ │ ├── delete-user-form.blade.php
│ │ ├── logout-other-browser-sessions-form.blade.php
│ │ ├── show.blade.php
│ │ ├── two-factor-authentication-form.blade.php
│ │ ├── update-password-form.blade.php
│ │ └── update-profile-information-form.blade.php
│ ├── dashboard.blade.php
│ ├── navigation-dropdown.blade.php
│ └── welcome.blade.php
├── routes
│ ├── api.php
│ ├── channels.php
│ ├── console.php
│ └── web.php
├── storage
│ ├── app
│ │ ├── public
│ │ │ └── .gitignore
│ │ └── .gitignore
│ ├── framework
│ │ ├── cache
│ │ │ ├── data
│ │ │ │ └── .gitignore
│ │ │ └── .gitignore
│ │ ├── sessions
│ │ │ └── .gitignore
│ │ ├── testing
│ │ │ └── .gitignore
│ │ ├── views
│ │ │ └── .gitignore
│ │ └── .gitignore
│ └── logs
│ └── .gitignore
├── tests
│ ├── Feature
│ │ └── ExampleTest.php
│ ├── Unit
│ │ └── ExampleTest.php
│ ├── CreatesApplication.php
│ └── TestCase.php
├── .editorconfig
├── .env
├── .env.example
├── .gitattributes
├── .gitignore
├── .styleci.yml
├── README.md
├── artisan
├── composer.json
├── composer.lock
├── package-lock.json
├── package.json
├── phpunit.xml
├── server.php
├── tailwind.config.js
├── webpack.config.js
└── webpack.mix.js
```
</details>
<details class="brown">
<summary>راهاندازی پروژه</summary>
**برای اجرای پروژه، باید `php` و `composer` را از قبل نصب کرده باشید.**
+ ابتدا پروژهی اولیه را دانلود و از حالت فشرده خارج کنید.
+ دستور `composer install` را در پوشهی اصلی پروژه برای نصب نیازمندیها اجرا کنید.
</details>
پس از آن، میتوانید با دستور `php artisan migrate` مایگریشنها را اجرا کنید.
# نکات
+ نام ستونی از جدول `users` که شماره موبایل در آن ذخیره میشود `phone` است.
+ شماره موبایل و ایمیل هر دو از طریق فیلد `email` و از طریق متد *POST* ارسال میشوند.
+ شماره موبایل به صورت `09xxxxxxxxx` و ایمیلها به فرمت
`[ترکیبی از حروف انگلیسی و .]@[وبسایت بدون www]`
هستند و کاربر با هیچ حالتی غیر از این فرمتها نباید اجازه ورود پیدا کند.
+ شما تنها مجاز به اعمال تغییرات در پوشهی `app` هستید.
# آنچه باید آپلود کنید
پس از اعمال تغییرات، کل پروژه به غیر از پوشهی `vendor` را *Zip* کرده و آپلود کنید.
توجه کنید که نام فایل *Zip* اهمیتی ندارد.
شما در این چالش باید سفری به اعماق لاراول داشته باشید و یک *driver* جدید برای اتصال به دیتابیس پیادهسازی کنید.
دیتابیس با نام `quera.json` بهصورت فایل *JSON* در اختیار شما قرار داده شده است که دارای یک جدول به نام *users* است. وظیفهی شما در این سؤال این است که اتصالی با این دیتابیس برقرار کنید و اطلاعات داخل جدول `users` را برگردانید.
<details class="green">
<summary>محتوای `quera.json`</summary>
```json
{
"users": [
{
"name": "First",
"family": "User",
"username": "quera1",
"password": "123456789"
},
{
"name": "Second",
"family": "User",
"username": "quera2",
"password": "123456789"
},
{
"name": "Third",
"family": "User",
"username": "quera3",
"password": "123456789"
},
{
"name": "Forth",
"family": "User",
"username": "quera4",
"password": "123456789"
},
{
"name": "Fifth",
"family": "User",
"username": "quera5",
"password": "123456789"
},
{
"name": "Sixth",
"family": "User",
"username": "quera6",
"password": "123456789"
}
]
}
```
</details>
# جزئیات پروژه
*در این پروژه از Laravel 8 استفاده شده است.*
پروژهی اولیه را از [این لینک](/contest/assignments/21628/download_problem_initial_project/74653/) دانلود کنید.
<details class="grey">
<summary>ساختار فایلها</summary>
```
json_database
├── app
│ ├── Console
│ │ └── Kernel.php
│ ├── Exceptions
│ │ └── Handler.php
│ ├── Http
│ │ ├── Controllers
│ │ │ └── Controller.php
│ │ ├── Middleware
│ │ │ ├── Authenticate.php
│ │ │ ├── EncryptCookies.php
│ │ │ ├── PreventRequestsDuringMaintenance.php
│ │ │ ├── RedirectIfAuthenticated.php
│ │ │ ├── TrimStrings.php
│ │ │ ├── TrustHosts.php
│ │ │ ├── TrustProxies.php
│ │ │ └── VerifyCsrfToken.php
│ │ └── Kernel.php
│ ├── Models
│ │ └── User.php
│ └── Providers
│ ├── AppServiceProvider.php
│ ├── AuthServiceProvider.php
│ ├── BroadcastServiceProvider.php
│ ├── EventServiceProvider.php
│ └── RouteServiceProvider.php
├── bootstrap
│ ├── cache
│ │ ├── packages.php
│ │ └── services.php
│ └── app.php
├── config
│ ├── app.php
│ ├── auth.php
│ ├── broadcasting.php
│ ├── cache.php
│ ├── cors.php
│ ├── database.php
│ ├── filesystems.php
│ ├── hashing.php
│ ├── logging.php
│ ├── mail.php
│ ├── queue.php
│ ├── services.php
│ ├── session.php
│ └── view.php
├── database
│ ├── factories
│ │ └── UserFactory.php
│ ├── migrations
│ │ ├── 2014_10_12_000000_create_users_table.php
│ │ ├── 2014_10_12_100000_create_password_resets_table.php
│ │ └── 2019_08_19_000000_create_failed_jobs_table.php
│ └── seeders
│ └── DatabaseSeeder.php
├── public
│ ├── favicon.ico
│ ├── index.php
│ ├── robots.txt
│ └── web.config
├── resources
│ ├── css
│ │ └── app.css
│ ├── js
│ │ ├── app.js
│ │ └── bootstrap.js
│ ├── lang
│ │ └── en
│ │ ├── auth.php
│ │ ├── pagination.php
│ │ ├── passwords.php
│ │ └── validation.php
│ └── views
│ └── welcome.blade.php
├── routes
│ ├── api.php
│ ├── channels.php
│ ├── console.php
│ └── web.php
├── storage
│ ├── app
│ │ └── public
│ ├── framework
│ │ ├── cache
│ │ │ └── data
│ │ ├── sessions
│ │ ├── testing
│ │ └── views
│ └── logs
├── tests
│ ├── Feature
│ │ └── ExampleTest.php
│ ├── Unit
│ │ └── ExampleTest.php
│ ├── CreatesApplication.php
│ └── TestCase.php
├── README.md
├── artisan
├── composer.json
├── composer.lock
├── package.json
├── phpunit.xml
├── server.php
└── webpack.mix.js
```
</details>
<details class="brown">
<summary>راهاندازی پروژه</summary>
**برای اجرای پروژه، باید `php` و `composer` را از قبل نصب کرده باشید.**
+ ابتدا پروژهی اولیه را دانلود و از حالت فشرده خارج کنید.
+ دستور `composer install` را در پوشهی اصلی پروژه برای نصب نیازمندیها اجرا کنید.
</details>
پس از دریافت پروژه، در آدرس `database/quera.json` دیتابیس را مشاهده خواهید کرد که اگر به فایل `config/database.php` مراجعه کنید، خواهید دید که *connection* ای به نام `json` وجود دارد که اتصال با این دیتابیس را فراهم میکند. حال وظیفه شما این است که این `connection` با درایور `json` را به هستهی لاراول اضافه کنید.
```php
'json' => [
'driver' => 'json',
'ds' => base_path() . '/database/',
'database' => 'quera.json'
]
```
+ دقت کنید که نام `connection` حتماً باید `json` باشد.
پس از این که اتصال با دیتابیس را فراهم کردید، باید فقط کوئری `select` آن را بهگونهای پیادهسازی کنید تا اطلاعات جدول `users` را برگرداند. برای مثال، در کلاس `app/Http/Controllers/HomeController.php` دو دستور به صورت زیر نوشته شده است:
```php
public function index()
{
$users = User::all();
// $users = DB::table("users")->get();
return view('index', compact('users'));
}
```
این دستورات باید محتوای جدول `users` را برگردانند.
**توجه:** نام جدول ورودی مهم نیست و باید همیشه محتوای جدول `users` برگردانده شود.
# آنچه باید آپلود کنید
**توجه**: شما تنها مجاز به اعمال تغییرات در پوشهی `app` هستید.
پس از اعمال تغییرات، کل پروژه به غیر از پوشهی `vendor` را *Zip* کرده و آپلود کنید.
توجه کنید که نام فایل *Zip* اهمیتی ندارد.
ابوالفضل در حال کار بر روی پروژهی جدید خود است و در این پروژه باید دائماً حواسش به مسیرهایی *(routes)* که در پروژه استفاده میکند باشد. از سوی دیگر، نباید از مسیرهای پیشفرضی که لاراول در اختیارش قرار داده است استفاده کند. حال، او از شما کمک خواسته تا در این پروژه به او کمک کنید.
# جزئیات پروژه
*در این پروژه از Laravel 8 استفاده شده است.*
پروژهی اولیه را از [این لینک](/contest/assignments/21628/download_problem_initial_project/74654/) دانلود کنید.
<details class="grey">
<summary>ساختار فایلها</summary>
```
custom_route
├── app
│ ├── Console
│ │ └── Kernel.php
│ ├── Exceptions
│ │ └── Handler.php
│ ├── Http
│ │ ├── Controllers
│ │ │ └── Controller.php
│ │ ├── Middleware
│ │ │ ├── Authenticate.php
│ │ │ ├── EncryptCookies.php
│ │ │ ├── PreventRequestsDuringMaintenance.php
│ │ │ ├── RedirectIfAuthenticated.php
│ │ │ ├── TrimStrings.php
│ │ │ ├── TrustHosts.php
│ │ │ ├── TrustProxies.php
│ │ │ └── VerifyCsrfToken.php
│ │ └── Kernel.php
│ ├── Models
│ │ └── User.php
│ └── Providers
│ ├── AppServiceProvider.php
│ ├── AuthServiceProvider.php
│ ├── BroadcastServiceProvider.php
│ ├── EventServiceProvider.php
│ └── RouteServiceProvider.php
├── bootstrap
│ ├── cache
│ │ ├── packages.php
│ │ └── services.php
│ └── app.php
├── config
│ ├── app.php
│ ├── auth.php
│ ├── broadcasting.php
│ ├── cache.php
│ ├── cors.php
│ ├── database.php
│ ├── filesystems.php
│ ├── hashing.php
│ ├── logging.php
│ ├── mail.php
│ ├── queue.php
│ ├── services.php
│ ├── session.php
│ └── view.php
├── database
│ ├── factories
│ │ └── UserFactory.php
│ ├── migrations
│ │ ├── 2014_10_12_000000_create_users_table.php
│ │ ├── 2014_10_12_100000_create_password_resets_table.php
│ │ └── 2019_08_19_000000_create_failed_jobs_table.php
│ └── seeders
│ └── DatabaseSeeder.php
├── public
│ ├── favicon.ico
│ ├── index.php
│ ├── robots.txt
│ └── web.config
├── resources
│ ├── css
│ │ └── app.css
│ ├── js
│ │ ├── app.js
│ │ └── bootstrap.js
│ ├── lang
│ │ └── en
│ │ ├── auth.php
│ │ ├── pagination.php
│ │ ├── passwords.php
│ │ └── validation.php
│ └── views
│ └── welcome.blade.php
├── routes
│ ├── api.php
│ ├── channels.php
│ ├── console.php
│ └── web.php
├── storage
│ ├── app
│ │ └── public
│ ├── framework
│ │ ├── cache
│ │ │ └── data
│ │ ├── sessions
│ │ ├── testing
│ │ └── views
│ └── logs
├── tests
│ ├── Feature
│ │ └── ExampleTest.php
│ ├── Unit
│ │ └── ExampleTest.php
│ ├── CreatesApplication.php
│ └── TestCase.php
├── README.md
├── artisan
├── composer.json
├── composer.lock
├── package.json
├── phpunit.xml
├── server.php
└── webpack.mix.js
```
</details>
<details class="brown">
<summary>راهاندازی پروژه</summary>
**برای اجرای پروژه، باید `php` و `composer` را از قبل نصب کرده باشید.**
+ ابتدا پروژهی اولیه را دانلود و از حالت فشرده خارج کنید.
+ دستور `composer install` را در پوشهی اصلی پروژه برای نصب نیازمندیها اجرا کنید.
</details>
پس از دریافت پروژهی اولیه، شما باید هستهی لاراول را طوری تغییر دهید تا هر زمان *resource controller* ای با استفاده از دستور `make:controller` ساخته شد، علاوه بر دارا بودن *route* های پیشفرض خود لاراول، دارای *route* ای به آدرس `/details` باشد و همچنین به *route* پیشفرض `create` آن `/new` اضافه شود. دقت کنید که آدرس `/details` پس از فراخوانی باید متد `details` از همین کلاس را برگرداند.
برای فهم بهتر سؤال، به مثال زیر توجه کنید:
پس از اجرای دستور زیر در کنسول:
`php artisan make:controller TagController -r`
باید محتوای کلاس `TagController` شامل موارد زیر باشد:
```php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class TagController extends Controller
{
public function index()
{
//
}
public function create()
{
//
}
public function store(Request $request)
{
//
}
public function show($id)
{
//
}
public function edit($id)
{
//
}
public function update(Request $request, $id)
{
//
}
public function destroy($id)
{
//
}
public function details()
{
//
}
}
```
همچنین باید دارای *route* های زیر باشد:
```
+--------+-----------+-----------------+--------------+--------------------------------------------+------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+-----------+-----------------+--------------+--------------------------------------------+------------+
| | GET|HEAD | tags | tags.index | App\Http\Controllers\TagController@index | web |
| | POST | tags | tags.store | App\Http\Controllers\TagController@store | web |
| | GET|HEAD | tags/create/new | tags.create | App\Http\Controllers\TagController@create | web |
| | GET|HEAD | tags/details | tags.details | App\Http\Controllers\TagController@details | web |
| | GET|HEAD | tags/{tag} | tags.show | App\Http\Controllers\TagController@show | web |
| | PUT|PATCH | tags/{tag} | tags.update | App\Http\Controllers\TagController@update | web |
| | DELETE | tags/{tag} | tags.destroy | App\Http\Controllers\TagController@destroy | web |
| | GET|HEAD | tags/{tag}/edit | tags.edit | App\Http\Controllers\TagController@edit | web |
+--------+-----------+-----------------+--------------+--------------------------------------------+------------+
```
# نکات
+ توجه داشته باشید که این فرایند باید برای هر `resource controller` با هر نامی درست کار کند.
+ شما تنها مجاز به اعمال تغییرات در پوشههای `app` و در صورت لزوم `stubs` هستید.
# آنچه باید آپلود کنید
پس از اعمال تغییرات، کل پروژه به غیر از پوشهی `vendor` را *Zip* کرده و آپلود کنید.
توجه کنید که نام فایل *Zip* اهمیتی ندارد.