Ver Fonte

Created EntityManagerFactory

Alejandro Celaya há 8 anos atrás
pai
commit
03298fc448

+ 4 - 1
bin/cli

@@ -1,11 +1,14 @@
 #!/usr/bin/env php
 <?php
+use Interop\Container\ContainerInterface;
 use Zend\Diactoros\ServerRequestFactory;
 use Zend\Diactoros\Uri;
 use Zend\Expressive\Application;
 
+/** @var ContainerInterface $container */
+$container = include __DIR__ . '/../config/container.php';
 /** @var Application $app */
-$app = include __DIR__ . '/../config/app.php';
+$app = $container->get(Application::class);
 
 $command = count($_SERVER['argv']) > 1 ? $_SERVER['argv'][1] : '';
 $request = ServerRequestFactory::fromGlobals()

+ 11 - 0
cli-config.php

@@ -0,0 +1,11 @@
+<?php
+use Doctrine\ORM\EntityManager;
+use Doctrine\ORM\Tools\Console\ConsoleRunner;
+use Interop\Container\ContainerInterface;
+
+/** @var ContainerInterface $container */
+$container = include __DIR__ . '/config/container.php';
+/** @var EntityManager $em */
+$em = $container->get(EntityManager::class);
+
+return ConsoleRunner::createHelperSet($em);

+ 2 - 1
composer.json

@@ -19,7 +19,8 @@
         "zendframework/zend-servicemanager": "^3.0",
         "zendframework/zend-expressive-twigrenderer": "^1.0",
         "doctrine/orm": "^2.5",
-        "guzzlehttp/guzzle": "^6.2"
+        "guzzlehttp/guzzle": "^6.2",
+        "acelaya/zsm-annotated-services": "^0.2.0"
     },
     "require-dev": {
         "phpunit/phpunit": "^4.8",

+ 15 - 0
config/autoload/database.local.php.dist

@@ -0,0 +1,15 @@
+<?php
+return [
+
+    'database' => [
+        'driver' => 'pdo_mysql',
+        'user' => '',
+        'password' => '',
+        'dbname' => '',
+        'charset' => 'utf-8',
+        'driverOptions' => [
+            PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
+        ],
+    ]
+
+];

+ 20 - 3
config/autoload/services.global.php

@@ -1,16 +1,22 @@
 <?php
+use Acelaya\UrlShortener\Factory\EntityManagerFactory;
+use Acelaya\UrlShortener\Service\UrlShortener;
+use Acelaya\ZsmAnnotatedServices\Factory\V3\AnnotatedFactory;
+use Doctrine\ORM\EntityManager;
 use Zend\Expressive\Application;
 use Zend\Expressive\Container;
 use Zend\Expressive\Helper;
 use Zend\Expressive\Router;
 use Zend\Expressive\Template;
+use Zend\Expressive\Twig;
+use Zend\ServiceManager\Factory\InvokableFactory;
 
 return [
 
     'services' => [
         'invokables' => [
-            Helper\ServerUrlHelper::class => Helper\ServerUrlHelper::class,
-            Router\RouterInterface::class => Router\AuraRouter::class,
+            Helper\ServerUrlHelper::class,
+            Router\AuraRouter::class,
         ],
         'factories' => [
             Application::class => Container\ApplicationFactory::class,
@@ -19,11 +25,22 @@ return [
             Helper\UrlHelper::class => Helper\UrlHelperFactory::class,
             Helper\ServerUrlMiddleware::class => Helper\ServerUrlMiddlewareFactory::class,
             Helper\UrlHelperMiddleware::class => Helper\UrlHelperMiddlewareFactory::class,
+            Helper\ServerUrlHelper::class => InvokableFactory::class,
+            Router\RouterInterface::class => InvokableFactory::class,
 
             // View
             'Zend\Expressive\FinalHandler' => Container\TemplatedErrorHandlerFactory::class,
-            Template\TemplateRendererInterface::class => Zend\Expressive\Twig\TwigRendererFactory::class,
+            Template\TemplateRendererInterface::class => Twig\TwigRendererFactory::class,
+
+            // Services
+            EntityManager::class => EntityManagerFactory::class,
+            GuzzleHttp\Client::class => InvokableFactory::class,
+            UrlShortener::class => AnnotatedFactory::class,
         ],
+        'aliases' => [
+            'em' => EntityManager::class,
+            'httpClient' => GuzzleHttp\Client::class,
+        ]
     ],
 
 ];

+ 2 - 3
config/app.php → config/container.php

@@ -4,11 +4,10 @@ use Zend\ServiceManager\ServiceManager;
 
 chdir(dirname(__DIR__));
 
-require __DIR__ . '/../vendor/autoload.php';
+require 'vendor/autoload.php';
 
 // Build container
 $config = require __DIR__ . '/config.php';
 $container = new ServiceManager($config['services']);
 $container->setService('config', $config);
-
-return $container->get(Application::class);
+return $container;

+ 0 - 0
data/.gitignore → data/cache/.gitignore


+ 2 - 0
data/proxies/.gitignore

@@ -0,0 +1,2 @@
+*
+!.gitignore

+ 4 - 1
public/index.php

@@ -1,6 +1,9 @@
 <?php
+use Interop\Container\ContainerInterface;
 use Zend\Expressive\Application;
 
+/** @var ContainerInterface $container */
+$container = include __DIR__ . '/../config/container.php';
 /** @var Application $app */
-$app = include __DIR__ . '/../config/app.php';
+$app = $container->get(Application::class);
 $app->run();

+ 43 - 0
src/Factory/EntityManagerFactory.php

@@ -0,0 +1,43 @@
+<?php
+namespace Acelaya\UrlShortener\Factory;
+
+use Doctrine\Common\Cache\ArrayCache;
+use Doctrine\Common\Cache\Cache;
+use Doctrine\ORM\EntityManager;
+use Doctrine\ORM\Tools\Setup;
+use Interop\Container\ContainerInterface;
+use Interop\Container\Exception\ContainerException;
+use Zend\ServiceManager\Exception\ServiceNotCreatedException;
+use Zend\ServiceManager\Exception\ServiceNotFoundException;
+use Zend\ServiceManager\Factory\FactoryInterface;
+
+class EntityManagerFactory implements FactoryInterface
+{
+    /**
+     * Create an object
+     *
+     * @param  ContainerInterface $container
+     * @param  string $requestedName
+     * @param  null|array $options
+     * @return object
+     * @throws ServiceNotFoundException if unable to resolve the service.
+     * @throws ServiceNotCreatedException if an exception is raised when
+     *     creating a service.
+     * @throws ContainerException if any other error occurs
+     */
+    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
+    {
+        $globalConfig = $container->get('config');
+        $isDevMode = isset($globalConfig['debug']) ? ((bool) $globalConfig['debug']) : false;
+        $cache = $container->has(Cache::class) ? $container->get(Cache::class) : new ArrayCache();
+        $dbConfig = isset($globalConfig['database']) ? $globalConfig['database'] : [];
+
+        return EntityManager::create($dbConfig, Setup::createAnnotationMetadataConfiguration(
+            ['src/Entity'],
+            $isDevMode,
+            'data/proxies',
+            $cache,
+            false
+        ));
+    }
+}

+ 9 - 0
src/Service/UrlShortener.php

@@ -5,6 +5,7 @@ use Acelaya\UrlShortener\Entity\ShortUrl;
 use Acelaya\UrlShortener\Exception\InvalidShortCodeException;
 use Acelaya\UrlShortener\Exception\InvalidUrlException;
 use Acelaya\UrlShortener\Exception\RuntimeException;
+use Acelaya\ZsmAnnotatedServices\Annotation\Inject;
 use Doctrine\ORM\EntityManagerInterface;
 use Doctrine\ORM\ORMException;
 use GuzzleHttp\ClientInterface;
@@ -28,6 +29,14 @@ class UrlShortener implements UrlShortenerInterface
      */
     private $chars;
 
+    /**
+     * UrlShortener constructor.
+     * @param ClientInterface $httpClient
+     * @param EntityManagerInterface $em
+     * @param string $chars
+     *
+     * @Inject({"httpClient", "em"})
+     */
     public function __construct(
         ClientInterface $httpClient,
         EntityManagerInterface $em,

+ 38 - 0
tests/Factory/EntityManagerFactoryTest.php

@@ -0,0 +1,38 @@
+<?php
+namespace AcelayaTest\UrlShortener\Factory;
+
+use Acelaya\UrlShortener\Factory\EntityManagerFactory;
+use Doctrine\ORM\EntityManager;
+use PHPUnit_Framework_TestCase as TestCase;
+use Zend\ServiceManager\ServiceManager;
+
+class EntityManagerFactoryTest extends TestCase
+{
+    /**
+     * @var EntityManagerFactory
+     */
+    protected $factory;
+
+    public function setUp()
+    {
+        $this->factory = new EntityManagerFactory();
+    }
+
+    /**
+     * @test
+     */
+    public function serviceIsCreated()
+    {
+        $sm = new ServiceManager(['services' => [
+            'config' => [
+                'debug' => true,
+                'database' => [
+                    'driver' => 'pdo_sqlite',
+                ],
+            ],
+        ]]);
+
+        $em = $this->factory->__invoke($sm, EntityManager::class);
+        $this->assertInstanceOf(EntityManager::class, $em);
+    }
+}