Here is a symfony project that uses DDD and hexagonal architecture. The project queries an internal REST API
prestashop.marmitakoo.test:4010/feed/products. This internal endpoint is generated by stoplight/prism using the mock
file prism/marmitakoo.yaml.
The output of the internal API is a JSON that looks like this:
{
"products":[
{
"id":"44622e6e-4d68-46e0-85be-5b0e9c99e414",
"name":"Practical Metal Gloves",
"description":"Aspernatur laboriosam suscipit enim quia maxime provident veniam. Quod porro voluptatibus officiis c",
"link":"https://javon.net",
"image":[
{
"url":"http://lorempixel.com/640/480",
"alt":"Aliquid culpa rerum molestiae ut soluta voluptatem voluptatibus itaque."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Soluta esse velit laborum velit et."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Quae consequatur aliquam necessitatibus quis fugiat vero."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Dolores omnis veniam minima aliquam ea deleniti."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Suscipit qui culpa."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Rerum saepe eveniet quia in et iure vero."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Aliquid voluptatem rerum laborum et nisi dolor."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Provident maiores nihil velit voluptatibus nihil."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Tempore consequatur exercitationem reiciendis sunt enim unde."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Qui voluptas nulla perferendis provident consequuntur non tempore."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Distinctio quis et inventore fuga quasi sapiente dignissimos explicabo nulla."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Et consectetur consequatur et."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Voluptatum sunt dolor nam vitae."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Quas itaque iste sit architecto iste alias."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Placeat odit qui qui et."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Officia dolore esse voluptatem voluptatum quasi."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Ut quae aut enim neque veniam."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Repellendus eos unde autem ut."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Iusto distinctio quaerat amet aliquam voluptas magni."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Pariatur maxime eum."
}
],
"availability":{
"stock":69
},
"price":{
"regular":49.08989279160331,
"on_sale":70.05727532816405
},
"variations":[
{
"id":"a83f1d49-3892-4d7f-aa96-ac620e6908f7",
"color":"olive",
"material":"Fresh",
"updatedAt":"Tue Sep 08 2020 03:22:37 GMT+0000 (Coordinated Universal Time)"
},
{
"id":"75309ab4-6bcf-4ce7-af39-49ea6f24a5a9",
"color":"purple",
"material":"Wooden",
"updatedAt":"Mon Sep 07 2020 21:27:51 GMT+0000 (Coordinated Universal Time)"
},
{
"id":"8ae38276-f0e6-427d-848b-a64febe831fe",
"color":"ivory",
"material":"Plastic",
"updatedAt":"Tue Sep 08 2020 03:15:42 GMT+0000 (Coordinated Universal Time)"
},
{
"id":"a83ec2f9-0b0d-41bb-bcba-870b09feb125",
"color":"lime",
"material":"Metal",
"updatedAt":"Mon Sep 07 2020 17:11:52 GMT+0000 (Coordinated Universal Time)"
},
{
"id":"ab751420-d09a-4371-81d2-762b0ad73d0f",
"color":"ivory",
"material":"Metal",
"updatedAt":"Mon Sep 07 2020 22:06:16 GMT+0000 (Coordinated Universal Time)"
},
{
"id":"d29405eb-493a-4759-9565-a9231bfe1c12",
"color":"black",
"material":"Soft",
"updatedAt":"Mon Sep 07 2020 20:08:48 GMT+0000 (Coordinated Universal Time)"
},
{
"id":"b1479fa4-5d5f-4d9a-bf5a-be68590ae067",
"color":"violet",
"material":"Frozen",
"updatedAt":"Tue Sep 08 2020 02:42:08 GMT+0000 (Coordinated Universal Time)"
},
{
"id":"1ada0f38-d18c-40ff-828d-5b75e7aede01",
"color":"olive",
"material":"Fresh",
"updatedAt":"Tue Sep 08 2020 10:55:00 GMT+0000 (Coordinated Universal Time)"
},
{
"id":"eb306aa6-b5a3-4033-85af-3c4c88f53c3c",
"color":"black",
"material":"Wooden",
"updatedAt":"Mon Sep 07 2020 22:01:30 GMT+0000 (Coordinated Universal Time)"
},
{
"id":"6d17e789-ee6b-43e3-b6ab-d2ff2c79f12d",
"color":"fuchsia",
"material":"Metal",
"updatedAt":"Mon Sep 07 2020 20:47:58 GMT+0000 (Coordinated Universal Time)"
},
{
"id":"1a8983bd-83ba-436c-b6ab-5cd70447e6f3",
"color":"sky blue",
"material":"Fresh",
"updatedAt":"Tue Sep 08 2020 12:32:53 GMT+0000 (Coordinated Universal Time)"
},
{
"id":"0886e37c-da9e-4ce9-a779-48f085544f96",
"color":"orange",
"material":"Concrete",
"updatedAt":"Mon Sep 07 2020 15:43:08 GMT+0000 (Coordinated Universal Time)"
},
{
"id":"e9d59c28-1962-494b-8dee-eb164b65d3a0",
"color":"yellow",
"material":"Steel",
"updatedAt":"Tue Sep 08 2020 08:47:42 GMT+0000 (Coordinated Universal Time)"
},
{
"id":"b88791b5-7f38-473f-b015-2f92f84d04dd",
"color":"green",
"material":"Frozen",
"updatedAt":"Tue Sep 08 2020 01:25:58 GMT+0000 (Coordinated Universal Time)"
},
{
"id":"369170aa-cb2f-4b5f-8c3f-d8ec62f12e1b",
"color":"plum",
"material":"Frozen",
"updatedAt":"Tue Sep 08 2020 07:23:01 GMT+0000 (Coordinated Universal Time)"
},
{
"id":"56dd962f-ee8a-4f26-8736-d9d891355709",
"color":"silver",
"material":"Frozen",
"updatedAt":"Tue Sep 08 2020 02:40:34 GMT+0000 (Coordinated Universal Time)"
},
{
"id":"478c3c93-68b0-45c4-b2a6-c33c26ff24e5",
"color":"sky blue",
"material":"Fresh",
"updatedAt":"Mon Sep 07 2020 17:08:41 GMT+0000 (Coordinated Universal Time)"
},
{
"id":"ffc12a4b-7c81-4bb4-8cc7-c48573395014",
"color":"blue",
"material":"Steel",
"updatedAt":"Tue Sep 08 2020 03:45:15 GMT+0000 (Coordinated Universal Time)"
},
{
"id":"279fe856-7a2f-4cf6-a603-533141d75ece",
"color":"azure",
"material":"Steel",
"updatedAt":"Mon Sep 07 2020 17:25:19 GMT+0000 (Coordinated Universal Time)"
},
{
"id":"8bad9885-a00c-4f39-89a4-bb80415b1245",
"color":"teal",
"material":"Granite",
"updatedAt":"Mon Sep 07 2020 18:38:08 GMT+0000 (Coordinated Universal Time)"
}
],
"updatedAt":"Mon Sep 07 2020 23:48:11 GMT+0000 (Coordinated Universal Time)"
},
]
}
The purpose of this project is to expose two REST endpoints http://marmiads.test/feed/products and http://marmiads.test/ads.
The first endpoint, http://marmiads.test/feed/products is going to sanitize the products given by the internal API and
return a JSON with the sanitized products. The output will look very similar to the internal endpoint:
{
"products":[
{
"id":"44622e6e-4d68-46e0-85be-5b0e9c99e414",
"name":"Practical Metal Gloves",
"description":"Aspernatur laboriosam suscipit enim quia maxime provident veniam. Quod porro voluptatibus officiis c",
"link":"https://javon.net",
"image":[
{
"url":"http://lorempixel.com/640/480",
"alt":"Aliquid culpa rerum molestiae ut soluta voluptatem voluptatibus itaque."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Soluta esse velit laborum velit et."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Quae consequatur aliquam necessitatibus quis fugiat vero."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Dolores omnis veniam minima aliquam ea deleniti."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Suscipit qui culpa."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Rerum saepe eveniet quia in et iure vero."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Aliquid voluptatem rerum laborum et nisi dolor."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Provident maiores nihil velit voluptatibus nihil."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Tempore consequatur exercitationem reiciendis sunt enim unde."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Qui voluptas nulla perferendis provident consequuntur non tempore."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Distinctio quis et inventore fuga quasi sapiente dignissimos explicabo nulla."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Et consectetur consequatur et."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Voluptatum sunt dolor nam vitae."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Quas itaque iste sit architecto iste alias."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Placeat odit qui qui et."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Officia dolore esse voluptatem voluptatum quasi."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Ut quae aut enim neque veniam."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Repellendus eos unde autem ut."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Iusto distinctio quaerat amet aliquam voluptas magni."
},
{
"url":"http://lorempixel.com/640/480",
"alt":"Pariatur maxime eum."
}
],
"availability":{
"stock":69
},
"price":{
"regular":70.05727532816405,
"on_sale":49.08989279160331
},
"variations":[
{
"id":"1a8983bd-83ba-436c-b6ab-5cd70447e6f3",
"color":"sky blue",
"material":"Fresh",
"updatedAt":"2020-09-08 12:32:53 +00:00"
}
],
"updatedAt":"2020-09-07 23:48:11.0 +00:00"
},
]
}
The second endpoint, http://marmiads.test/ads is going to return a list of ads in JSON format according to the processed products.
The output will like this:
{
"advertisements": {
"enabled": [
{
"id": "44622e6e-4d68-46e0-85be-5b0e9c99e414",
"name": "Practical Metal Gloves",
"link": "https://javon.net",
"images": [
"http://lorempixel.com/640/480"
],
"discount": "29%",
"message": "",
"colors": ["sky blue"],
"materials": ["Fresh"],
}
]
},
"disabled": []
}
- Clone this repository to any directory you want.
- Add to the end of your
/etc/hoststhe line127.0.0.1 marmiads.test. - Start the services to run the project. Run
docker-compose upinside the directory you just cloned. - Install project requirements. Run
docker exec -it project-php composer install. - You should be able to access to the endpoints
http://marmiads.test/feed/productsandhttp://marmiads.test/ads.
- Run
docker exec -it project-php php bin/phpunit