اخیراً ایدهای به ذهن هوشنگ خطور کرده است که قصد دارد آن را پیادهسازی کند. ایده از این قرار است که او ابتدا فریمورک کوچکی را پیادهسازی کند و سپس یک سیستم لاگ را برای آن پیادهسازی کند. او این سیستم را *لاگچری* نامیده است.
او قسمتهایی از این پروژه را انجام داده، اما در پیادهسازی بعضی از قسمتها به مشکل خورده است. شما باید برای قسمتهایی از پروژه که او به مشکل خورده است به او کمک کنید.
# جزئیات پروژه
پروژهی اولیه را از [این لینک](/problemset/assignments/4367/download_problem_initial_project/121727/) دانلود کنید.
<details class="grey">
<summary>ساختار فایلها</summary>
```
logtury
├── app
│ └── Controllers
│ └── HomeController.php
├── core
│ ├── Logger.php
│ ├── Router.php
│ ├── View.php
│ └── routes.php
├── public
│ ├── assets
│ │ └── plugins
│ │ └── tailwind
│ │ └── tailwind.min.css
│ └── index.php
├── resources
│ └── views
│ ├── about.php
│ ├── contact.php
│ └── index.php
├── storage
│ └── logs
├── test
│ └── LogturySampleTest.php
├── composer.json
└── composer.lock
```
</details>
<details class="brown">
<summary>راهاندازی پروژه</summary>
**برای اجرای پروژه، باید `php` و `composer` را از قبل نصب کرده باشید.**
+ پروژهی اولیه را دانلود و از حالت فشرده خارج کنید.
+ دستور `composer install` را در پوشهی اصلی پروژه برای نصب نیازمندیها اجرا کنید.
+ دستور `php -S 127.0.0.1:8000 -t public` را در پوشهی اصلی پروژه اجرا کنید. پروژه از طریق آدرس http://127.0.0.1:8000 در دسترس خواهد بود.
</details>
در اولین گام باید **کدهای این پروژه را مطالعه کرده و با منطق پروژه آشنا شوید**. در ادامه، باید تغییراتی که در ادامه ذکر شده است را در پروژه اعمال کنید.
ابتدا باید کلاس `Core\Logger` را پیادهسازی کنید، اگر به این کلاس مراجعه کنید خواهید دید که دارای کانستراکتور و دو متد `writeLog` و `getLog` است، پیادهسازی هرکدام باید بهصورت زیر باشد:
+ کانستراکتور مسیر فایلی که قرار است لاگها در آن نوشته شوند را دریافت میکند.
+ از متد `writeLog` برای نوشتن متنی برروی فایل لاگ استفاده میشود.
+ از متد `getLog` برای دریافت محتوای فایل لاگ استفاده میشود.
سپس باید روتهای زیر را به پروژه اضافه کنید:
+ روت `/` که باید متد `index` از کلاس `HomeController` را فراخوانی کند.
+ روت `/about-us` که باید متد `about` از کلاس `HomeController` را فراخوانی کند.
+ روت `/contact-us` که باید متد `contact` از کلاس `HomeController` را فراخوانی کند.
در انتها باید این متدها را در کنترلر `HomeController` پیادهسازی کنید به نحوی که اگر هر روت فراخوانی شد، ابتدا در فایل `storage/logs/app.log` و در یک خط عبارتی با قالب زیر درج شود:
```
[CURRENT_DATE_TIME] - [NAME] Page Visited
```
در قالب بالا `CURRENT_DATE_TIME` بهمعنی تاریخ و ساعت کنونی است که باید با فرمت `Y-m-d H:i:s` باشد و مقدار `NAME` هم باید برای روت `/` برابر با `Home`، برای روت `/about-us` برابر با `About` و برای روت `/contact-us` برابر با `Contact` باشد.
سپس ویوی مربوط به هر روت `render` و برگردانده شود (با استفاده از کلاس `View`):
+ برای روت `/` ویوی `resources/views/index`
+ برای روت `/about-us` ویوی `resources/views/about`
+ برای روت `/contact-us` ویوی `resources/views/contact`
## مثال
فرض کنید کاربری بهترتیب روتهای `/` سپس `/about-us` و در انتها `/contact-us` را میبیند. در نهایت، باید مقادیر زیر در فایل `storage/logs/app.log` ذخیره شده باشند (خروجی متد `getLog`):
```
2021-11-19 18:05:06 - Home Page Visited
2021-11-19 18:05:08 - About Page Visited
2021-11-19 18:05:09 - Contact Page Visited
```
با ارسال درخواست به آدرس `/`، کاربر باید با صفحهی زیر مواجه شود:
![صفحهی اصلی](https://quera.ir/qbox/view/MELdAEuhqj/logtury.png)
## نکات
+ این پروژه از استاندارد [*PSR-4*](https://www.php-fig.org/psr/psr-4/) برای *autoloading* کلاسها استفاده میکند.
+ شما تنها مجاز به اعمال تغییرات در پوشهی `app` و فایلهای `core/Logger.php` و `core/routes.php` هستید.
## آنچه باید آپلود کنید
پس از اعمال تغییرات، پوشههای `app` و `core` را زیپ کرده و آپلود کنید.