Skip to content

Commit d8b02fa

Browse files
authored
Merge pull request #13 from tyx/feature/projection
Let's rules the world
2 parents d9f832b + 56d4913 commit d8b02fa

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+3334
-824
lines changed

.gitignore

+6
Original file line numberDiff line numberDiff line change
@@ -1 +1,7 @@
11
vendor/
2+
var/cache/*
3+
!var/cache/.gitkeep
4+
var/logs/*
5+
!var/logs/.gitkeep
6+
var/eventstore/*
7+
!var/eventstore/.gitkeep

.travis.yml

+1
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@ before_script:
77
- composer install --prefer-dist --optimize-autoloader
88

99
script:
10+
- bin/console server:run &> /dev/null &
1011
- vendor/bin/behat -f progress
1112
- vendor/bin/phpspec run --format=dot

app/AppKernel.php

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
<?php
2+
3+
use Symfony\Component\Config\Loader\LoaderInterface;
4+
use Symfony\Component\DependencyInjection\ContainerBuilder;
5+
use Symfony\Component\HttpKernel\Kernel;
6+
use Symfony\Component\Routing\RouteCollectionBuilder;
7+
use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;
8+
use Symfony\Component\EventDispatcher\DependencyInjection\RegisterListenersPass;
9+
10+
class AppKernel extends Kernel
11+
{
12+
use MicroKernelTrait;
13+
14+
public function registerBundles()
15+
{
16+
$bundles = [
17+
new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
18+
new League\Tactician\Bundle\TacticianBundle(),
19+
];
20+
21+
if (in_array($this->getEnvironment(), array('dev', 'test'), true)) {
22+
$bundles[] = new Symfony\Bundle\DebugBundle\DebugBundle();
23+
}
24+
25+
return $bundles;
26+
}
27+
28+
protected function configureRoutes(RouteCollectionBuilder $routes)
29+
{
30+
$routes->import(__DIR__.'/config/routing.yml');
31+
}
32+
33+
protected function configureContainer(ContainerBuilder $c, LoaderInterface $loader)
34+
{
35+
$loader->load(__DIR__.'/services/');
36+
$loader->load(__DIR__.'/config/config.yml');
37+
$c->addCompilerPass(
38+
new RegisterListenersPass(
39+
'event_dispatcher.parked_life',
40+
'event_listener.parked_life',
41+
'event_subscriber.parked_life'
42+
)
43+
);
44+
}
45+
46+
public function getRootDir()
47+
{
48+
return __DIR__;
49+
}
50+
51+
public function getCacheDir()
52+
{
53+
return '../var/cache/'.$this->getEnvironment();
54+
}
55+
56+
public function getLogDir()
57+
{
58+
return '../var/logs';
59+
}
60+
}

app/config/config.yml

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
parameters:
2+
exception_http_code_map:
3+
Shouze\ParkedLife\App\Exception\NotFoundResource: 404
4+
show_exception_token: t0kt0k
5+
6+
framework:
7+
secret: S0ME_SECRET
8+
9+
tactician:
10+
method_inflector: command_inflector.parked_life

app/config/routing.yml

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
register_vehicle:
2+
path: /users/{userId}/vehicles
3+
defaults:
4+
_controller: vehicle_controller.ui.parked_life:registerVehicle
5+
methods: [POST]
6+
7+
park_vehicle:
8+
path: /users/{userId}/vehicles/location
9+
defaults:
10+
_controller: vehicle_controller.ui.parked_life:parkVehicle
11+
methods: [POST]
12+
13+
list_vehicles:
14+
path: /users/{userId}/vehicles
15+
defaults:
16+
_controller: vehicle_controller.ui.parked_life:listVehicles
17+
methods: [GET]

app/services/adapters.xml

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
<?xml version="1.0" ?>
2+
3+
<container xmlns="http://symfony.com/schema/dic/services"
4+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5+
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
6+
7+
<services>
8+
<service id="projector.adapters.parked_life" class="Shouze\ParkedLife\Adapters\JsonProjector">
9+
<argument>%kernel.root_dir%/../var/eventstore</argument>
10+
<argument type="service" id="serializer.parked_life" />
11+
</service>
12+
<service id="event_store_vehicle_fleet_repository.adapters.parked_life" class="Shouze\ParkedLife\Adapters\EventStoreVehicleFleetRepository">
13+
<argument type="service" id="event_store.adapters.parked_life" />
14+
</service>
15+
<service id="event_store.adapters.parked_life" class="Shouze\ParkedLife\Adapters\FilesystemEventStore">
16+
<argument>%kernel.root_dir%/../var/eventstore</argument>
17+
<argument type="service" id="event_serializer.parked_life" />
18+
<argument type="service">
19+
<service class="Shouze\ParkedLife\Ports\FileHelper" />
20+
</argument>
21+
<argument type="service" id="symfony_event_bus.parked_life" />
22+
</service>
23+
24+
<service id="event_serializer.parked_life" class="Shouze\ParkedLife\EventSourcing\EventSerializer" public="false">
25+
<argument type="service">
26+
<service class="Shouze\ParkedLife\Domain\EventMapping" />
27+
</argument>
28+
<argument type="service" id="serializer.parked_life" />
29+
</service>
30+
31+
<service id="serializer.parked_life" class="Symfony\Component\Serializer\Serializer" public="false">
32+
<argument type="collection">
33+
<argument type="service">
34+
<service class="Symfony\Component\Serializer\Normalizer\PropertyNormalizer">
35+
<argument>null</argument>
36+
<argument type="service">
37+
<service class="Symfony\Component\Serializer\NameConverter\CamelCaseToSnakeCaseNameConverter" />
38+
</argument>
39+
</service>
40+
</argument>
41+
</argument>
42+
<argument type="collection">
43+
<argument type="service">
44+
<service class="Symfony\Component\Serializer\Encoder\JsonEncoder" />
45+
</argument>
46+
</argument>
47+
</service>
48+
49+
<service id="symfony_event_bus.parked_life" class="Shouze\ParkedLife\Adapters\SymfonyEventBus">
50+
<argument type="service" id="event_dispatcher.parked_life" />
51+
<argument type="service" id="event_serializer.parked_life" />
52+
</service>
53+
54+
<service id="event_dispatcher.parked_life" class="Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher">
55+
<argument type="service" id="service_container" />
56+
</service>
57+
</services>
58+
</container>

app/services/app.xml

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?xml version="1.0" ?>
2+
3+
<container xmlns="http://symfony.com/schema/dic/services"
4+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5+
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
6+
7+
<services>
8+
<service id="vehicle_service.app.parked_life" class="Shouze\ParkedLife\App\VehicleService">
9+
<argument type="service" id="event_store_vehicle_fleet_repository.adapters.parked_life" />
10+
<tag name="tactician.handler" command="Shouze\ParkedLife\App\Command\RegisterVehicle" />
11+
<tag name="tactician.handler" command="Shouze\ParkedLife\App\Command\ParkVehicle" />
12+
</service>
13+
14+
<service id="vehicle_query_service.app.parked_life" class="Shouze\ParkedLife\App\VehicleQueryService">
15+
<argument type="service" id="projector.adapters.parked_life" />
16+
</service>
17+
18+
<service id="command_inflector.parked_life" class="Shouze\ParkedLife\Ports\CommandClassAsMethodInflector" public="false" />
19+
</services>
20+
</container>

app/services/projections.xml

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?xml version="1.0" ?>
2+
3+
<container xmlns="http://symfony.com/schema/dic/services"
4+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5+
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
6+
7+
<services>
8+
<service id="vehicle_fleet_projector.projections.parked_life" class="Shouze\ParkedLife\Domain\ReadModel\VehicleFleetProjector">
9+
<argument type="service" id="projector.adapters.parked_life" />
10+
<tag name="event_listener.parked_life" event="vehicle_was_registered.fleet.parkedlife" method="projectVehicleWasRegistred" />
11+
<tag name="event_listener.parked_life" event="vehicle_was_parked.fleet.parkedlife" method="projectVehicleWasParked" />
12+
</service>
13+
</services>
14+
</container>

app/services/ui.xml

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?xml version="1.0" ?>
2+
3+
<container xmlns="http://symfony.com/schema/dic/services"
4+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5+
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
6+
7+
<services>
8+
<service id="vehicle_controller.ui.parked_life" class="Shouze\ParkedLife\Ui\Controller\VehicleController">
9+
<argument type="service" id="tactician.commandbus" />
10+
<argument type="service" id="vehicle_query_service.app.parked_life" />
11+
</service>
12+
13+
<service id="json_body_listener.ui" class="Rezzza\SymfonyRestApiJson\JsonBodyListener">
14+
<argument type="service">
15+
<service class="Rezzza\SymfonyRestApiJson\PayloadValidator">
16+
<argument type="service">
17+
<service class="Rezzza\SymfonyRestApiJson\JsonSchemaTools" />
18+
</argument>
19+
</service>
20+
</argument>
21+
<tag name="kernel.event_listener" event="kernel.request" method="onKernelRequest" priority="24" />
22+
</service>
23+
24+
<service id="link_request_listener.ui" class="Rezzza\SymfonyRestApiJson\LinkRequestListener">
25+
<tag name="kernel.event_listener" event="kernel.request" method="onKernelRequest" priority="10" />
26+
</service>
27+
28+
<service id="json_exception_handler.ui" class="Rezzza\SymfonyRestApiJson\JsonExceptionHandler">
29+
<argument type="service">
30+
<service class="Rezzza\SymfonyRestApiJson\ExceptionHttpCodeMap">
31+
<argument>%exception_http_code_map%</argument>
32+
</service>
33+
</argument>
34+
<tag name="kernel.event_listener" event="kernel.exception" method="onKernelException" priority="32" />
35+
</service>
36+
37+
<service id="json_exception_controller.ui" class="Rezzza\SymfonyRestApiJson\JsonExceptionController">
38+
<argument>%kernel.debug%</argument>
39+
<argument>%show_exception_token%</argument>
40+
</service>
41+
42+
<service id="ui.event_listener.exception_listener" class="Symfony\Component\HttpKernel\EventListener\ExceptionListener">
43+
<tag name="kernel.event_subscriber" />
44+
<tag name="monolog.logger" channel="request" />
45+
<argument>json_exception_controller.ui:showException</argument>
46+
<argument type="service" id="logger" on-invalid="null" />
47+
</service>
48+
</services>
49+
</container>

behat.yml

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
default:
2+
suites:
3+
domain:
4+
filters: { tags: "~ui" }
5+
contexts:
6+
- DomainContext
7+
web:
8+
filters: { tags: "critical,ui" }
9+
contexts:
10+
- WebContext:
11+
eventStore: "@event_store.adapters.parked_life"
12+
- Rezzza\RestApiBehatExtension\RestApiContext
13+
- Rezzza\RestApiBehatExtension\Json\JsonContext
14+
15+
extensions:
16+
Rezzza\RestApiBehatExtension\Extension:
17+
rest:
18+
base_url: http://localhost:8000/
19+
store_response: true
20+
Behat\Symfony2Extension: ~

bin/console

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#!/usr/bin/env php
2+
<?php
3+
4+
use Symfony\Bundle\FrameworkBundle\Console\Application;
5+
use Symfony\Component\Console\Input\ArgvInput;
6+
use Symfony\Component\Debug\Debug;
7+
8+
// if you don't want to setup permissions the proper way, just uncomment the following PHP line
9+
// read http://symfony.com/doc/current/book/installation.html#configuration-and-setup for more information
10+
//umask(0000);
11+
12+
set_time_limit(0);
13+
14+
/** @var Composer\Autoload\ClassLoader $loader */
15+
$loader = require __DIR__.'/../vendor/autoload.php';
16+
17+
$input = new ArgvInput();
18+
$env = $input->getParameterOption(['--env', '-e'], getenv('SYMFONY_ENV') ?: 'dev');
19+
$debug = getenv('SYMFONY_DEBUG') !== '0' && !$input->hasParameterOption(['--no-debug', '']) && $env !== 'prod';
20+
21+
if ($debug) {
22+
Debug::enable();
23+
}
24+
25+
$kernel = new AppKernel($env, $debug);
26+
$application = new Application($kernel);
27+
$application->run($input);

composer.json

+13-3
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,24 @@
33
"type": "application",
44
"license": "MIT",
55
"autoload": {
6-
"psr-4": { "Shouze\\ParkedLife\\": "src/" }
6+
"psr-4": { "Shouze\\ParkedLife\\": "src/" },
7+
"classmap": [ "app/AppKernel.php" ]
78
},
89
"require": {
9-
"symfony/serializer": "^3.1"
10+
"symfony/serializer": "^3.1",
11+
"pascaldevink/shortuuid": "^1.0",
12+
"symfony/symfony": "^3.1",
13+
"league/tactician-bundle": "^0.4.1",
14+
"rezzza/symfony-rest-api-json": "^1.0"
1015
},
1116
"require-dev": {
1217
"behat/behat": "^3.2",
1318
"phpspec/phpspec": "^3.1",
14-
"beberlei/assert": "^2.6"
19+
"rezzza/rest-api-behat-extension": "^5.0",
20+
"behat/symfony2-extension": "^2.1",
21+
"php-http/curl-client": "^1.6",
22+
"php-http/client-common": "^1.2",
23+
"php-http/message": "^1.3",
24+
"guzzlehttp/psr7": "^1.3"
1525
}
1626
}

0 commit comments

Comments
 (0)