Created EntityManagerFactory

This commit is contained in:
Alejandro Celaya 2016-04-17 20:27:24 +02:00
parent db9051dcde
commit 03298fc448
12 changed files with 150 additions and 9 deletions

View File

@ -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
cli-config.php Normal file
View File

@ -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);

View File

@ -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",

View File

@ -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'
],
]
];

View File

@ -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,
]
],
];

View File

@ -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;

2
data/proxies/.gitignore vendored Normal file
View File

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

View File

@ -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();

View File

@ -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
));
}
}

View File

@ -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,

View File

@ -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);
}
}