bornfight / maboo-maker-bundle
Boilerplate code generator for projects with layered architecture. Inspired by Maboo
Installs: 2 652
Dependents: 0
Suggesters: 0
Security: 0
Stars: 3
Watchers: 6
Forks: 0
Open Issues: 0
Type:symfony-bundle
Requires
- php: 8.*
Requires (Dev)
- symfony/maker-bundle: ^1.36
README
Boilerplate code generator for projects with layered architecture
Installation
To install this package, use Composer:
composer require bornfight/maboo-maker-bundle --dev
If you are using Symfony Flex, this will install and enable the Maboo Maker bundle automatically.
If not, you should add this manually to your config/bundles.php
file:
return [ // ... Bornfight\MabooMakerBundle\BornfightMabooMakerBundle::class => ['dev' => true, 'test' => true], ];
Usage
There are multiple commands available which can work independently, but whenever possible, you can make your life easier just by running:
bin/console make:maboo-scaffold
List of currently supported sub-commands:
make:maboo-module # Creates a bounded context (module) folder (if it does not exist yet) make:maboo-entity # Creates or updates a Doctrine entity class make:maboo-domain-model # Creates or updates a domain model class make:maboo-write-models # Creates or updates write models for a model class make:maboo-entity-mapper # Creates or updates mapper for a model class make:maboo-repository # Creates or updates a repository interface and concrete implementation make:maboo-validator # Creates or updates a validator and specification make:maboo-manager # Creates or updates a resource manager make:maboo-resolver # Creates or updates a resolver make:maboo-mutation # Creates or updates a mutation class make:maboo-fixtures # Creates or updates a fixtures class with some dummy data make:maboo-gql-schema # Creates or updates GraphQL types and schema
make:maboo-scaffold
will start the interactive wizard and ask you which of the components you need and then internally execute all selected commands one by one.
Happy path
Generating a new entity with scalar types for fields
- Run
bin/console make:maboo-scaffold
- Follow the interactive wizard:
- Select all available options (this is the default so just press ↵ Return to confirm)
- Select an existing module or create a new one. Existing folders within project source directory (
src/
) are suggested, so you can use ⇥ Tab for autocompletion.
Example:Booking
- Type entity name (for now, existing entities are also suggested when you start typing, but updating is currently not supported).
Example:Hotel
This creates a class insrc/Shared/Infrastructure/Persistence/Doctrine/Entity
- All classes will have this entity name suggested, but you can overwrite any of those. If you would like to keep the defaults, just confirm it by pressing ↵ Return:
- Domain model name:
Hotel
This creates a class insrc/Booking/Domain/Model
- Entity mapper name:
HotelMapper
This creates a class insrc/Shared/Infrastructure/Persistence/Doctrine/Mapper
- Write model names:
CreateHotel
andUpdateHotel
This creates classes insrc/Booking/Domain/WriteModel
- Repository interface and class names:
HotelRepository
andDoctrineHotelRepository
This creates an interface insrc/Booking/Domain/Repository
and a class insrc/Booking/Infrastructure/Persistence/Repository
- Basic specification interface and class names:
IsExistingHotelSpecification
andDoctrineIsExistingHotelSpecification
This creates an interface insrc/Booking/Application/Specification
and a class insrc/Booking/Infrastructure/Specification
- Validator name:
HotelValidator
This creates a class insrc/Booking/Application/Validator
- Manager name:
HotelManager
This creates a class insrc/Booking/Application/Manager
- Resolver name:
HotelResolver
This creates a resolver class insrc/Booking/Infrastructure/GraphQL/Resolver
- Mutation name:
HotelMutation
This creates a mutation class insrc/Booking/Infrastructure/GraphQL/Mutation
- Fixtures name:
HotelFixures
This creates a fixtures class insrc/Booking/Infrastructure/Persistence/DataFixtures
- Domain model name:
- Add fields:
Example:name
(string, 255, non-nullable),isOpen
(boolean, non-nullable),address
(string, 255, non-nullable),longitude
(float, nullable),latitude
(float, nullable) - Press ↵ Return one more time.
- Generate and apply migrations (these are Doctrine commands and have nothing to do with the generator):
bin/console make:migration
bin/console doctrine:migration:migrate
- Add some meaningful data to the fixtures or just load dummy data pregenerated based on field types:
bin/console doctrine:fixtures:load
- Generate GraphQL schema:
- Run
bin/console make:maboo-gql-schema
- Select the module (
Booking
) and the entity you've just generated (Hotel
)
This updates existingQuery.types.yaml
andMutation.types.yaml
files in directory/config/graphql/types
.
This also creates GraphQL input, payload and type schema files insrc/Booking/Infrastructure/Resources/config/graphql/types
- Run
- 🚀 All done!
Now try running a query in your favourite GraphQL GUI:
query { hotels { id name isOpen address longitude latitude } }
You should get something like:
{ "data": { "hotels": [ { "id": "a89b8a17-3b15-4a23-9ad0-67229f13fc18", "name": "example", "isOpen": true, "address": "example", "longitude": 20.5, "latitude": 20.5 } ] } }
It works!
Try running a mutation (by default, you must have admin rights):
mutation { createHotel(input: { name: "Westin" isOpen: false address: "Izidora Kršnjavoga 1, 10000 Zagreb" longitude: 45.80689045084249 latitude: 15.9662605177903 }) { hotel { id } } }
The response should contain the ID of the newly created hotel:
{ "data": { "createHotel": { "hotel": { "id": "061a7975-4334-4d00-9a00-4243ac4a9726" } } } }
Motivation
This bundle should make creating a bunch of files with a bunch of boilerplate code a cinch.
Copy-pasting existing entities and models and then renaming just some fields can be cumbersome and error-prone task. It is also time-consuming task and makes you feel like a code monkey.
We use some strict rules and instead of looking for analogies in existing classes and lots of manual work, this generator does that for you.
The very implementation was heavily influenced by Symfony's Maker Bundle. Some parts of the code in it are literally a copy-paste because mentioned bundle has classes declared as final
which makes it impossible to extend them and overwrite just some parts of the logic.