Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
100.00% |
1 / 1 |
|
100.00% |
3 / 3 |
CRAP | |
100.00% |
59 / 59 |
SymfonyDemoContainer | |
100.00% |
1 / 1 |
|
100.00% |
3 / 3 |
7 | |
100.00% |
59 / 59 |
createDefinitionReader | |
100.00% |
1 / 1 |
1 | |
100.00% |
9 / 9 |
|||
configureContainer | |
100.00% |
1 / 1 |
1 | |
100.00% |
27 / 27 |
|||
process | |
100.00% |
1 / 1 |
5 | |
100.00% |
23 / 23 |
<?php declare(strict_types = 1); | |
/* | |
* Copyright (c) 2019, Josef Kufner <josef@kufner.cz> | |
* | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
* | |
*/ | |
namespace Smalldb\StateMachine\Test\SmalldbFactory; | |
use Doctrine\DBAL\Connection; | |
use PDO; | |
use Smalldb\StateMachine\ClassGenerator\SmalldbClassGenerator; | |
use Smalldb\StateMachine\Provider\LambdaProvider; | |
use Smalldb\StateMachine\Smalldb; | |
use Smalldb\StateMachine\SmalldbDefinitionBagInterface; | |
use Smalldb\StateMachine\SmalldbDefinitionBagReader; | |
use Smalldb\StateMachine\Test\Database\ArrayDaoTables; | |
use Smalldb\StateMachine\Test\Database\SymfonyDemoDatabaseFactory; | |
use Smalldb\StateMachine\Test\Database\SymfonyDemoDatabase; | |
use Smalldb\StateMachine\Test\Example\Bpmn\PizzaDelivery; | |
use Smalldb\StateMachine\Test\Example\Comment\Comment; | |
use Smalldb\StateMachine\Test\Example\Comment\CommentRepository; | |
use Smalldb\StateMachine\Test\Example\Comment\CommentTransitions; | |
use Smalldb\StateMachine\Test\Example\CrudItem\CrudItem; | |
use Smalldb\StateMachine\Test\Example\CrudItem\CrudItemRepository; | |
use Smalldb\StateMachine\Test\Example\CrudItem\CrudItemTransitions; | |
use Smalldb\StateMachine\Test\Example\Post\Post; | |
use Smalldb\StateMachine\Test\Example\Post\PostRepository; | |
use Smalldb\StateMachine\Test\Example\Post\PostTransitions; | |
use Smalldb\StateMachine\Test\Example\SupervisorProcess\SupervisorProcess; | |
use Smalldb\StateMachine\Test\Example\Tag\Tag; | |
use Smalldb\StateMachine\Test\Example\Tag\TagRepository; | |
use Smalldb\StateMachine\Test\Example\Tag\TagTransitions; | |
use Smalldb\StateMachine\Test\Example\User\User; | |
use Smalldb\StateMachine\Test\Example\User\UserRepository; | |
use Smalldb\StateMachine\Test\Example\User\UserTransitions; | |
use Smalldb\StateMachine\Test\TestTemplate\TestOutput; | |
use Smalldb\StateMachine\Transition\AllowingTransitionGuard; | |
use Smalldb\StateMachine\Transition\TransitionGuard; | |
use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument; | |
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; | |
use Symfony\Component\DependencyInjection\ContainerBuilder; | |
use Symfony\Component\DependencyInjection\Reference; | |
use Symfony\Component\String\Slugger\AsciiSlugger; | |
use Symfony\Component\String\Slugger\SluggerInterface; | |
class SymfonyDemoContainer extends AbstractSmalldbContainerFactory implements SmalldbFactory, CompilerPassInterface | |
{ | |
protected function createDefinitionReader(ContainerBuilder $c): SmalldbDefinitionBagReader | |
{ | |
$bagReader = new SmalldbDefinitionBagReader(); | |
$bagReader->addFromAnnotatedClass(CrudItem::class); | |
$bagReader->addFromAnnotatedClass(Post::class); | |
$bagReader->addFromAnnotatedClass(Tag::class); | |
$bagReader->addFromAnnotatedClass(User::class); | |
$bagReader->addFromAnnotatedClass(Comment::class); | |
$bagReader->addFromAnnotatedClass(SupervisorProcess::class); | |
$bagReader->addFromAnnotatedClass(PizzaDelivery::class); | |
return $bagReader; | |
} | |
protected function configureContainer(ContainerBuilder $c): ContainerBuilder | |
{ | |
$c->autowire(Smalldb::class) | |
->setPublic(true); | |
// "Database" | |
$c->autowire(ArrayDaoTables::class); | |
// Symfony Demo Database | |
$c->autowire(TestOutput::class); | |
$c->autowire(SymfonyDemoDatabase::class) | |
->setPublic(true); | |
$c->setAlias(PDO::class, SymfonyDemoDatabase::class) | |
->setPublic(true); | |
// Symfony Demo Database using Doctrine DBAL | |
$c->autowire(SymfonyDemoDatabaseFactory::class); | |
$c->autowire(Connection::class) | |
->setPublic(true) | |
->setFactory([new Reference(SymfonyDemoDatabaseFactory::class), 'connect']); | |
$c->autowire(TransitionGuard::class, AllowingTransitionGuard::class); | |
// Add Repositories | |
$c->autowire(PostRepository::class)->setPublic(true); | |
$c->autowire(TagRepository::class)->setPublic(true); | |
$c->autowire(UserRepository::class)->setPublic(true); | |
$c->autowire(CommentRepository::class)->setPublic(true); | |
$c->autowire(CrudItemRepository::class)->setPublic(true); | |
// Add transition implementations | |
$c->autowire(PostTransitions::class)->setPublic(true); | |
$c->autowire(TagTransitions::class)->setPublic(true); | |
$c->autowire(UserTransitions::class)->setPublic(true); | |
$c->autowire(CommentTransitions::class)->setPublic(true); | |
$c->autowire(CrudItemTransitions::class)->setPublic(true); | |
// Additional services | |
$c->setAlias(SluggerInterface::class, AsciiSlugger::class); | |
$c->autowire(AsciiSlugger::class); | |
$c->addCompilerPass($this); | |
return $c; | |
} | |
public function process(ContainerBuilder $c) | |
{ | |
$scg = new SmalldbClassGenerator('Smalldb\\GeneratedCode\\', $this->out->mkdir('generated')); | |
$smalldb = $c->getDefinition(Smalldb::class); | |
// Definition Bag | |
$definitionBag = $this->createDefinitionReader($c)->getDefinitionBag(); | |
$definitionBagReference = new Reference(SmalldbDefinitionBagInterface::class); | |
// Register & Autowire all state machine components | |
foreach ($definitionBag->getAllDefinitions() as $machineType => $definition) { | |
$referenceClass = $definition->getReferenceClass(); | |
$repositoryClass = $definition->getRepositoryClass(); | |
$transitionsClass = $definition->getTransitionsClass(); | |
$realReferenceClass = $referenceClass ? $scg->generateReferenceClass($referenceClass, $definition) : null; | |
// Glue them together using a machine provider | |
$providerId = "smalldb.$machineType.provider"; | |
$c->register($providerId, LambdaProvider::class) | |
->setFactory(LambdaProvider::class . '::createWithDefinitionBag') | |
->setArguments([ | |
$machineType, | |
$realReferenceClass, | |
$definitionBagReference, | |
$transitionsClass ? new ServiceClosureArgument(new Reference($transitionsClass)) : null, | |
$repositoryClass ? new ServiceClosureArgument(new Reference($repositoryClass)) : null, | |
]); | |
// Register state machine type | |
$smalldb->addMethodCall('registerMachineType', [new Reference($providerId), [$referenceClass]]); | |
} | |
// Compile & register definition bag | |
$bagName = 'GeneratedDefinitionBag_' . preg_replace('/.*\\\\/', '', get_class($this)); | |
$c->autowire(SmalldbDefinitionBagInterface::class, $scg->generateDefinitionBag($definitionBag, $bagName)) | |
->setPublic(true); | |
} | |
} |