DevGang
Авторизоваться

Как организовать свой проект Laravel 11 в 2024 году

Структура каталогов Laravel по умолчанию работает только тогда, когда ваш проект действительно небольшой.

По мере роста проекта структура каталогов по умолчанию становится проблемой, поскольку она не масштабируется должным образом.

После нескольких вариантов использования, моделей, политик и т.д. у вас получится что-то вроде этого:

app/
├── Actions
│   ├── Actionable.php
│   ├── Graph
│   │   └── ...
│   ├── MonthlyResume
│   │   └── GenerateMonthlyResumeAssets.php
│   ├── User
│   │   └── UpdateUser.php
│   └── VoidActionable.php
├── Console
│   ├── Commands
│   │   ├── CalculateUserCryptoPortfolioBalanceCommand.php
│   │   ├── CategorizeTransactionsIaCommand.php
│   │   ├── GenerateMonthlyReportAssetsCommand.php
│   │   ├── IdeHelperAllCommand.php
│   │   ├── PruneNotificationsCommand.php
│   │   ├── SendMonthlyReportNotificationCommand.php
│   │   ├── SendNewUpdateChangeLogNotificationCommand.php
│   │   └── TrainCategorizationIaCommand.php
│   └── Kernel.php
├── Contracts
│   └── Pipe.php
├── Events
│   ├── SharingConfigurationSaved.php
│   ├── SupportMessageCreated.php
│   └── VisitIncreased.php
├── Exceptions
│   ├── GetBankAccountTransactionError.php
│   ├── Handler.php
│   └── RenderableApiError.php
├── Http
│   ├── Controllers
│   │   ├── Banks
│   │   ├── Controller.php
│   │   ├── CryptoCurrency
│   │   ├── Notification
│   │   ├── SupportMessage
│   │   └── User
│   │       ├── DeleteUserController.php
│   │       ├── GetUserController.php
│   │       └── PutUserController.php
│   ├── Kernel.php
│   ├── Middleware
│   │   ├── Authenticate.php
│   │   ├── DefaultLocale.php
│   │   ├── TrustProxies.php
│   │   ├── ValidateSignature.php
│   │   └── VerifyCsrfToken.php
│   ├── Requests
│   │   ├── PostSupportMessageRequest.php
│   │   └── PutUserRequest.php
│   └── Resources
├── Jobs
│   ├── CalculateUserCryptoPortfolioBalanceJob.php
│   ├── GenerateMonthlyResumeAssetsJob.php
│   ├── GetBankAccountDetails.php
│   └── GetCoinGeckoValuesJob.php
├── Listeners
│   ├── SendAdminNotificationOnSupportMessageCreated.php
│   ├── SendEmailToUserOnVisitIncremented.php
│   └── SendMailOnSupportMessageCreated.phpphp
├── Mail
│   ├── SupportMessage
│   └── Visits
├── Models
│   ├── Bank.php
│   ├── SharingConfiguration.php
│   ├── SupportMessage.php
│   ├── User.php
│   └── UserCryptoPortfolioBalance.php
├── Notifications
│   ├── Notifiable.php
│   ├── ThrottledNotification.php
│   ├── UncategorizedTransactionNotification.php
│   └── UpdateChangeLogNotification.php
├── Policies
│   └── CryptoCurrencyOrderPolicy.php
├── Providers
│   ├── AppServiceProvider.php
│   ├── EventServiceProvider.php
│   ├── HorizonServiceProvider.php
│   └── RouteServiceProvider.php
├── Services
│   └── CategorizationAi.php
└── Support
    ├── OrderType.php
    ├── SafeNumberFromStringParser.php
    ├── ShortNumberFormatter.php
    ├── StockAssets
    └── helpers.php

Как видите, действительно сложно понять, что там происходит. Например, вы работаете в контроллере пользователей, и у вас нет всех соответствующих классов рядом с ним.

Лучшая структура каталогов в нашем проекте Laravel

Главным ключом к правильному масштабированию вашего приложения является возможность быстро просмотреть весь связанный с текущим вариантом использования код.

Например, если вы работаете над сценарием использования регистрации пользователя, у вас под рукой должны быть модель пользователя, политики пользователя, запрос на регистрацию, зарегистрированное событие и многое другое.

src/
├── Leads
├── Teams
└── Users
    ├── Actions
    │   ├── CreateUser
    │   │   ├── CreateUser.php
    │   │   └── CreateUserAction.php
    │   ├── LoginUserAction.php
    │   ├── LogoutUserAction.php
    │   └── RefreshAuthenticationTokenAction.php
    ├── Authenticatable.php
    ├── Authentication.php
    ├── Events
    │   └── UserRegistered.php
    ├── Http
    │   ├── Controllers
    │   │   └── Api
    │   │       ├── PostAuthenticationLoginApiController.php
    │   │       ├── PostAuthenticationLogoutApiController.php
    │   │       ├── PostAuthenticationRefreshApiController.php
    │   │       └── PostAuthenticationRegisterApiController.php
    │   ├── Requests
    │   │   ├── PostAuthenticationLoginRequest.php
    │   │   └── PostUserRequest.php
    │   └── routes
    │       └── api.php
    ├── Infrastructure
    │   └── UserEventServiceProvider.php
    ├── InvalidCredentials.php
    ├── Listeners
    │   └── SendWelcomeEmailOnUserRegistered.php
    ├── Mail
    │   └── WelcomeMail.php
    └── User.php

Но знаете, вы задаетесь вопросом, как можно легко реализовать эту архитектуру в Laravel.

Как реализовать архитектуру доменного каталога на Laravel

Начальная точка — composer.json файл. Мы собираемся создать новую папку ./src для хранения всего нашего нового кода.

Добавив каталог в ключ psr-4 в файле composer.json, мы сможем легко автоматически импортировать все наши файлы.

    "autoload": {

        "psr-4": {
            "App\\": "app/",
            "DeveloperJoy\\": "src/",
            // ...
        },

        // ...

     }

С помощью этого вы можете поместить все свои модели, контроллеры, запросы, политики и многое другое в папку пользовательского домена src/User.

Не хватает только нескольких вещей: маршрутов и провайдеров, поэтому давайте рассмотрим их по одному.

Переместить маршруты в пользовательскую папку

Для маршрутов у нас есть несколько вариантов, самый простой и удобный — импортировать их в web.php или в api.php файл.

Обычно я пишу вспомогательный файл внутри папки маршрутов, который выглядит следующим образом:

function domain_web_routes(string $domain): void
{
    require __DIR__."/../src/{$domain}/Http/routes/web.php";
}

function domain_api_routes(string $domain): void
{
    require __DIR__."/../src/{$domain}/Http/routes/api.php";
}

И импортирую в свой файл composer.json, просто добавив его в массив файлов.

    "autoload": {

        // ...

        "files": [
            "routes/helpers.php"
        ]
    },

Они у меня по умолчанию в web.php или api.phpя просто импортирую каждую новую папку домена, когда у нее есть какой-либо маршрут.

Вот, например, мой web.php файл:

use Illuminate\Support\Facades\Route;

Route::inertia('/', 'Welcome');

domain_web_routes('Leads');

Внутри src/Leads/Http/routes у меня есть файл web.php со всеми моими маршрутами, связанными с лидами.

Переместить поставщиков услуг в папку пользовательского домена

С провайдерами на самом деле все довольно просто.

У нас есть файл bootstrap/app.php, в котором содержится массив всех наших поставщиков.

Вам просто нужно добавить в него новых поставщиков, и он будет обработан автоматически во время загрузки.

return Application::configure(basePath: dirname(__DIR__))

    ->withProviders([

        DeveloperJoy\Users\Infrastructure\UserEventServiceProvider::class,

    ])

    ->create();
#PHP #Laravel
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу