- No Framework
- DDD (Domain Driver Design)
- Dependency injection and container with PHP-DI
- CommandBus and CommandQuery with Tactician
- Implement DomainEvents
- Implement Subscriber to update vending machine status
- Implement Middleware to dispatch and persist domain events
- Simple EventStore (var/log/domain_events.log)
- Unit testing with PHPUnit
- Simple Repository with json file and serialize entity with json-serializer
- CLI with Symfony console
.
├── app
│ └── config
├── bin
├── docker
│ └── php
├── src
│ ├── Application
│ │ ├── Catalog
│ │ │ └── Subscriber
│ │ ├── VendingMachine
│ │ │ ├── Command
│ │ │ ├── Request
│ │ │ └── Response
│ │ └── Wallet
│ │ └── Subscriber
│ ├── Domain
│ │ ├── Catalog
│ │ │ ├── Event
│ │ │ ├── Exception
│ │ │ └── Product
│ │ ├── Core
│ │ │ └── Event
│ │ │ └── Repository
│ │ ├── VendingMachine
│ │ │ ├── Event
│ │ │ ├── Exception
│ │ │ ├── Repository
│ │ │ └── Status
│ │ └── Wallet
│ │ ├── Coin
│ │ ├── Event
│ │ └── Exception
│ └── Infrastructure
│ ├── Repository
│ ├── Service
│ │ ├── Bus
│ │ │ └── Middleware
│ │ ├── Event
│ │ ├── File
│ │ └── Serialize
│ └── Ui
│ └── Cli
├── tests
│ └── unit
│ └── Application
│ └── VendingMachine
└── var
├── data
└── log
Clone this repository
$ git clone git@github.com:albertcolom/vendor-machine.git
Start docker compose
$ docker-compose up -d
$ docker-compose exec php bin/console
Available commands
vending-machine
vending-machine:coin:add Add coin into the machine
vending-machine:coin:add:user User add coin into the machine
vending-machine:coin:refund Refund user coins
vending-machine:create Create vending machine with catalog and wallet
vending-machine:create:empty Create empty vending machine
vending-machine:product:add Add product into the machine
vending-machine:product:buy Buy product
vending-machine:summary Vending machine summary
Example commands with parameters
$ docker-compose exec php bin/console vending-machine:coin:add 0.1
$ docker-compose exec php bin/console vending-machine:coin:add:user 0.1
$ docker-compose exec php bin/console vending-machine:coin:refund
$ docker-compose exec php bin/console vending-machine:create
$ docker-compose exec php bin/console vending-machine:create:empty
$ docker-compose exec php bin/console vending-machine:product:add water 1
$ docker-compose exec php bin/console vending-machine:product:buy water
$ docker-compose exec php bin/console vending-machine:summary
$ docker-compose exec php tail -f var/log/domain_events.log
Sample Output
[2020-07-12 19:03:09] "CoinAmountWasCreated" {"coin_type":0.05,"quantity":1}
[2020-07-12 19:03:09] "CoinAmountWasCreated" {"coin_type":0.1,"quantity":1}
[2020-07-12 19:03:09] "CoinAmountWasCreated" {"coin_type":1,"quantity":1}
[2020-07-12 21:20:25] "ProductLineWasCreated" {"product_type":"water","price":1,"quantity":1}
[2020-07-12 21:40:01] "CoinAmountWasRemoved" {"coin_type":1,"quantity":3}
[2020-07-12 21:40:01] "ProductLineWasRemoved" {"product_type":"juice","price":1,"quantity":1}
$ docker-compose exec php bin/phpunit
- Success message:
- Error message:
- Vending machine summary: