The application is based on Symfony 4, but trying to decouple as much as possible to do DDD and Hexagonal Arquitecture. You'll see that all the Symfony required code in /src is inside the Infrastructure folder. The API is following jsonapi.org specification, a one that I believe that works pretty fine. I've developed almost all the application doing TDD, the cache decorator no because I ran out of time and I did something pretty fast and basic, as you'll see :) Even that I tried to do DDD it's a pretty basic approach, since there is just one bounded context and on module.
For the tests I used Mockery to do mocks and Faker to generate random data. To communicate with Twitter API I used j7mbo/twitter-api-php, first time that I've used and looks pretty simple.
Also I've used some design patterns:
- Factory -> \App\Domain\Tweet\Transform\TransformerFactory
- Named constructor -> \App\Application\Tweet\ShoutLastTweetsResponse, \App\Domain\Tweet\TweetCollection
- Strategy -> \App\Domain\Tweet\Transform*
- Decorator -> \App\Infrastructure\DataSource\CachedTweetRepository
- Adapter -> \App\Infrastructure\DataSource\TwitterAPI\TwitterAPITweetRepository
- Singleton -> \App\Domain\Tweet\Transform\ShoutTransformer
- php -S 127.0.0.1:8000 -t public
- http://127.0.0.1:8000/tweets/shouted?username=martinfowler&number=4
- docker-compose build
- docker-compose up -d
- Optional, just if you want to have symfony.local alias: sudo echo $(docker network inspect bridge | grep Gateway | grep -o -E '[0-9.]+') "symfony.local" >> /etc/hosts
- http://symfony.local/tweets/shouted?username=martinfowler&number=6
- vendor/bin/simple-phpunit
The first problem that I found was that I wasn't used to Symfony 4, I've working mostly in 2 and 3 but I wanted to give a try to the new version, so I struggled a bit to be ablet to have all the Symfony code in /src inside the Infrastructure folder. Also I found some problems declaring services in service.yaml, so I couldn't keep the main file like it was and having a new one inside Infrastructure with the specific declarations.