Artisan command package to handle your Domain Driven Design project that suitable with Laravel base structures, made for comer of Domain Driven Design and advanced.
Install Diamond Console with composer
composer require koalafacade/diamond-console
then after Diamond Console installed run command below to set up your project. The command below will generate namespace in composer and base directory structures.
php artisan diamond:install
Command for generate a Request file
Arguments
Name | Description |
---|---|
Name | Request class name |
Domain | Domain Name |
Options
Name | Description |
---|---|
--force | Force create the Request class |
Command for generate a Request file
Arguments
Name | Description |
---|---|
Name | Resource class name |
Domain | Domain Name |
Options
Name | Description |
---|---|
--model=ModelName | To hint Model class on Resource |
--force | Force create the Resource class |
Command for generate an Action inside your Domain directory.
Arguments
Name | Description |
---|---|
Name | Action class name |
Domain | Domain Name |
Options
Name | Description |
---|---|
--force | Force create the Action class |
Command for generate a Query Builder inside your Domain directory.
Arguments
Name | Description |
---|---|
Name | Builder class name |
Domain | Domain Name |
Options
Name | Description |
---|---|
--model=ModelName | To hint Model class on Query Builder |
--force | Force create the Builder class |
Usage
In your model you can use the builder like the example below.
src/Domain/Shared/User/Models/User.php
<?php
namespace Domain\Shared\User\Models;
use Domain\Shared\User\Models\Builders\UserBuilder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
/**
* @mixin UserBuilder
*/
class User extends Model
{
use HasFactory;
/**
* @param $query
*
* @return UserBuilder<User>
*/
public function newEloquentBuilder($query): UserBuilder
{
return new UserBuilder(query: $query);
}
}
Command for generate a Data Transfer Object with plain PHP to your domain directory.
Arguments
Name | Description |
---|---|
Name | Data Transfer Object class name |
Domain | Domain Name |
Options
Name | Description |
---|---|
--force | Force create the Data Transfer Object class |
Command for generate an Enum to your Domain directory.
Arguments
Name | Description |
---|---|
Name | Enum class name |
Domain | Domain Name |
Options
Name | Description |
---|---|
--force | Force create the Enum class |
Command for generate a Model inside Shared in Domain directory, all Model will store shared folder since another Domain probably consume the Model at the same time.
Arguments
Name | Description |
---|---|
Name | Model class name |
Domain | Domain Name |
Options
Name | Description |
---|---|
-m or --migration | Create Migration file when model created |
-f or --factory | Create Factory class when Model created this option will generate two files, Factory contract and Factory concrete |
--force | Force create the Model class |
Command for generate a Value Object class. this command will generate Value Object class into Domain.
Arguments
Name | Description |
---|---|
Name | Value Object name class |
Domain | Domain Name |
Options
Name | Description |
---|---|
--force | Force create the Value Object class |
Command for generate an Event class to your project.
Arguments
Name | Description |
---|---|
Name | Event name class |
Domain | Domain Name |
Options
Name | Description |
---|---|
--force | Force create the Event class |
Command for generate a Factory class, this command would generate two files :
- Factory concrete at Infrastructure/{DomainName}/Database/Factories
- Factory Contract at Domain/Shared/Contracts/Database/Factories
The bottom of reason why we did this, cause Factories is an Infrastructure component then Domain can't consume any stuff inside Infrastructure, so you can do Dependency Injection at Service Provider for resolve this one.
Arguments
Name | Description |
---|---|
Name | Factory Name |
Domain | Domain Name |
Options
Name | Description |
---|---|
--force | Force create the Factory class |
Command for generate a Listener class to your project.
Name | Description |
---|---|
Name | Listener name class |
Domain | Domain Name |
Options
Name | Description |
---|---|
--event=NameEvent | For create Event class and use it into Listener class |
--force | Force create the Listener class |
Command for generate a Mail class. this command will generate Mail class into Infrastructure side because this class purpose is store to external.
Arguments
Name | Description |
---|---|
Name | Mail name class |
Domain | Domain Name |
Options
Name | Description |
---|---|
--force | Force create the Mail class |
Command for generate an Observer class to your project.
Arguments
Name | Description |
---|---|
Name | Observer name class |
Domain | Domain Name |
Options
Name | Description |
---|---|
--force | Force create the Observer class |
Command for generate a Seeder class. this command will generate Seeder class into Infrastructure because this class purpose is to insert a test data into table.
Arguments
Name | Description |
---|---|
Name | Seeder name class |
Domain | Domain Name |
Options
Name | Description |
---|---|
--force | Force create the Seeder class |
Command for generate a Service Provider class. this command will generate Service Provider class into Infrastructure to binds between Domain and Infrastructure.
Arguments
Name | Description |
---|---|
Name | Service Provider name class |
Domain | Domain Name |
Options
Name | Description |
---|---|
--force | Force create the Service Provider class |
Diamond console purpose for generate files in Laravel default structures.
Command for generate a Migration file
Arguments
Name | Description |
---|---|
Name | Table Name |
Options
Name | Description |
---|---|
--table=tableName | To generate a Migration with purpose edit table |
--create=tableName | To generate a Migration with purpose to create a table |
Thanks for consideration to contribute to Diamond Console of Domain Driven Design you can go through to Contribute Area