Джерело: https://laravelukraine.com/docs/13.x/structure

# Структура каталогів

- [Вступ](#introduction)
- [Кореневий каталог](#the-root-directory)
    - [Каталог `app`](#the-root-app-directory)
    - [Каталог `bootstrap`](#the-bootstrap-directory)
    - [Каталог `config`](#the-config-directory)
    - [Каталог `database`](#the-database-directory)
    - [Каталог `public`](#the-public-directory)
    - [Каталог `resources`](#the-resources-directory)
    - [Каталог `routes`](#the-routes-directory)
    - [Каталог `storage`](#the-storage-directory)
    - [Каталог `tests`](#the-tests-directory)
    - [Каталог `vendor`](#the-vendor-directory)
- [Каталог App](#the-app-directory)
    - [Каталог `Broadcasting`](#the-broadcasting-directory)
    - [Каталог `Console`](#the-console-directory)
    - [Каталог `Events`](#the-events-directory)
    - [Каталог `Exceptions`](#the-exceptions-directory)
    - [Каталог `Http`](#the-http-directory)
    - [Каталог `Jobs`](#the-jobs-directory)
    - [Каталог `Listeners`](#the-listeners-directory)
    - [Каталог `Mail`](#the-mail-directory)
    - [Каталог `Models`](#the-models-directory)
    - [Каталог `Notifications`](#the-notifications-directory)
    - [Каталог `Policies`](#the-policies-directory)
    - [Каталог `Providers`](#the-providers-directory)
    - [Каталог `Rules`](#the-rules-directory)

<a name="introduction"></a>
## Вступ

Типова структура застосунку Laravel має бути гарною відправною точкою як для великих, так і для малих застосунків. Але ви вільні організовувати свій застосунок так, як вам зручно. Laravel майже не накладає обмежень на те, де розташований той чи інший клас, - аби Composer міг його автозавантажити.

<a name="the-root-directory"></a>
## Кореневий каталог

<a name="the-root-app-directory"></a>
### Каталог App

Каталог `app` містить основний код вашого застосунку. Незабаром ми розглянемо його докладніше, але майже всі класи вашого застосунку будуть саме тут.

<a name="the-bootstrap-directory"></a>
### Каталог Bootstrap

Каталог `bootstrap` містить файл `app.php`, який завантажує фреймворк. Тут також є каталог `cache` із файлами, згенерованими фреймворком для оптимізації швидкодії, як-от файли кешу маршрутів і сервісів.

<a name="the-config-directory"></a>
### Каталог Config

Каталог `config`, як випливає з назви, містить усі конфігураційні файли вашого застосунку. Варто прочитати всі ці файли й ознайомитися з доступними вам опціями.

<a name="the-database-directory"></a>
### Каталог Database

Каталог `database` містить міграції бази даних, фабрики моделей і наповнювачі. За бажанням ви можете зберігати тут і базу даних SQLite.

<a name="the-public-directory"></a>
### Каталог Public

Каталог `public` містить файл `index.php` - точку входу для всіх запитів, що надходять до вашого застосунку, - і налаштовує автозавантаження. Тут також лежать ваші ресурси: зображення, JavaScript і CSS.

<a name="the-resources-directory"></a>
### Каталог Resources

Каталог `resources` містить ваші [представлення](/docs/{{version}}/views), а також вихідні, нескомпільовані ресурси на кшталт CSS чи JavaScript.

<a name="the-routes-directory"></a>
### Каталог Routes

Каталог `routes` містить усі визначення маршрутів вашого застосунку. За замовчуванням Laravel постачається з двома файлами маршрутів: `web.php` і `console.php`.

Файл `web.php` містить маршрути, які Laravel поміщає у групу `middleware` під назвою `web`, що забезпечує стан сесії, захист від CSRF і шифрування cookie. Якщо ваш застосунок не надає безстанового RESTful API, то, найімовірніше, усі ваші маршрути будуть визначені саме у файлі `web.php`.

У файлі `console.php` ви можете визначати консольні команди на основі замикань. Кожне замикання прив'язується до екземпляра команди, що дає простий підхід до роботи з методами введення-виведення кожної команди. Хоча цей файл не визначає HTTP-маршрутів, він визначає консольні точки входу (маршрути) до вашого застосунку. У файлі `console.php` ви також можете [планувати](/docs/{{version}}/scheduling) завдання.

За бажанням ви можете встановити додаткові файли маршрутів для API (`api.php`) і каналів бродкастингу (`channels.php`) за допомогою команд Artisan `install:api` та `install:broadcasting`.

Файл `api.php` містить маршрути, які мають бути безстановими, тож запити, що надходять до застосунку через них, мають автентифікуватися [за допомогою токенів](/docs/{{version}}/sanctum) і не матимуть доступу до стану сесії.

У файлі `channels.php` ви можете зареєструвати всі канали [бродкастингу подій](/docs/{{version}}/broadcasting), які підтримує ваш застосунок.

<a name="the-storage-directory"></a>
### Каталог Storage

Каталог `storage` містить ваші логи, скомпільовані шаблони Blade, файлові сесії, файлові кеші та інші файли, згенеровані фреймворком. Він поділений на каталоги `app`, `framework` і `logs`. Каталог `app` можна використовувати для зберігання будь-яких файлів, згенерованих вашим застосунком. Каталог `framework` слугує для зберігання файлів і кешів, згенерованих фреймворком. Нарешті, каталог `logs` містить файли логів вашого застосунку.

Каталог `storage/app/public` можна використовувати для зберігання створених користувачами файлів, як-от аватари профілів, які мають бути загальнодоступними. Вам слід створити символічне посилання `public/storage`, що вказує на цей каталог. Створити його можна командою Artisan `php artisan storage:link`.

<a name="the-tests-directory"></a>
### Каталог Tests

Каталог `tests` містить ваші автоматизовані тести. Приклади модульних і функціональних тестів [Pest](https://pestphp.com) чи [PHPUnit](https://phpunit.de/) постачаються одразу. Кожен клас тесту має закінчуватися словом `Test`. Запускати тести можна командами `/vendor/bin/pest` або `/vendor/bin/phpunit`. Або ж, якщо вам потрібне докладніше й гарніше подання результатів, запускайте тести командою Artisan `php artisan test`.

<a name="the-vendor-directory"></a>
### Каталог Vendor

Каталог `vendor` містить ваші залежності [Composer](https://getcomposer.org).

<a name="the-app-directory"></a>
## Каталог App

Більша частина вашого застосунку розміщується в каталозі `app`. За замовчуванням цей каталог має простір імен `App` і автозавантажується Composer за [стандартом автозавантаження PSR-4](https://www.php-fig.org/psr/psr-4/).

За замовчуванням каталог `app` містить каталоги `Http`, `Models` і `Providers`. Однак із часом усередині нього з'являтимуться й інші каталоги, у міру того як ви використовуватимете команди Artisan `make` для генерації класів. Наприклад, каталог `app/Console` не існуватиме, доки ви не виконаєте команду Artisan `make:command` для створення класу команди.

Каталоги `Console` і `Http` докладніше описані у відповідних розділах нижче, але сприймайте їх як такі, що надають API до ядра вашого застосунку. Протокол HTTP і CLI - це механізми взаємодії з вашим застосунком, які самі по собі не містять логіки застосунку. Інакше кажучи, це два способи віддавати команди вашому застосунку. Каталог `Console` містить усі ваші команди Artisan, а каталог `Http` - ваші контролери, `middleware` та запити.

> [!NOTE]
> Багато класів у каталозі `app` можна згенерувати за допомогою команд Artisan. Щоб переглянути доступні команди, виконайте в терміналі `php artisan list make`.

<a name="the-broadcasting-directory"></a>
### Каталог Broadcasting

Каталог `Broadcasting` містить усі класи каналів бродкастингу вашого застосунку. Ці класи генеруються командою `make:channel`. За замовчуванням цього каталогу немає, але його буде створено, коли ви створите свій перший канал. Щоб дізнатися більше про канали, перегляньте документацію з [бродкастингу подій](/docs/{{version}}/broadcasting).

<a name="the-console-directory"></a>
### Каталог Console

Каталог `Console` містить усі власні команди Artisan вашого застосунку. Ці команди можна генерувати командою `make:command`.

<a name="the-events-directory"></a>
### Каталог Events

За замовчуванням цього каталогу немає, але його створять команди Artisan `event:generate` та `make:event`. Каталог `Events` містить [класи подій](/docs/{{version}}/events). Події можна використовувати, щоб сповіщати інші частини вашого застосунку про те, що сталася певна дія, - це дає значну гнучкість і послаблює зв'язність.

<a name="the-exceptions-directory"></a>
### Каталог Exceptions

Каталог `Exceptions` містить усі власні винятки вашого застосунку. Ці винятки можна генерувати командою `make:exception`.

<a name="the-http-directory"></a>
### Каталог Http

Каталог `Http` містить ваші контролери, `middleware` та запити форм. Майже вся логіка обробки запитів, що надходять до вашого застосунку, розміщується саме тут.

<a name="the-jobs-directory"></a>
### Каталог Jobs

За замовчуванням цього каталогу немає, але його буде створено, якщо ви виконаєте команду Artisan `make:job`. Каталог `Jobs` містить [завдання для черг](/docs/{{version}}/queues) вашого застосунку. Завдання можуть ставитися вашим застосунком у чергу або виконуватися синхронно в межах поточного життєвого циклу запиту. Завдання, що виконуються синхронно під час поточного запиту, іноді називають «командами», оскільки вони є реалізацією [шаблону «команда»](https://en.wikipedia.org/wiki/Command_pattern).

<a name="the-listeners-directory"></a>
### Каталог Listeners

За замовчуванням цього каталогу немає, але його буде створено, якщо ви виконаєте команди Artisan `event:generate` чи `make:listener`. Каталог `Listeners` містить класи, які обробляють ваші [події](/docs/{{version}}/events). Слухачі подій отримують екземпляр події й виконують логіку у відповідь на її спрацювання. Наприклад, подію `UserRegistered` може обробляти слухач `SendWelcomeEmail`.

<a name="the-mail-directory"></a>
### Каталог Mail

За замовчуванням цього каталогу немає, але його буде створено, якщо ви виконаєте команду Artisan `make:mail`. Каталог `Mail` містить усі ваші [класи, що представляють електронні листи](/docs/{{version}}/mail), які надсилає ваш застосунок. Об'єкти пошти дозволяють інкапсулювати всю логіку створення листа в одному простому класі, який можна надіслати методом `Mail::send`.

<a name="the-models-directory"></a>
### Каталог Models

Каталог `Models` містить усі ваші [класи моделей Eloquent](/docs/{{version}}/eloquent). Eloquent ORM, що постачається з Laravel, дає гарну й просту реалізацію ActiveRecord для роботи з базою даних. Кожній таблиці бази даних відповідає своя «модель», через яку ви взаємодієте з цією таблицею. Моделі дозволяють робити запити до даних у ваших таблицях, а також вставляти нові записи.

<a name="the-notifications-directory"></a>
### Каталог Notifications

За замовчуванням цього каталогу немає, але його буде створено, якщо ви виконаєте команду Artisan `make:notification`. Каталог `Notifications` містить усі «транзакційні» [сповіщення](/docs/{{version}}/notifications), які надсилає ваш застосунок, як-от прості повідомлення про події, що відбуваються всередині нього. Механізм сповіщень Laravel абстрагує надсилання сповіщень через різні драйвери: електронну пошту, Slack, SMS чи збереження в базі даних.

<a name="the-policies-directory"></a>
### Каталог Policies

За замовчуванням цього каталогу немає, але його буде створено, якщо ви виконаєте команду Artisan `make:policy`. Каталог `Policies` містить [класи політик авторизації](/docs/{{version}}/authorization) вашого застосунку. Політики визначають, чи може користувач виконати певну дію щодо ресурсу.

<a name="the-providers-directory"></a>
### Каталог Providers

Каталог `Providers` містить усі [сервіс-провайдери](/docs/{{version}}/providers) вашого застосунку. Сервіс-провайдери завантажують ваш застосунок, прив'язуючи сервіси в сервіс-контейнері, реєструючи події та виконуючи інші завдання, щоб підготувати застосунок до вхідних запитів.

У новому застосунку Laravel цей каталог уже міститиме `AppServiceProvider`. Ви вільні додавати сюди власні провайдери за потреби.

<a name="the-rules-directory"></a>
### Каталог Rules

За замовчуванням цього каталогу немає, але його буде створено, якщо ви виконаєте команду Artisan `make:rule`. Каталог `Rules` містить об'єкти власних правил валідації вашого застосунку. Правила слугують для інкапсуляції складної логіки валідації в простому об'єкті. Докладніше дивіться в [документації з валідації](/docs/{{version}}/validation).