도메인이 포함된 대규모의 확장 가능한 Laravel 애플리케이션
이 게시물에서는 대규모 Laravel 애플리케이션에서 작업하는 경우 프로젝트를 구성하는 방법에 대해 이야기할 것입니다.
내 사이드 프로젝트monse에서 작업하는 동안 기본 Laravel 구조가 큰 프로젝트에서 작동하지 않는다는 것을 발견했습니다. 커밋할 때마다 욕망 모델과 관련된 모든 코드를 한 눈에 보는 것이 불가능하기 때문에 프로젝트가 점점 벅차오르는 것을 느꼈습니다.
🎉 By the way, monse is a simple and automated personal finances
for normal people.If you want to stop over-expending, retire early and happier,
take a look now.
내용의 테이블
How to implement this in Laravel
기본 폴더 구조의 문제
기본적으로 Laravel 애플리케이션 구조는 다음과 같습니다.
├── app
│ ├── Console
│ │ └── Commands
│ ├── Contracts
│ ├── Events
│ ├── Exceptions
│ │ └── Auth
│ ├── Http
│ │ ├── Controllers
│ │ ├── Middleware
│ │ ├── Requests
│ │ └── Resources
│ ├── Jobs
│ ├── Listeners
│ ├── Mail
│ │ ├── Auth
│ │ └── User
│ ├── Models
│ ├── Notifications
│ ├── Policies
│ └── Providers
├── database
│ ├── factories
│ ├── migrations
│ └── seeders
├── config
├── routes
└── resources
├── js
├── sass
└── views
├── mail
└── vendor
이 구조에는 아무런 문제가 없지만 큰 애플리케이션을 작업할 때 예를 들어 하나의 요청에 관련된 모든 모델, 컨트롤러 및 서비스를 한 눈에 확인하기는 어렵습니다.
a
Article
, a PostArticleController
및 GetArticleController
, ArticleCreated
등과 같은 일부 이벤트가 있는 ArticleUpdated
라는 모델이 있다고 상상해 보십시오.이미 생성된 Article이라는 폴더 안에 하위 폴더를 생성하여 응용 프로그램의 다른 부분을 분할할 수 있으며 다음과 같이 표시됩니다.
├── app
│ ├── Console
│ │ └── Commands
│ ├── Contracts
│ ├── Events
│ │ └── Article
│ │ ├── ArticleCreated.php
│ │ ├── ArticleUpdated.php
│ │ └── ArticleDeleted.php
│ ├── Exceptions
│ │ ├── Auth
│ │ └── Article
│ │ └── ArticleWithoutValidDate.php
│ ├── Http
│ │ ├── Controllers
│ │ │ └── Article
│ │ │ ├── PostArticleController.php
│ │ │ └── GetArticleController.php
│ │ ├── Middleware
│ │ ├── Requests
│ │ │ └── Article
│ │ │ ├── PostArticleRequest.php
│ │ │ └── GetArticleRequest.php
│ │ └── Resources
│ │ │ └── Article
│ │ │ └── ArticleResource.php
│ ├── Jobs
│ ├── Listeners
│ │ └── Article
│ │ ├── SendNotificationOnArticleCreated.php
│ │ └── UpdateDashboardStatsOnArticleDeleted.php
│ ├── Mail
│ │ ├── Auth
│ │ └── User
│ ├── Models
│ │ └── Article.php
│ ├── Notifications
│ │ └── Article
│ │ └── NewArticleNotification.php
│ ├── Policies
│ └── Providers
├── database
│ ├── factories
│ ├── migrations
│ └── seeders
├── config
├── routes
└── resources
├── js
├── sass
└── views
├── mail
└── vendor
보시다시피 폴더가 많이 늘어나고 있으며 여전히 모든 애플리케이션 사이에 모든 기사 코드 분산기가 있습니다.
도메인 모델인 기사와 관련된 모든 코드를 한눈에 보기는 어렵습니다.
그리고 이것은 시작에 불과합니다. 큰 애플리케이션에서 우리는 컨트롤러, 이벤트, 리스너 등이 포함된 10개 이상의 모델을 갖게 될 것입니다. 이것은 문제가 될 것입니다.
해결책
응용 프로그램의 한 모델과 관련된 모든 코드를 한 폴더에만 저장하기 위해 도메인 폴더 또는 제한된 컨텍스트를 만드는 아이디어입니다.
다음과 같은 폴더 구조를 달성하는 아이디어입니다.
src
├── BankAccount
│ ├── Actions
│ ├── Http
│ ├── Infrastructure
│ ├── Policies
│ └── BankAccount.php
├── BankConnection
│ ├── Actions
│ ├── Console
│ ├── Events
│ ├── Http
│ ├── Infrastructure
│ ├── Jobs
│ ├── Listeners
│ ├── Mail
│ ├── Notifications
│ ├── Policies
│ └── BankConnection.php
├── StockOrder
│ ├── Actions
│ ├── Http
│ ├── Infrastructure
│ ├── Listeners
│ ├── Policies
│ ├── Support
│ └── StockOrder.php
└── UserStockPortfolio
├── Actions
├── Console
├── Http
├── Infrastructure
├── Jobs
└── UserStockPortfolio.php
This is the current folder structure of my Laravel project, get.monse.app.
보시다시피 각 폴더 안에는 모델과 이와 관련된 다양한 클래스가 있습니다. 모든 작업, HTTP 컨트롤러, 작업, 수신기, 정책 등을 볼 수 있습니다.
이렇게 하면 예를 들어
StockOrders
작업을 할 때 관련된 모든 코드를 볼 수 있고 모든 응용 프로그램에 영향을 주지 않고 새 컨트롤러, 경로 등을 더 쉽게 추가할 수 있습니다.Laravel에서 이것을 구현하는 방법
이것을 Laravel에서 구현하는 것은 간단합니다.
먼저 새
src
폴더를 만들고 작성기 파일에 수동으로 추가해야 합니다. 네임스페이스를 Monse\\
로 정의합니다. 왜냐하면 이것이 제 프로젝트 이름이기 때문입니다. 하지만 다른 것을 사용할 수 있습니다. // ...
"psr-4": {
"App\\": "app/",
"Monse\\": "src/",
"Database\\Factories\\": "database/factories/",
"Database\\Seeders\\": "database/seeders/"
},
// ...
이제 이 폴더에 원하는 모든 것을 추가할 수 있으며 작곡가에 의해 자동으로 로드되지만 주의해야 할 몇 가지 사항이 있습니다.
우리는 각 모듈이 고유한 경로, 이벤트, 명령 등을 갖기를 원합니다. 이렇게 하려면 다른 서비스 공급자를 생성하여
config/app.php
파일에 추가해야 합니다.1. 노선
경로의 경우
Illuminate\Foundation\Support\Providers\RouteServiceProvider
에서 확장되는 새 서비스 공급자를 만들 것입니다. 이 파일에서 다음과 같이 부팅 방법을 구현하면 됩니다. // ...
public function boot(): void
{
$this->routes(function () {
Route::middleware(['api', 'auth:api'])->prefix('api')->group(function () {
Route::get('user', GetUserController::class);
// ...
});
});
}
// ...
2. 이벤트
이벤트의 경우
Illuminate\Foundation\Support\Providers\EventServiceProvider
에서 확장하고 $listen
배열을 정의할 수 있습니다. 이 같은: protected $listen = [
UserCreated::class => [
SendWelcomeMailOnUserCreated::class,
// ...
],
];
3. 명령어
명령의 경우 일반 서비스 공급자를 만들고
register
메서드를 사용하여 등록합니다. // ...
private array $commands = [
CreateUserCommand::class,
];
public function register(): void
{
$this->commands($this->commands);
}
// ...
4. 공장
이것들은 약간 까다롭지만 쉽습니다.
예를 들어 공장 UserFactory를
factories/Monse/User
폴더 안에 넣어야 합니다(첫 번째 단계에서 폴더의 네임스페이스를 Monse로 정의했기 때문입니다).또한 공장 내부에서 해당 공장을 소유하고 있는 모델을 정의해야 합니다.
public function modelName(): string
{
return User::class;
}
다른 모든 것은 특별히 수행할 작업 없이 예상대로 작동합니다.
어떻게 생각해? 이 프로젝트 구조가 마음에 드십니까?
Reference
이 문제에 관하여(도메인이 포함된 대규모의 확장 가능한 Laravel 애플리케이션), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/victoor/large-and-scalable-laravel-application-with-domains-man텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)