Merge pull request #303 from acelaya/feature/expressive-swoole-2.2

Feature/expressive swoole 2.2
This commit is contained in:
Alejandro Celaya 2018-12-05 21:46:48 +01:00 committed by GitHub
commit 258f12f684
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 26 additions and 197 deletions

View file

@ -4,6 +4,29 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org).
## [Unreleased]
#### Added
* *Nothing*
#### Changed
* *Nothing*
#### Deprecated
* *Nothing*
#### Removed
* [#301](https://github.com/shlinkio/shlink/issues/301) Removed custom `AccessLogFactory` in favor of the implementation included in [zendframework/zend-expressive-swoole](https://github.com/zendframework/zend-expressive-swoole) v2.2.0
#### Fixed
* *Nothing*
## 1.15.0 - 2018-12-02
#### Added

View file

@ -42,7 +42,7 @@
"zendframework/zend-expressive-fastroute": "^3.0",
"zendframework/zend-expressive-helpers": "^5.0",
"zendframework/zend-expressive-platesrenderer": "^2.0",
"zendframework/zend-expressive-swoole": "^2.1",
"zendframework/zend-expressive-swoole": "^2.2",
"zendframework/zend-i18n": "^2.7",
"zendframework/zend-inputfilter": "^2.8",
"zendframework/zend-paginator": "^2.6",

View file

@ -7,7 +7,6 @@ use Monolog\Handler\RotatingFileHandler;
use Monolog\Handler\StreamHandler;
use Monolog\Logger;
use Monolog\Processor;
use Zend\Expressive\Swoole\Log\AccessLogInterface;
use const PHP_EOL;
return [
@ -32,7 +31,6 @@ return [
'class' => StreamHandler::class,
'level' => Logger::INFO,
'stream' => 'php://stdout',
'formatter' => 'dashed',
],
],
@ -61,15 +59,13 @@ return [
'factories' => [
'Logger_Shlink' => Common\Factory\LoggerFactory::class,
'Logger_Swoole' => Common\Factory\LoggerFactory::class,
AccessLogInterface::class => Common\Logger\Swoole\AccessLogFactory::class,
],
],
'zend-expressive-swoole' => [
'swoole-http-server' => [
'logger' => [
'logger_name' => 'Logger_Swoole',
'logger-name' => 'Logger_Swoole',
],
],
],

View file

@ -1,8 +1,7 @@
#!/usr/bin/env bash
# Run docker containers if they are not up yet
if [[ $(docker ps | grep shlink_swoole) ]]; then :
else
if ! [[ $(docker ps | grep shlink_swoole) ]]; then
docker-compose up -d
fi

View file

@ -1,51 +0,0 @@
<?php
declare(strict_types=1);
namespace Shlinkio\Shlink\Common\Logger\Swoole;
use Interop\Container\ContainerInterface;
use Psr\Log\LoggerInterface;
use Zend\Expressive\Swoole\Log;
use Zend\ServiceManager\Exception\ServiceNotCreatedException;
use Zend\ServiceManager\Exception\ServiceNotFoundException;
use Zend\ServiceManager\Factory\FactoryInterface;
class AccessLogFactory 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.
*/
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
$config = $container->has('config') ? $container->get('config') : [];
$config = $config['zend-expressive-swoole']['swoole-http-server']['logger'] ?? [];
return new Log\Psr3AccessLogDecorator(
$this->getLogger($container, $config),
$this->getFormatter($container, $config),
$config['use-hostname-lookups'] ?? false
);
}
private function getLogger(ContainerInterface $container, array $config): LoggerInterface
{
$loggerName = $config['logger_name'] ?? LoggerInterface::class;
return $container->has($loggerName) ? $container->get($loggerName) : new Log\StdoutLogger();
}
private function getFormatter(ContainerInterface $container, array $config): Log\AccessLogFormatterInterface
{
if ($container->has(Log\AccessLogFormatterInterface::class)) {
return $container->get(Log\AccessLogFormatterInterface::class);
}
return new Log\AccessLogFormatter($config['format'] ?? Log\AccessLogFormatter::FORMAT_COMMON);
}
}

View file

@ -1,138 +0,0 @@
<?php
declare(strict_types=1);
namespace ShlinkioTest\Shlink\Common\Logger\Swoole;
use PHPUnit\Framework\TestCase;
use Psr\Log\LoggerInterface;
use Psr\Log\NullLogger;
use ReflectionObject;
use Shlinkio\Shlink\Common\Logger\Swoole\AccessLogFactory;
use Zend\Expressive\Swoole\Log\AccessLogFormatter;
use Zend\Expressive\Swoole\Log\AccessLogFormatterInterface;
use Zend\Expressive\Swoole\Log\Psr3AccessLogDecorator;
use Zend\Expressive\Swoole\Log\StdoutLogger;
use Zend\ServiceManager\ServiceManager;
use function is_string;
class AccessLogFactoryTest extends TestCase
{
/** @var AccessLogFactory */
private $factory;
public function setUp()
{
$this->factory = new AccessLogFactory();
}
/**
* @test
*/
public function createsService()
{
$service = ($this->factory)(new ServiceManager(), '');
$this->assertInstanceOf(Psr3AccessLogDecorator::class, $service);
}
/**
* @test
* @dataProvider provideLoggers
* @param array $config
* @param string|LoggerInterface $expectedLogger
*/
public function wrapsProperLogger(array $config, $expectedLogger)
{
$service = ($this->factory)(new ServiceManager(['services' => $config]), '');
$ref = new ReflectionObject($service);
$loggerProp = $ref->getProperty('logger');
$loggerProp->setAccessible(true);
$logger = $loggerProp->getValue($service);
if (is_string($expectedLogger)) {
$this->assertInstanceOf($expectedLogger, $logger);
} else {
$this->assertSame($expectedLogger, $logger);
}
}
public function provideLoggers(): iterable
{
yield 'without-any-logger' => [[], StdoutLogger::class];
yield 'with-standard-logger' => (function () {
$logger = new NullLogger();
return [[LoggerInterface::class => $logger], $logger];
})();
yield 'with-custom-logger' => (function () {
$logger = new NullLogger();
return [[
'config' => [
'zend-expressive-swoole' => [
'swoole-http-server' => [
'logger' => [
'logger_name' => 'my-logger',
],
],
],
],
'my-logger' => $logger,
], $logger];
})();
}
/**
* @test
* @dataProvider provideFormatters
* @param array $config
* @param string|AccessLogFormatterInterface $expectedFormatter
*/
public function wrappsProperFormatter(array $config, $expectedFormatter, string $expectedFormat)
{
$service = ($this->factory)(new ServiceManager(['services' => $config]), '');
$ref = new ReflectionObject($service);
$formatterProp = $ref->getProperty('formatter');
$formatterProp->setAccessible(true);
$formatter = $formatterProp->getValue($service);
$ref = new ReflectionObject($formatter);
$formatProp = $ref->getProperty('format');
$formatProp->setAccessible(true);
$format = $formatProp->getValue($formatter);
if (is_string($expectedFormatter)) {
$this->assertInstanceOf($expectedFormatter, $formatter);
} else {
$this->assertSame($expectedFormatter, $formatter);
}
$this->assertSame($expectedFormat, $format);
}
public function provideFormatters(): iterable
{
yield 'with-registered-formatter-and-default-format' => (function () {
$formatter = new AccessLogFormatter();
return [[AccessLogFormatterInterface::class => $formatter], $formatter, AccessLogFormatter::FORMAT_COMMON];
})();
yield 'with-registered-formatter-and-custom-format' => (function () {
$formatter = new AccessLogFormatter(AccessLogFormatter::FORMAT_AGENT);
return [[AccessLogFormatterInterface::class => $formatter], $formatter, AccessLogFormatter::FORMAT_AGENT];
})();
yield 'with-no-formatter-and-not-configured-format' => [
[],
AccessLogFormatter::class,
AccessLogFormatter::FORMAT_COMMON,
];
yield 'with-no-formatter-and-configured-format' => [[
'config' => [
'zend-expressive-swoole' => [
'swoole-http-server' => [
'logger' => [
'format' => AccessLogFormatter::FORMAT_COMBINED_DEBIAN,
],
],
],
],
], AccessLogFormatter::class, AccessLogFormatter::FORMAT_COMBINED_DEBIAN];
}
}