sfynx-project / tool-generator-bundle
Generate DDD bundle and generator
Installs: 300
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 5
Forks: 5
Open Issues: 0
Type:symfony-bundle
pkg:composer/sfynx-project/tool-generator-bundle
Requires
- php: >=5.3.2
- phake/phake: *
- phpunit/phpunit: *
- symfony/console: *
- symfony/framework-bundle: >=2.1
- twig/twig: *
This package is not auto-updated.
Last update: 2016-10-10 09:40:46 UTC
README
This bundle permits to generate a DDD code.
How install generator
Create a symfony project with composer
composer create-project symfony/framework-standard-edition Demo "2.8.*" cd Demo
Replacer your composer.json
{
"name": "symfony/framework-standard-edition",
"license": "MIT",
"type": "project",
"description": "The \"Symfony Standard Edition\" distribution",
"autoload": {
"psr-4": { "": "src/" },
"classmap": [ "app/AppKernel.php", "app/AppCache.php" ]
},
"require": {
"php": ">=5.3.9",
"symfony/symfony": "2.8.*",
"doctrine/orm":"dev-master",
"doctrine/doctrine-bundle": "~1.4",
"symfony/swiftmailer-bundle": "~2.3",
"symfony/monolog-bundle": "~2.4",
"sensio/distribution-bundle": "~5.0",
"sensio/framework-extra-bundle": "^3.0.2",
"incenteev/composer-parameter-handler": "~2.0",
"sfynx-project/tool-ddd-bundle": "dev-2.8-dev",
"doctrine/mongodb-odm-bundle":"@dev",
"doctrine/couchdb": "@dev",
"doctrine/couchdb-odm": "@dev",
"stof/doctrine-extensions-bundle":"@dev",
"sfynx-project/tool-generator-bundle": "dev2.8-dev",
"stof/doctrine-extensions-bundle":"@dev"
},
"require-dev": {
"sensio/generator-bundle": "~3.0",
"symfony/phpunit-bridge": "~2.7"
},
"scripts": {
"post-install-cmd": [
"Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile",
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::prepareDeploymentTarget"
],
"post-update-cmd": [
"Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile",
"Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::prepareDeploymentTarget"
]
},
"config": {
"bin-dir": "bin",
"platform": {
"php": "5.3.9"
}
},
"extra": {
"symfony-app-dir": "app",
"symfony-web-dir": "web",
"symfony-assets-install": "relative",
"incenteev-parameters": {
"file": "app/config/parameters.yml"
},
"branch-alias": {
"dev-master": "2.8-dev"
}
}
}
Install vendors
rm composer.lock composer install --ignore-platform-reqs
Add the generator in your AppKernel.php
new Sfynx\DddGeneratorBundle\SfynxDddGeneratorBundle(), new \Sfynx\DddBundle\SfynxDddBundle(), new \JMS\SerializerBundle\JMSSerializerBundle(), new \Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle(),
Create a swagger file (or use a swagger file in generator folder for test)
Somes swagger files are present in the root of generator bundle
read write
If you have a chmod, chown or write error retry under root user
Generation step
Generate the country API
SYMFONY_SFYNX_PATH_TO_SWAGGER_FILE=vendor/sfynx-project/tool-generator- bundle/swagger_country.yml export SYMFONY_SFYNX_PATH_TO_SWAGGER_FILE SYMFONY_SFYNX_CONTEXT_NAME=DemoCountry export SYMFONY_SFYNX_CONTEXT_NAME php app/console sfynx:generate:ddd:api --create-all
Generate the actor API with values objects
SYMFONY_SFYNX_PATH_TO_SWAGGER_FILE=vendor/sfynx-project/tool-generator- bundle/swagger_actor.yml export SYMFONY_SFYNX_PATH_TO_SWAGGER_FILE SYMFONY_SFYNX_CONTEXT_NAME=DemoActor export SYMFONY_SFYNX_CONTEXT_NAME php app/console sfynx:generate:ddd:api --create-all
Generate the movie API
SYMFONY_SFYNX_PATH_TO_SWAGGER_FILE=vendor/sfynx-project/tool-generator- bundle/swagger_movie.yml export SYMFONY_SFYNX_PATH_TO_SWAGGER_FILE SYMFONY_SFYNX_CONTEXT_NAME=DemoMovie export SYMFONY_SFYNX_CONTEXT_NAME php app/console sfynx:generate:ddd:api --create-all
Generate your own API
SYMFONY_SFYNX_PATH_TO_SWAGGER_FILE=<PATH_TO_YOUR_SWAGGER_FILE> export SYMFONY_SFYNX_PATH_TO_SWAGGER_FILE SYMFONY_SFYNX_CONTEXT_NAME=<CONTEXT_NALE> export SYMFONY_SFYNX_CONTEXT_NAME php app/console sfynx:generate:ddd:api --create-all
Configfuration of Symfony after generation
Add the new generated bundle in AppKernel.php
new \<CONTEXTNAME>\InfrastructureBundle\<CONTEXTNAME>InfrastructureBundle(), new \<CONTEXTNAME>\PresentationBundle\<CONTEXTNAME>PresentationBundle(),
important: replace <CONTEXTNAME> by the context name you enter in the generation step
Add a link to routes of your generated context
project_<CONTEXTNAME>_<ENTITY>_routing:
resource: "@<CONTEXTNAME>PresentationBundle/Resources/config/routes/routing_<ENTITYNAME>.yml"
prefix: /api
You need to add this section for each entities present in your x-entities of your swagger file.
important: replace <CONTEXTNAME> by the context name you enter in the generation step
Indicate the database.driver variable in app/config/parameters.yml
database.driver: orm
Configure Symfony config.yml (app/config/config.yml)
Add this statement under the doctrine section. Don't forget to replace <CONTEXTNAME> by the context you specified in the generation step.
orm:
auto_generate_proxy_classes: %kernel.debug%
auto_mapping: true
mappings:
StofDoctrineExtensionsBundle: ~
<CONTEXTNAME>:
type: annotation
alias: <CONTEXTNAME>
prefix: <CONTEXTNAME>\Domain\Entity
dir: "%kernel.root_dir%/../src/<CONTEXTNAME>/Domain/Entity"
<CONTEXTNAME>VO:
type: annotation
alias: <CONTEXTNAME>VO
prefix: <CONTEXTNAME>\Domain\ValueObject
dir: "%kernel.root_dir%/../src/<CONTEXTNAME>/Domain/ValueObject"
SfynxDddBundle:
type: annotation
alias: VO
prefix: Sfynx\DddBundle\Layer\Domain\ValueObject
dir: "%kernel.root_dir%/../vendor/sfynx-project/tool-ddd-bundle/Sfynx/DddBundle/Layer/Domain/ValueObject"
translatable:
type: annotation
alias: Gedmo
prefix: Gedmo\Translatable\Entity
dir: "%kernel.root_dir%/../vendor/gedmo/doctrine-extensions/lib/Gedmo/Translatable/Entity"
loggable:
type: annotation
alias: Gedmo
prefix: Gedmo\Loggable\Entity
dir: "%kernel.root_dir%/../vendor/gedmo/doctrine-extensions/lib/Gedmo/Loggable/Entity"
tree:
type: annotation
alias: Gedmo
prefix: Gedmo\Tree\Entity
dir: "%kernel.root_dir%/../vendor/gedmo/doctrine-extensions/lib/Gedmo/Tree/Entity"
metadata_cache_driver: array # array|apc|memcache#ETC
query_cache_driver: array # array|apc|memcache#ETC
result_cache_driver: array # array|apc|memcache#ETC
Add this section in the root on config file (no under a section). ~
important: replace <CONTEXTNAME> by the context name you enter in the generation step
DemoCountry_infrastructure:
database_type: orm
Syntax of swagger file :
Define route, controller and action
Entities and values objects
To edit swagger file you can use Swagger editor. You can download a Docker image here : https://hub.docker.com/r/mydock/swagger-editor/
You need to declare requests and responses with original swagger syntax and extends swagger file with this data :
x-valueObjects:
IdVO: <--- Name of value object
name: id <--- Name of field
type: Sfynx\DddBundle\Layer\Domain\ValueObject\IdVO <--- Namespace of value object ( <CONTEXTNAME>\Domain\ValueObject\<VONAME> )
x-fields: <--- Declaration of fields of value object
id: <--- Name of field
name: id <--- Name of field
type: IdVO <--- type of field (string,number,valueObject name ...)
ProfileVO:
name: ProfileVO
type: \DemoActor\Domain\ValueObject\ProfileVO
x-fields:
lastname:
name: lastname
type: string
firstname:
name: firstname
type: string
SituationVO:
name: SituationVO
type: \DemoActor\Domain\ValueObject\SituationVO
x-fields:
sexVO:
name: SexVO
type: SexVO
birthday:
name: birthday
type: string
ContactVO:
name: ContactVO
type: \DemoActor\Domain\ValueObject\ContactVO
x-fields:
phoneNumber1:
name: phoneNumber1
type: string
phoneNumber2:
name: phoneNumber2
type: string
email:
name: email
type: string
SalaryVO:
name: SalaryVO
type: \DemoActor\Domain\ValueObject\SalaryVO
x-fields:
value:
name: value
type: integer
currency:
name: currency
type: string
SexVO:
name: SexVO
type: \DemoActor\Domain\ValueObject\SexVO
x-fields:
gender:
name: gender
type: string
x-entities: <--- Permits to declare entities
Actor: <--- Entity Name
name: Actor <--- Entity Name
type: entity <--- Entity Type
x-fields: <--- Entity fields
entityId: <--- Field name
name: entityId <--- Field name
type: id <--- Field type
voName: IdVO <--- Field VO name (if field is value object)
simplefield:
name: simplefield
type: string
valueObjectField:
name: valueObjectField
type: valueObject
voName: valueObjectFieldVO
important: replace <CONTEXTNAME> by the context name you enter in the generation step
Do a search on table
To effectuate a search you can use the searchBy query. For that create a route in your swagger file
/v{_version}/country/searchBy:
post:
operationId: searchBy
x-controller: Country
x-entity: Country
description: |
Get `country` object with id *countryId*
parameters:
- name: criteria
in: body
required: true
description: criteria object
schema:
title: country
type: object
properties:
id:
type: integer
id_parent:
type: integer
code:
type: string
type:
type: string
libelle:
type: string
reference:
type: string
responses:
# 200 Response code
200:
description: Successful response
# A schema describing your response object.
# Use JSON Schema format
schema:
title: Entity
type: object
properties:
id:
type: integer
id_parent:
type: integer
code:
type: string
type:
type: string
libelle:
type: string
reference:
type: string
# 403 Response code
403 :
description: Access forbidden
500:
description: An error occurs
To effectuate a searchrequest create a POSTrequest on /v1/country/searchBy with this data in body :
Simple :
{
"criterias":
{
"field": "a.indicatif",
"operator": "=",
"value": "1150"
}
}
Complex :
{
"criterias": {
"and": [{
"or": [{
"field": "a.indicatif",
"operator": "=",
"value": "'1150'"
}, {
"field": "a.indicatif",
"operator": "=",
"value": "'2000'"
}]
}, {
"field": "a.iso",
"operator": "=",
"value": "'fr'"
}]
}
}
Important : you need to prefix your field name by a.
Generated code structure
Unit tests
It exists two kind of unit tests with the generator.
Generation tests :
To run generation tests edit vendor/sfynx-project/tool-generator-bundle/phpunit.xml and change contextName and swaggerFile variable then run phpunit -c phpunit.xml in the vendor/sfynx-project/tool-generator-bundle/ dir. This set of tests will check all files has been generated and has the good classes and namespace.
Functional tests
This tests has not been complemently implemented at this time.