ابوالفضل در حال کار بر روی پروژهی جدید خود است و در این پروژه باید دائماً حواسش به مسیرهایی *(routes)* که در پروژه استفاده میکند باشد. از سوی دیگر، نباید از مسیرهای پیشفرضی که لاراول در اختیارش قرار داده است استفاده کند. حال، او از شما کمک خواسته تا در این پروژه به او کمک کنید.
# جزئیات پروژه
*در این پروژه از Laravel 8 استفاده شده است.*
پروژهی اولیه را از [این لینک](/problemset/assignments/4367/download_problem_initial_project/76795/) دانلود کنید.
<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* اهمیتی ندارد.