php-cs-fixer update.
This commit is contained in:
parent
41bba407a9
commit
a3b9a49fec
56 changed files with 355 additions and 318 deletions
.php-cs-fixer.php
bin
src
Annotations
App.phpControllers
Exceptions
BenzineConfigurationException.phpBenzineException.phpDbConfigException.phpDbRuntimeException.phpFilterDecodeException.phpJsonErrorHandler.phpWorkerException.php
Guzzle
Middleware
Models/Traits
Redis
Router
Services
Twig/Extensions
ArrayUniqueTwigExtension.phpArrayValuesTwigExtension.phpFilterAlphanumericOnlyTwigExtension.phpInflectionExtension.phpInstanceOfExtension.phpTransformExtension.phpTransformExtensionException.php
Workers
tests
|
@ -41,17 +41,35 @@ return (new PhpCsFixer\Config)
|
||||||
->setRiskyAllowed(true)
|
->setRiskyAllowed(true)
|
||||||
->setHideProgress(false)
|
->setHideProgress(false)
|
||||||
->setRules([
|
->setRules([
|
||||||
'@PSR2' => true,
|
'@PhpCsFixer' => true,
|
||||||
'strict_param' => true,
|
// '@PhpCsFixer:risky' => true,
|
||||||
'array_syntax' => ['syntax' => 'short'],
|
'@PHP82Migration' => true,
|
||||||
'@PhpCsFixer' => true,
|
'@PHP80Migration:risky' => true,
|
||||||
'@PHP73Migration' => true,
|
'@PSR12' => true,
|
||||||
'no_php4_constructor' => true,
|
'@PSR12:risky' => true,
|
||||||
'no_unused_imports' => true,
|
'@PHPUnit100Migration:risky' => true,
|
||||||
'no_useless_else' => true,
|
|
||||||
'no_superfluous_phpdoc_tags' => false,
|
'binary_operator_spaces' => [
|
||||||
'void_return' => true,
|
'default' => 'align_single_space_minimal',
|
||||||
'yoda_style' => false,
|
'operators' => [
|
||||||
|
'=' => 'align_single_space',
|
||||||
|
'=>' => 'align_single_space',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'types_spaces' => [
|
||||||
|
'space' => 'single',
|
||||||
|
'space_multiple_catch' => 'single',
|
||||||
|
],
|
||||||
|
|
||||||
|
// Annoyance-fixers:
|
||||||
|
'concat_space' => ['spacing' => 'one'], // This one is a matter of taste.
|
||||||
|
'no_superfluous_phpdoc_tags' => [
|
||||||
|
'allow_mixed' => false,
|
||||||
|
'allow_unused_params' => false,
|
||||||
|
'remove_inheritdoc' => true,
|
||||||
|
],
|
||||||
|
'yoda_style' => false, // Disabled as its annoying. Comes with @PhpCsFixer
|
||||||
|
'native_function_invocation' => false, // Disabled as adding count($i) -> \count($i) is annoying, but supposedly more performant
|
||||||
])
|
])
|
||||||
->setFinder($finder)
|
->setFinder($finder)
|
||||||
;
|
;
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
function detectAndLoadVendor($path = __DIR__): void
|
function detectAndLoadVendor($path = __DIR__): void
|
||||||
{
|
{
|
||||||
$path = realpath($path);
|
$path = realpath($path);
|
||||||
|
@ -11,12 +13,12 @@ function detectAndLoadVendor($path = __DIR__): void
|
||||||
if ($fileInfo->isDir() && 'vendor' == $fileInfo->getFilename()) {
|
if ($fileInfo->isDir() && 'vendor' == $fileInfo->getFilename()) {
|
||||||
define('VENDOR_PATH', $fileInfo->getRealPath());
|
define('VENDOR_PATH', $fileInfo->getRealPath());
|
||||||
|
|
||||||
require_once VENDOR_PATH.'/autoload.php';
|
require_once VENDOR_PATH . '/autoload.php';
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
detectAndLoadVendor($path.'/../');
|
detectAndLoadVendor($path . '/../');
|
||||||
}
|
}
|
||||||
|
|
||||||
detectAndLoadVendor();
|
detectAndLoadVendor();
|
||||||
|
|
|
@ -8,7 +8,6 @@ use Doctrine\Common\Annotations\Annotation\Required;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Annotation
|
* @Annotation
|
||||||
*
|
|
||||||
* @Target("METHOD")
|
* @Target("METHOD")
|
||||||
*/
|
*/
|
||||||
class JsonSchema
|
class JsonSchema
|
||||||
|
|
|
@ -8,12 +8,10 @@ use Doctrine\Common\Annotations\Annotation\Required;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Annotation
|
* @Annotation
|
||||||
*
|
|
||||||
* @Target("METHOD")
|
* @Target("METHOD")
|
||||||
*/
|
*/
|
||||||
class Route
|
class Route
|
||||||
{
|
{
|
||||||
/** @var array */
|
|
||||||
public array $methods = ['GET'];
|
public array $methods = ['GET'];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -21,12 +19,9 @@ class Route
|
||||||
*/
|
*/
|
||||||
public string $path;
|
public string $path;
|
||||||
|
|
||||||
/** @var string */
|
|
||||||
public string $access = \Benzine\Router\Route::ACCESS_PUBLIC;
|
public string $access = \Benzine\Router\Route::ACCESS_PUBLIC;
|
||||||
|
|
||||||
/** @var int */
|
|
||||||
public int $weight = 100;
|
public int $weight = 100;
|
||||||
|
|
||||||
/** @var array */
|
|
||||||
public array $domains = [];
|
public array $domains = [];
|
||||||
}
|
}
|
||||||
|
|
93
src/App.php
93
src/App.php
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine;
|
namespace Benzine;
|
||||||
|
|
||||||
use Benzine\Middleware\JsonResponseExecTimeMiddleware;
|
use Benzine\Middleware\JsonResponseExecTimeMiddleware;
|
||||||
|
@ -31,7 +33,10 @@ use DebugBar\DebugBar;
|
||||||
use DI\Container;
|
use DI\Container;
|
||||||
use DI\ContainerBuilder;
|
use DI\ContainerBuilder;
|
||||||
use Faker\Factory as FakerFactory;
|
use Faker\Factory as FakerFactory;
|
||||||
|
use Faker\Generator;
|
||||||
use Faker\Provider;
|
use Faker\Provider;
|
||||||
|
use Kint\Twig\TwigExtension;
|
||||||
|
use Middlewares\ContentLength;
|
||||||
use Middlewares\TrailingSlash;
|
use Middlewares\TrailingSlash;
|
||||||
use Monolog\Formatter\LineFormatter;
|
use Monolog\Formatter\LineFormatter;
|
||||||
use Monolog\Handler\StreamHandler;
|
use Monolog\Handler\StreamHandler;
|
||||||
|
@ -57,30 +62,26 @@ class App
|
||||||
|
|
||||||
protected EnvironmentService $environmentService;
|
protected EnvironmentService $environmentService;
|
||||||
protected ConfigurationService $configurationService;
|
protected ConfigurationService $configurationService;
|
||||||
protected \Slim\App $app;
|
protected Slim\App $app;
|
||||||
protected Logger $logger;
|
protected Logger $logger;
|
||||||
protected DebugBar $debugBar;
|
protected DebugBar $debugBar;
|
||||||
protected Router $router;
|
protected Router $router;
|
||||||
protected bool $isSessionsEnabled = true;
|
protected bool $isSessionsEnabled = true;
|
||||||
protected bool $interrogateControllersComplete = false;
|
protected bool $interrogateControllersComplete = false;
|
||||||
protected ?CachePoolChain $cachePoolChain = null;
|
protected ?CachePoolChain $cachePoolChain = null;
|
||||||
private array $viewPaths = [];
|
private array $viewPaths = [];
|
||||||
private string $cachePath = APP_ROOT.'/cache';
|
private string $cachePath = APP_ROOT . '/cache';
|
||||||
private string $logPath = APP_ROOT.'/logs';
|
private string $logPath = APP_ROOT . '/logs';
|
||||||
private array $supportedLanguages = ['en_US'];
|
private array $supportedLanguages = ['en_US'];
|
||||||
private bool $debugMode = false;
|
private bool $debugMode = false;
|
||||||
|
|
||||||
private static bool $isInitialised = false;
|
private static bool $isInitialised = false;
|
||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
if (!ini_get('auto_detect_line_endings')) {
|
|
||||||
ini_set('auto_detect_line_endings', '1');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Configure Dependency Injector
|
// Configure Dependency Injector
|
||||||
$container = $this->setupContainer();
|
$container = $this->setupContainer();
|
||||||
$this->logger = $container->get(Logger::class);
|
$this->logger = $container->get(Logger::class);
|
||||||
$this->debugBar = $container->get(DebugBar::class);
|
$this->debugBar = $container->get(DebugBar::class);
|
||||||
AppFactory::setContainer($container);
|
AppFactory::setContainer($container);
|
||||||
|
|
||||||
|
@ -91,8 +92,8 @@ class App
|
||||||
}
|
}
|
||||||
|
|
||||||
// Configure default expected views paths
|
// Configure default expected views paths
|
||||||
$this->viewPaths[] = APP_ROOT.'/views/';
|
$this->viewPaths[] = APP_ROOT . '/views/';
|
||||||
$this->viewPaths[] = APP_ROOT.'/src/Views/';
|
$this->viewPaths[] = APP_ROOT . '/src/Views/';
|
||||||
|
|
||||||
// Configure Slim
|
// Configure Slim
|
||||||
$this->app = AppFactory::create();
|
$this->app = AppFactory::create();
|
||||||
|
@ -132,19 +133,11 @@ class App
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function getViewPaths(): array
|
public function getViewPaths(): array
|
||||||
{
|
{
|
||||||
return $this->viewPaths;
|
return $this->viewPaths;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $viewPaths
|
|
||||||
*
|
|
||||||
* @return App
|
|
||||||
*/
|
|
||||||
public function setViewPaths(array $viewPaths): App
|
public function setViewPaths(array $viewPaths): App
|
||||||
{
|
{
|
||||||
$this->viewPaths = $viewPaths;
|
$this->viewPaths = $viewPaths;
|
||||||
|
@ -152,19 +145,11 @@ class App
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getLogPath(): string
|
public function getLogPath(): string
|
||||||
{
|
{
|
||||||
return $this->logPath;
|
return $this->logPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $logPath
|
|
||||||
*
|
|
||||||
* @return App
|
|
||||||
*/
|
|
||||||
public function setLogPath(string $logPath): App
|
public function setLogPath(string $logPath): App
|
||||||
{
|
{
|
||||||
$this->logPath = $logPath;
|
$this->logPath = $logPath;
|
||||||
|
@ -182,7 +167,7 @@ class App
|
||||||
|
|
||||||
public function setupContainer(): Container
|
public function setupContainer(): Container
|
||||||
{
|
{
|
||||||
$app = $this;
|
$app = $this;
|
||||||
$container =
|
$container =
|
||||||
(new ContainerBuilder())
|
(new ContainerBuilder())
|
||||||
->useAutowiring(true)
|
->useAutowiring(true)
|
||||||
|
@ -207,7 +192,7 @@ class App
|
||||||
}
|
}
|
||||||
|
|
||||||
$twigCachePath = "{$this->getCachePath()}/twig";
|
$twigCachePath = "{$this->getCachePath()}/twig";
|
||||||
$twigSettings = [];
|
$twigSettings = [];
|
||||||
|
|
||||||
if ($environmentService->has('TWIG_CACHE') && 'on' == strtolower($environmentService->get('TWIG_CACHE'))) {
|
if ($environmentService->has('TWIG_CACHE') && 'on' == strtolower($environmentService->get('TWIG_CACHE'))) {
|
||||||
$twigSettings['cache'] = $twigCachePath;
|
$twigSettings['cache'] = $twigCachePath;
|
||||||
|
@ -215,7 +200,7 @@ class App
|
||||||
|
|
||||||
if (!(new Filesystem())->exists($twigCachePath)) {
|
if (!(new Filesystem())->exists($twigCachePath)) {
|
||||||
try {
|
try {
|
||||||
(new Filesystem())->mkdir($twigCachePath, 0777);
|
(new Filesystem())->mkdir($twigCachePath, 0o777);
|
||||||
} catch (IOException $IOException) {
|
} catch (IOException $IOException) {
|
||||||
unset($twigSettings['cache']);
|
unset($twigSettings['cache']);
|
||||||
if (!in_array(PHP_SAPI, ['cli', 'phpdbg'], true)) {
|
if (!in_array(PHP_SAPI, ['cli', 'phpdbg'], true)) {
|
||||||
|
@ -245,7 +230,7 @@ class App
|
||||||
$twig->addExtension(new Twig\Extension\DebugExtension());
|
$twig->addExtension(new Twig\Extension\DebugExtension());
|
||||||
|
|
||||||
// Add Twig extension to integrate Kint
|
// Add Twig extension to integrate Kint
|
||||||
$twig->addExtension(new \Kint\Twig\TwigExtension());
|
$twig->addExtension(new TwigExtension());
|
||||||
|
|
||||||
// Add Twig extension to check if something is an instance of a known class or entity
|
// Add Twig extension to check if something is an instance of a known class or entity
|
||||||
$twig->addExtension(new Extensions\InstanceOfExtension());
|
$twig->addExtension(new Extensions\InstanceOfExtension());
|
||||||
|
@ -267,9 +252,7 @@ class App
|
||||||
});
|
});
|
||||||
|
|
||||||
// This is required as some plugins for Slim expect there to be a twig available as "view"
|
// This is required as some plugins for Slim expect there to be a twig available as "view"
|
||||||
$container->set('view', function (Slim\Views\Twig $twig) {
|
$container->set('view', fn (Slim\Views\Twig $twig) => $twig);
|
||||||
return $twig;
|
|
||||||
});
|
|
||||||
|
|
||||||
$container->set(Translation\Translator::class, function (SessionService $sessionService) {
|
$container->set(Translation\Translator::class, function (SessionService $sessionService) {
|
||||||
$selectedLanguage = $sessionService->has('Language') ? $sessionService->get('Language') : 'en_US';
|
$selectedLanguage = $sessionService->has('Language') ? $sessionService->get('Language') : 'en_US';
|
||||||
|
@ -286,7 +269,7 @@ class App
|
||||||
$translator->addLoader('yaml', $yamlLoader);
|
$translator->addLoader('yaml', $yamlLoader);
|
||||||
|
|
||||||
// add some resources to the translator
|
// add some resources to the translator
|
||||||
$translator->addResource('yaml', APP_ROOT."/src/Strings/{$selectedLanguage}.yaml", $selectedLanguage);
|
$translator->addResource('yaml', APP_ROOT . "/src/Strings/{$selectedLanguage}.yaml", $selectedLanguage);
|
||||||
|
|
||||||
return $translator;
|
return $translator;
|
||||||
});
|
});
|
||||||
|
@ -298,7 +281,7 @@ class App
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
$container->set(\Faker\Generator::class, function () {
|
$container->set(Generator::class, function () {
|
||||||
$faker = FakerFactory::create();
|
$faker = FakerFactory::create();
|
||||||
$faker->addProvider(new Provider\Base($faker));
|
$faker->addProvider(new Provider\Base($faker));
|
||||||
$faker->addProvider(new Provider\DateTime($faker));
|
$faker->addProvider(new Provider\DateTime($faker));
|
||||||
|
@ -339,7 +322,7 @@ class App
|
||||||
$container->set('MonologFormatter', function (EnvironmentService $environmentService) {
|
$container->set('MonologFormatter', function (EnvironmentService $environmentService) {
|
||||||
return new LineFormatter(
|
return new LineFormatter(
|
||||||
// the default output format is "[%datetime%] %channel%.%level_name%: %message% %context% %extra%"
|
// the default output format is "[%datetime%] %channel%.%level_name%: %message% %context% %extra%"
|
||||||
$environmentService->get('MONOLOG_FORMAT', '[%datetime%] %channel%.%level_name%: %message% %context% %extra%')."\n",
|
$environmentService->get('MONOLOG_FORMAT', '[%datetime%] %channel%.%level_name%: %message% %context% %extra%') . "\n",
|
||||||
'Y n j, g:i a'
|
'Y n j, g:i a'
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
@ -361,11 +344,11 @@ class App
|
||||||
)));
|
)));
|
||||||
|
|
||||||
// Configure a pretty CLI Handler
|
// Configure a pretty CLI Handler
|
||||||
$cliHandler = new StreamHandler('php://stdout', Logger::DEBUG);
|
$cliHandler = new StreamHandler('php://stdout', Logger::DEBUG);
|
||||||
$cliFormatter = new ColoredLineFormatter(
|
$cliFormatter = new ColoredLineFormatter(
|
||||||
new TrafficLight(),
|
new TrafficLight(),
|
||||||
// the default output format is "[%datetime%] %channel%.%level_name%: %message% %context% %extra%"
|
// the default output format is "[%datetime%] %channel%.%level_name%: %message% %context% %extra%"
|
||||||
$environmentService->get('MONOLOG_FORMAT', '[%datetime%] %level_name%: %message%')."\n",
|
$environmentService->get('MONOLOG_FORMAT', '[%datetime%] %level_name%: %message%') . "\n",
|
||||||
'g:i'
|
'g:i'
|
||||||
);
|
);
|
||||||
$cliHandler->setFormatter($cliFormatter);
|
$cliHandler->setFormatter($cliFormatter);
|
||||||
|
@ -392,9 +375,7 @@ class App
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
$container->set(TrailingSlash::class, function () {
|
$container->set(TrailingSlash::class, fn () => (new TrailingSlash())->redirect());
|
||||||
return (new TrailingSlash())->redirect();
|
|
||||||
});
|
|
||||||
|
|
||||||
$container->set(DebugBar::class, function (Logger $logger) {
|
$container->set(DebugBar::class, function (Logger $logger) {
|
||||||
return (new DebugBar())
|
return (new DebugBar())
|
||||||
|
@ -414,7 +395,7 @@ class App
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
$this->environmentService = $container->get(Services\EnvironmentService::class);
|
$this->environmentService = $container->get(EnvironmentService::class);
|
||||||
if ($this->environmentService->has('TIMEZONE')) {
|
if ($this->environmentService->has('TIMEZONE')) {
|
||||||
date_default_timezone_set($this->environmentService->get('TIMEZONE'));
|
date_default_timezone_set($this->environmentService->get('TIMEZONE'));
|
||||||
} elseif ((new Filesystem())->exists('/etc/timezone')) {
|
} elseif ((new Filesystem())->exists('/etc/timezone')) {
|
||||||
|
@ -434,11 +415,11 @@ class App
|
||||||
// Middlewares
|
// Middlewares
|
||||||
$this->app->addBodyParsingMiddleware();
|
$this->app->addBodyParsingMiddleware();
|
||||||
// $this->app->add($container->get(\Middlewares\Geolocation::class));
|
// $this->app->add($container->get(\Middlewares\Geolocation::class));
|
||||||
$this->app->add($container->get(\Middlewares\TrailingSlash::class));
|
$this->app->add($container->get(TrailingSlash::class));
|
||||||
// $this->app->add($container->get(\Middlewares\Whoops::class));
|
// $this->app->add($container->get(\Middlewares\Whoops::class));
|
||||||
// $this->app->add($container->get(\Middlewares\Minifier::class));
|
// $this->app->add($container->get(\Middlewares\Minifier::class));
|
||||||
// $this->app->add($container->get(\Middlewares\GzipEncoder::class));
|
// $this->app->add($container->get(\Middlewares\GzipEncoder::class));
|
||||||
$this->app->add($container->get(\Middlewares\ContentLength::class));
|
$this->app->add($container->get(ContentLength::class));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -453,7 +434,7 @@ class App
|
||||||
$tempApp = new $calledClass();
|
$tempApp = new $calledClass();
|
||||||
|
|
||||||
/** @var ConfigurationService $config */
|
/** @var ConfigurationService $config */
|
||||||
$config = $tempApp->get(ConfigurationService::class);
|
$config = $tempApp->get(ConfigurationService::class);
|
||||||
$configCoreClass = $config->getCore();
|
$configCoreClass = $config->getCore();
|
||||||
if ($configCoreClass != get_called_class()) {
|
if ($configCoreClass != get_called_class()) {
|
||||||
self::$instance = new $configCoreClass();
|
self::$instance = new $configCoreClass();
|
||||||
|
@ -499,7 +480,7 @@ class App
|
||||||
public function runHttp(): void
|
public function runHttp(): void
|
||||||
{
|
{
|
||||||
$serverRequestCreator = ServerRequestCreatorFactory::create();
|
$serverRequestCreator = ServerRequestCreatorFactory::create();
|
||||||
$request = $serverRequestCreator->createServerRequestFromGlobals();
|
$request = $serverRequestCreator->createServerRequestFromGlobals();
|
||||||
|
|
||||||
$this->loadAllRoutes($request);
|
$this->loadAllRoutes($request);
|
||||||
|
|
||||||
|
@ -532,7 +513,7 @@ class App
|
||||||
public function addSupportedLanguage(string $supportedLanguage): self
|
public function addSupportedLanguage(string $supportedLanguage): self
|
||||||
{
|
{
|
||||||
$this->supportedLanguages[] = $supportedLanguage;
|
$this->supportedLanguages[] = $supportedLanguage;
|
||||||
$this->supportedLanguages = array_unique($this->supportedLanguages);
|
$this->supportedLanguages = array_unique($this->supportedLanguages);
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
@ -573,7 +554,7 @@ class App
|
||||||
$this->interrogateControllers();
|
$this->interrogateControllers();
|
||||||
$this->debugBar['time']->stopMeasure('interrogateControllers');
|
$this->debugBar['time']->stopMeasure('interrogateControllers');
|
||||||
|
|
||||||
$timeToBootstrapMs = (microtime(true) - $_SERVER['REQUEST_TIME_FLOAT']) * 1000;
|
$timeToBootstrapMs = (microtime(true) - $_SERVER['REQUEST_TIME_FLOAT']) * 1000;
|
||||||
$bootstrapTooLongThresholdMs = 300;
|
$bootstrapTooLongThresholdMs = 300;
|
||||||
if ($timeToBootstrapMs >= $bootstrapTooLongThresholdMs && php_sapi_name() != 'cli') {
|
if ($timeToBootstrapMs >= $bootstrapTooLongThresholdMs && php_sapi_name() != 'cli') {
|
||||||
$this->logger->warning(sprintf('Bootstrap complete in %sms which is more than the threshold of %sms', number_format($timeToBootstrapMs, 2), $bootstrapTooLongThresholdMs));
|
$this->logger->warning(sprintf('Bootstrap complete in %sms which is more than the threshold of %sms', number_format($timeToBootstrapMs, 2), $bootstrapTooLongThresholdMs));
|
||||||
|
@ -586,7 +567,7 @@ class App
|
||||||
|
|
||||||
protected function interrogateTranslations(): void
|
protected function interrogateTranslations(): void
|
||||||
{
|
{
|
||||||
$stringPath = APP_ROOT.'/src/Strings';
|
$stringPath = APP_ROOT . '/src/Strings';
|
||||||
if (!(new Filesystem())->exists($stringPath)) {
|
if (!(new Filesystem())->exists($stringPath)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -615,7 +596,7 @@ class App
|
||||||
$appClass = new \ReflectionClass(static::class);
|
$appClass = new \ReflectionClass(static::class);
|
||||||
$this->router->loadRoutesFromAnnotations(
|
$this->router->loadRoutesFromAnnotations(
|
||||||
[
|
[
|
||||||
APP_ROOT.'/src/Controllers',
|
APP_ROOT . '/src/Controllers',
|
||||||
],
|
],
|
||||||
$appClass->getNamespaceName()
|
$appClass->getNamespaceName()
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Controllers;
|
namespace Benzine\Controllers;
|
||||||
|
|
||||||
use Benzine\Controllers\Filters\Filter;
|
use Benzine\Controllers\Filters\Filter;
|
||||||
|
@ -17,8 +19,7 @@ abstract class AbstractController
|
||||||
public function __construct(
|
public function __construct(
|
||||||
protected Logger $logger,
|
protected Logger $logger,
|
||||||
protected CacheProvider $cacheProvider
|
protected CacheProvider $cacheProvider
|
||||||
) {
|
) {}
|
||||||
}
|
|
||||||
|
|
||||||
public function xmlResponse(\SimpleXMLElement $root, Request $request, Response $response): Response
|
public function xmlResponse(\SimpleXMLElement $root, Request $request, Response $response): Response
|
||||||
{
|
{
|
||||||
|
@ -69,7 +70,7 @@ abstract class AbstractController
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new FilterDecodeException('Could not decode given Filter. Reason: Not JSON. Given: "'.$filterText.'"');
|
throw new FilterDecodeException('Could not decode given Filter. Reason: Not JSON. Given: "' . $filterText . '"');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,7 +104,7 @@ abstract class AbstractController
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate an etag
|
// Generate an etag
|
||||||
$etag = md5($filesystem->lastModified($filename).$filename);
|
$etag = md5($filesystem->lastModified($filename) . $filename);
|
||||||
$response = $this->cacheProvider->withEtag($response, $etag);
|
$response = $this->cacheProvider->withEtag($response, $etag);
|
||||||
|
|
||||||
// Detect mimetype for content-type header from file meta
|
// Detect mimetype for content-type header from file meta
|
||||||
|
@ -113,7 +114,7 @@ abstract class AbstractController
|
||||||
|
|
||||||
// No dice? Early-load the data and interrogate that for mimetype then I GUESS.
|
// No dice? Early-load the data and interrogate that for mimetype then I GUESS.
|
||||||
if (!$mimetype) {
|
if (!$mimetype) {
|
||||||
$data = $filesystem->read($filename);
|
$data = $filesystem->read($filename);
|
||||||
$mimetype = (new FinfoMimeTypeDetector())
|
$mimetype = (new FinfoMimeTypeDetector())
|
||||||
->detectMimeTypeFromBuffer($data)
|
->detectMimeTypeFromBuffer($data)
|
||||||
;
|
;
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Controllers;
|
namespace Benzine\Controllers;
|
||||||
|
|
||||||
use Benzine\ORM\Interfaces\ModelInterface;
|
use Benzine\ORM\Interfaces\ModelInterface;
|
||||||
|
@ -15,7 +17,7 @@ abstract class AbstractCrudController extends AbstractController
|
||||||
$service = $this->getService();
|
$service = $this->getService();
|
||||||
if ($this->requestHasFilters($request, $response)) {
|
if ($this->requestHasFilters($request, $response)) {
|
||||||
$filterBehaviours = $this->parseFilters($request, $response);
|
$filterBehaviours = $this->parseFilters($request, $response);
|
||||||
$foundObjects = $service->getAll(
|
$foundObjects = $service->getAll(
|
||||||
$filterBehaviours->getLimit(),
|
$filterBehaviours->getLimit(),
|
||||||
$filterBehaviours->getOffset(),
|
$filterBehaviours->getOffset(),
|
||||||
$filterBehaviours->getWheres(),
|
$filterBehaviours->getWheres(),
|
||||||
|
@ -32,8 +34,8 @@ abstract class AbstractCrudController extends AbstractController
|
||||||
|
|
||||||
return $this->jsonResponse(
|
return $this->jsonResponse(
|
||||||
[
|
[
|
||||||
'Status' => 'Okay',
|
'Status' => 'Okay',
|
||||||
'Action' => 'LIST',
|
'Action' => 'LIST',
|
||||||
$this->service->getTermPlural() => $objects,
|
$this->service->getTermPlural() => $objects,
|
||||||
],
|
],
|
||||||
$request,
|
$request,
|
||||||
|
@ -47,8 +49,8 @@ abstract class AbstractCrudController extends AbstractController
|
||||||
if ($object) {
|
if ($object) {
|
||||||
return $this->jsonResponse(
|
return $this->jsonResponse(
|
||||||
[
|
[
|
||||||
'Status' => 'Okay',
|
'Status' => 'Okay',
|
||||||
'Action' => 'GET',
|
'Action' => 'GET',
|
||||||
$this->service->getTermSingular() => $object->__toArray(),
|
$this->service->getTermSingular() => $object->__toArray(),
|
||||||
],
|
],
|
||||||
$request,
|
$request,
|
||||||
|
@ -79,8 +81,8 @@ abstract class AbstractCrudController extends AbstractController
|
||||||
|
|
||||||
return $this->jsonResponse(
|
return $this->jsonResponse(
|
||||||
[
|
[
|
||||||
'Status' => 'Okay',
|
'Status' => 'Okay',
|
||||||
'Action' => 'CREATE',
|
'Action' => 'CREATE',
|
||||||
$this->service->getTermSingular() => $object->__toArray(),
|
$this->service->getTermSingular() => $object->__toArray(),
|
||||||
],
|
],
|
||||||
$request,
|
$request,
|
||||||
|
@ -101,8 +103,8 @@ abstract class AbstractCrudController extends AbstractController
|
||||||
|
|
||||||
return $this->jsonResponse(
|
return $this->jsonResponse(
|
||||||
[
|
[
|
||||||
'Status' => 'Okay',
|
'Status' => 'Okay',
|
||||||
'Action' => 'DELETE',
|
'Action' => 'DELETE',
|
||||||
$this->service->getTermSingular() => $array,
|
$this->service->getTermSingular() => $array,
|
||||||
],
|
],
|
||||||
$request,
|
$request,
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Controllers;
|
namespace Benzine\Controllers;
|
||||||
|
|
||||||
use DebugBar\DebugBar;
|
use DebugBar\DebugBar;
|
||||||
|
@ -48,7 +50,7 @@ abstract class AbstractHTMLController extends AbstractController
|
||||||
)->withHeader('Content-Type', 'text/html');
|
)->withHeader('Content-Type', 'text/html');
|
||||||
|
|
||||||
$renderTimeLimitMs = 500;
|
$renderTimeLimitMs = 500;
|
||||||
$renderTimeMs = (microtime(true) - $renderStart) * 1000;
|
$renderTimeMs = (microtime(true) - $renderStart) * 1000;
|
||||||
|
|
||||||
if ($renderTimeMs >= $renderTimeLimitMs) {
|
if ($renderTimeMs >= $renderTimeLimitMs) {
|
||||||
$this->logger->debug(sprintf(
|
$this->logger->debug(sprintf(
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Controllers\Filters;
|
namespace Benzine\Controllers\Filters;
|
||||||
|
|
||||||
use Benzine\Exceptions\FilterDecodeException;
|
use Benzine\Exceptions\FilterDecodeException;
|
||||||
|
@ -20,8 +22,6 @@ class Filter
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws FilterDecodeException
|
* @throws FilterDecodeException
|
||||||
*
|
|
||||||
* @return Filter
|
|
||||||
*/
|
*/
|
||||||
public function setOrderDirection(string $orderDirection): self
|
public function setOrderDirection(string $orderDirection): self
|
||||||
{
|
{
|
||||||
|
@ -34,8 +34,6 @@ class Filter
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param $header
|
|
||||||
*
|
|
||||||
* @throws FilterDecodeException
|
* @throws FilterDecodeException
|
||||||
*/
|
*/
|
||||||
public function parseFromHeader($header): self
|
public function parseFromHeader($header): self
|
||||||
|
@ -75,11 +73,6 @@ class Filter
|
||||||
return $this->limit;
|
return $this->limit;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param mixed $limit
|
|
||||||
*
|
|
||||||
* @return Filter
|
|
||||||
*/
|
|
||||||
public function setLimit($limit): self
|
public function setLimit($limit): self
|
||||||
{
|
{
|
||||||
$this->limit = $limit;
|
$this->limit = $limit;
|
||||||
|
@ -92,11 +85,6 @@ class Filter
|
||||||
return $this->offset;
|
return $this->offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param mixed $offset
|
|
||||||
*
|
|
||||||
* @return Filter
|
|
||||||
*/
|
|
||||||
public function setOffset($offset): self
|
public function setOffset($offset): self
|
||||||
{
|
{
|
||||||
$this->offset = $offset;
|
$this->offset = $offset;
|
||||||
|
@ -109,11 +97,6 @@ class Filter
|
||||||
return $this->wheres;
|
return $this->wheres;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param mixed $wheres
|
|
||||||
*
|
|
||||||
* @return Filter
|
|
||||||
*/
|
|
||||||
public function setWheres($wheres): self
|
public function setWheres($wheres): self
|
||||||
{
|
{
|
||||||
$this->wheres = $wheres;
|
$this->wheres = $wheres;
|
||||||
|
@ -126,11 +109,6 @@ class Filter
|
||||||
return $this->order;
|
return $this->order;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param mixed $order
|
|
||||||
*
|
|
||||||
* @return Filter
|
|
||||||
*/
|
|
||||||
public function setOrder($order): self
|
public function setOrder($order): self
|
||||||
{
|
{
|
||||||
$this->order = $order;
|
$this->order = $order;
|
||||||
|
|
|
@ -1,17 +1,19 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Controllers\Filters;
|
namespace Benzine\Controllers\Filters;
|
||||||
|
|
||||||
class FilterCondition
|
class FilterCondition
|
||||||
{
|
{
|
||||||
public const CONDITION_EQUAL = '=';
|
public const CONDITION_EQUAL = '=';
|
||||||
public const CONDITION_NOT_EQUAL = '!=';
|
public const CONDITION_NOT_EQUAL = '!=';
|
||||||
public const CONDITION_GREATER_THAN = '>';
|
public const CONDITION_GREATER_THAN = '>';
|
||||||
public const CONDITION_LESS_THAN = '<';
|
public const CONDITION_LESS_THAN = '<';
|
||||||
public const CONDITION_GREATER_THAN_OR_EQUAL = '>=';
|
public const CONDITION_GREATER_THAN_OR_EQUAL = '>=';
|
||||||
public const CONDITION_LESS_THAN_OR_EQUAL = '<=';
|
public const CONDITION_LESS_THAN_OR_EQUAL = '<=';
|
||||||
public const CONDITION_LIKE = 'LIKE';
|
public const CONDITION_LIKE = 'LIKE';
|
||||||
public const CONDITION_NOT_LIKE = 'NOT LIKE';
|
public const CONDITION_NOT_LIKE = 'NOT LIKE';
|
||||||
public const CONDITION_IN = 'IN';
|
public const CONDITION_IN = 'IN';
|
||||||
public const CONDITION_NOT_IN = 'NOT IN';
|
public const CONDITION_NOT_IN = 'NOT IN';
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Exceptions;
|
namespace Benzine\Exceptions;
|
||||||
|
|
||||||
class BenzineConfigurationException extends BenzineException
|
class BenzineConfigurationException extends BenzineException {}
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Exceptions;
|
namespace Benzine\Exceptions;
|
||||||
|
|
||||||
class BenzineException extends \Exception
|
class BenzineException extends \Exception {}
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Exceptions;
|
namespace Benzine\Exceptions;
|
||||||
|
|
||||||
class DbConfigException extends BenzineException
|
class DbConfigException extends BenzineException {}
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Exceptions;
|
namespace Benzine\Exceptions;
|
||||||
|
|
||||||
class DbRuntimeException extends BenzineException
|
class DbRuntimeException extends BenzineException {}
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Exceptions;
|
namespace Benzine\Exceptions;
|
||||||
|
|
||||||
class FilterDecodeException extends BenzineException
|
class FilterDecodeException extends BenzineException {}
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Exceptions;
|
namespace Benzine\Exceptions;
|
||||||
|
|
||||||
use Slim\Interfaces\ErrorRendererInterface;
|
use Slim\Interfaces\ErrorRendererInterface;
|
||||||
|
@ -10,8 +12,8 @@ class JsonErrorHandler implements ErrorRendererInterface
|
||||||
{
|
{
|
||||||
return json_encode([
|
return json_encode([
|
||||||
'error' => $exception->getMessage(),
|
'error' => $exception->getMessage(),
|
||||||
'where' => $exception->getFile().':'.$exception->getLine(),
|
'where' => $exception->getFile() . ':' . $exception->getLine(),
|
||||||
'code' => $exception->getCode(),
|
'code' => $exception->getCode(),
|
||||||
], JSON_PRETTY_PRINT);
|
], JSON_PRETTY_PRINT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Exceptions;
|
namespace Benzine\Exceptions;
|
||||||
|
|
||||||
class WorkerException extends BenzineException
|
class WorkerException extends BenzineException {}
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Guzzle;
|
namespace Benzine\Guzzle;
|
||||||
|
|
||||||
use Psr\Http\Message\ResponseInterface;
|
use Psr\Http\Message\ResponseInterface;
|
||||||
|
@ -9,8 +11,7 @@ class JsonResponse implements ResponseInterface
|
||||||
{
|
{
|
||||||
public function __construct(
|
public function __construct(
|
||||||
protected ResponseInterface $response
|
protected ResponseInterface $response
|
||||||
) {
|
) {}
|
||||||
}
|
|
||||||
|
|
||||||
public function json()
|
public function json()
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Middleware;
|
namespace Benzine\Middleware;
|
||||||
|
|
||||||
use Psr\Http\Message\ResponseInterface;
|
use Psr\Http\Message\ResponseInterface;
|
||||||
|
@ -18,10 +20,10 @@ class JsonResponseExecTimeMiddleware implements MiddlewareInterface
|
||||||
if ($responseJson === null) {
|
if ($responseJson === null) {
|
||||||
return $response;
|
return $response;
|
||||||
}
|
}
|
||||||
$memoryUsageBytes = memory_get_peak_usage();
|
$memoryUsageBytes = memory_get_peak_usage();
|
||||||
$responseJson['Exec'] = [
|
$responseJson['Exec'] = [
|
||||||
'TimeSeconds' => (float) number_format(microtime(true) - $_SERVER['REQUEST_TIME_FLOAT'], 5),
|
'TimeSeconds' => (float) number_format(microtime(true) - $_SERVER['REQUEST_TIME_FLOAT'], 5),
|
||||||
'MemoryBytes' => $memoryUsageBytes,
|
'MemoryBytes' => $memoryUsageBytes,
|
||||||
'MemoryMegaBytes' => (float) number_format($memoryUsageBytes / 1024 / 1024, 3),
|
'MemoryMegaBytes' => (float) number_format($memoryUsageBytes / 1024 / 1024, 3),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Middleware;
|
namespace Benzine\Middleware;
|
||||||
|
|
||||||
use Benzine\Annotations\JsonSchema;
|
use Benzine\Annotations\JsonSchema;
|
||||||
|
@ -49,15 +51,16 @@ class JsonValidationMiddleware implements MiddlewareInterface
|
||||||
try {
|
try {
|
||||||
// Validate it...
|
// Validate it...
|
||||||
$schema->in(json_decode($request->getBody()->getContents()));
|
$schema->in(json_decode($request->getBody()->getContents()));
|
||||||
|
|
||||||
// And if we get here, we're golden.
|
// And if we get here, we're golden.
|
||||||
return $handler->handle($request);
|
return $handler->handle($request);
|
||||||
} catch (Exception $exception) {
|
} catch (Exception $exception) {
|
||||||
// Whelp, we've failed validation, build a failure message.
|
// Whelp, we've failed validation, build a failure message.
|
||||||
$response = new Response();
|
$response = new Response();
|
||||||
$content = json_encode([
|
$content = json_encode([
|
||||||
'Status' => 'FAIL',
|
'Status' => 'FAIL',
|
||||||
'Reason' => "Invalid JSON, doesn't match schema!",
|
'Reason' => "Invalid JSON, doesn't match schema!",
|
||||||
'Error' => $exception->getMessage(),
|
'Error' => $exception->getMessage(),
|
||||||
], JSON_PRETTY_PRINT);
|
], JSON_PRETTY_PRINT);
|
||||||
|
|
||||||
$response->getBody()->write($content);
|
$response->getBody()->write($content);
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Models\Traits;
|
namespace Benzine\Models\Traits;
|
||||||
|
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Redis\Lua;
|
namespace Benzine\Redis\Lua;
|
||||||
|
|
||||||
use Benzine\Redis\Redis;
|
use Benzine\Redis\Redis;
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Redis\Lua;
|
namespace Benzine\Redis\Lua;
|
||||||
|
|
||||||
class SetIfHigher extends AbstractLuaExtension
|
class SetIfHigher extends AbstractLuaExtension
|
||||||
|
@ -7,16 +9,16 @@ class SetIfHigher extends AbstractLuaExtension
|
||||||
protected function getScript(): string
|
protected function getScript(): string
|
||||||
{
|
{
|
||||||
return <<<'LUA'
|
return <<<'LUA'
|
||||||
local c = tonumber(redis.call('get', KEYS[1]));
|
local c = tonumber(redis.call('get', KEYS[1]));
|
||||||
if c then
|
if c then
|
||||||
if tonumber(ARGV[1]) > c then
|
if tonumber(ARGV[1]) > c then
|
||||||
redis.call('set', KEYS[1], ARGV[1])
|
redis.call('set', KEYS[1], ARGV[1])
|
||||||
return tonumber(ARGV[1]) - c
|
return tonumber(ARGV[1]) - c
|
||||||
else
|
else
|
||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
return redis.call('set', KEYS[1], ARGV[1])
|
return redis.call('set', KEYS[1], ARGV[1])
|
||||||
end
|
end
|
||||||
LUA;
|
LUA;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Redis\Lua;
|
namespace Benzine\Redis\Lua;
|
||||||
|
|
||||||
class SetIfLower extends AbstractLuaExtension
|
class SetIfLower extends AbstractLuaExtension
|
||||||
|
@ -7,16 +9,16 @@ class SetIfLower extends AbstractLuaExtension
|
||||||
protected function getScript(): string
|
protected function getScript(): string
|
||||||
{
|
{
|
||||||
return <<<'LUA'
|
return <<<'LUA'
|
||||||
local c = tonumber(redis.call('get', KEYS[1]));
|
local c = tonumber(redis.call('get', KEYS[1]));
|
||||||
if c then
|
if c then
|
||||||
if tonumber(ARGV[1]) < c then
|
if tonumber(ARGV[1]) < c then
|
||||||
redis.call('set', KEYS[1], ARGV[1])
|
redis.call('set', KEYS[1], ARGV[1])
|
||||||
return tonumber(ARGV[1]) - c
|
return tonumber(ARGV[1]) - c
|
||||||
else
|
else
|
||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
return redis.call('set', KEYS[1], ARGV[1])
|
return redis.call('set', KEYS[1], ARGV[1])
|
||||||
end
|
end
|
||||||
LUA;
|
LUA;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Redis\Lua;
|
namespace Benzine\Redis\Lua;
|
||||||
|
|
||||||
class ZAddIfHigher extends AbstractLuaExtension
|
class ZAddIfHigher extends AbstractLuaExtension
|
||||||
|
@ -7,17 +9,17 @@ class ZAddIfHigher extends AbstractLuaExtension
|
||||||
protected function getScript(): string
|
protected function getScript(): string
|
||||||
{
|
{
|
||||||
return <<<'LUA'
|
return <<<'LUA'
|
||||||
local c = tonumber(redis.call('zscore', KEYS[1], ARGV[1]));
|
local c = tonumber(redis.call('zscore', KEYS[1], ARGV[1]));
|
||||||
if c then
|
if c then
|
||||||
if tonumber(KEYS[2]) > c then
|
if tonumber(KEYS[2]) > c then
|
||||||
redis.call('zadd', KEYS[1], KEYS[2], ARGV[1])
|
redis.call('zadd', KEYS[1], KEYS[2], ARGV[1])
|
||||||
return tonumber(KEYS[2]) - c
|
return tonumber(KEYS[2]) - c
|
||||||
else
|
else
|
||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
redis.call('zadd', KEYS[1], KEYS[2], ARGV[1])
|
redis.call('zadd', KEYS[1], KEYS[2], ARGV[1])
|
||||||
return 'OK'
|
return 'OK'
|
||||||
end
|
end
|
||||||
LUA;
|
LUA;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Redis\Lua;
|
namespace Benzine\Redis\Lua;
|
||||||
|
|
||||||
class ZAddIfLower extends AbstractLuaExtension
|
class ZAddIfLower extends AbstractLuaExtension
|
||||||
|
@ -7,17 +9,17 @@ class ZAddIfLower extends AbstractLuaExtension
|
||||||
protected function getScript(): string
|
protected function getScript(): string
|
||||||
{
|
{
|
||||||
return <<<'LUA'
|
return <<<'LUA'
|
||||||
local c = tonumber(redis.call('zscore', KEYS[1], ARGV[1]));
|
local c = tonumber(redis.call('zscore', KEYS[1], ARGV[1]));
|
||||||
if c then
|
if c then
|
||||||
if tonumber(KEYS[2]) < c then
|
if tonumber(KEYS[2]) < c then
|
||||||
redis.call('zadd', KEYS[1], KEYS[2], ARGV[1])
|
redis.call('zadd', KEYS[1], KEYS[2], ARGV[1])
|
||||||
return tonumber(KEYS[2]) - c
|
return tonumber(KEYS[2]) - c
|
||||||
else
|
else
|
||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
redis.call('zadd', KEYS[1], KEYS[2], ARGV[1])
|
redis.call('zadd', KEYS[1], KEYS[2], ARGV[1])
|
||||||
return 'OK'
|
return 'OK'
|
||||||
end
|
end
|
||||||
LUA;
|
LUA;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Redis;
|
namespace Benzine\Redis;
|
||||||
|
|
||||||
use Monolog\Logger;
|
use Monolog\Logger;
|
||||||
|
@ -230,14 +232,14 @@ class Redis
|
||||||
/** @var Lua\AbstractLuaExtension[] */
|
/** @var Lua\AbstractLuaExtension[] */
|
||||||
private array $scripts;
|
private array $scripts;
|
||||||
|
|
||||||
public function __construct(Logger $logger, string $host, int $port = 6379, string $password = null, float $timeout = 0.0)
|
public function __construct(Logger $logger, string $host, int $port = 6379, ?string $password = null, float $timeout = 0.0)
|
||||||
{
|
{
|
||||||
$this->logger = $logger;
|
$this->logger = $logger;
|
||||||
|
|
||||||
$this->host = $host;
|
$this->host = $host;
|
||||||
$this->port = $port;
|
$this->port = $port;
|
||||||
$this->password = $password;
|
$this->password = $password;
|
||||||
$this->timeout = $timeout;
|
$this->timeout = $timeout;
|
||||||
|
|
||||||
$this->redis = new \Redis();
|
$this->redis = new \Redis();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,14 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Router;
|
namespace Benzine\Router;
|
||||||
|
|
||||||
use Slim\App;
|
use Slim\App;
|
||||||
|
|
||||||
class Route
|
class Route
|
||||||
{
|
{
|
||||||
public const ACCESS_PUBLIC = 'public';
|
public const ACCESS_PUBLIC = 'public';
|
||||||
public const ACCESS_PRIVATE = 'private';
|
public const ACCESS_PRIVATE = 'private';
|
||||||
|
|
||||||
public const ARGUMENT_ACCESS = '_access';
|
public const ARGUMENT_ACCESS = '_access';
|
||||||
|
@ -19,7 +21,7 @@ class Route
|
||||||
protected $routerPattern;
|
protected $routerPattern;
|
||||||
protected $httpEndpoint;
|
protected $httpEndpoint;
|
||||||
protected $httpMethod = 'GET';
|
protected $httpMethod = 'GET';
|
||||||
protected $weight = 0;
|
protected $weight = 0;
|
||||||
protected $singular;
|
protected $singular;
|
||||||
protected $plural;
|
protected $plural;
|
||||||
protected $properties;
|
protected $properties;
|
||||||
|
@ -28,7 +30,7 @@ class Route
|
||||||
protected $exampleEntity;
|
protected $exampleEntity;
|
||||||
protected $exampleEntityFinderFunction;
|
protected $exampleEntityFinderFunction;
|
||||||
protected array $callbackProperties = [];
|
protected array $callbackProperties = [];
|
||||||
protected array $arguments = [
|
protected array $arguments = [
|
||||||
self::ARGUMENT_ACCESS => self::ACCESS_PUBLIC,
|
self::ARGUMENT_ACCESS => self::ACCESS_PUBLIC,
|
||||||
];
|
];
|
||||||
protected array $validDomains = [];
|
protected array $validDomains = [];
|
||||||
|
@ -49,7 +51,6 @@ class Route
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param $name
|
|
||||||
* @param null $default
|
* @param null $default
|
||||||
*
|
*
|
||||||
* @return $this
|
* @return $this
|
||||||
|
@ -58,21 +59,21 @@ class Route
|
||||||
{
|
{
|
||||||
return $this->populateCallbackProperty($name, [
|
return $this->populateCallbackProperty($name, [
|
||||||
'isMandatory' => $mandatory,
|
'isMandatory' => $mandatory,
|
||||||
'default' => $default,
|
'default' => $default,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function populateCallbackProperty(string $name, array $property)
|
public function populateCallbackProperty(string $name, array $property)
|
||||||
{
|
{
|
||||||
$property['name'] = $name;
|
$property['name'] = $name;
|
||||||
$this->callbackProperties[$name] = array_merge(
|
$this->callbackProperties[$name] = array_merge(
|
||||||
[
|
[
|
||||||
'in' => null,
|
'in' => null,
|
||||||
'description' => null,
|
'description' => null,
|
||||||
'isMandatory' => null,
|
'isMandatory' => null,
|
||||||
'default' => null,
|
'default' => null,
|
||||||
'type' => null,
|
'type' => null,
|
||||||
'examples' => [],
|
'examples' => [],
|
||||||
],
|
],
|
||||||
$property
|
$property
|
||||||
);
|
);
|
||||||
|
@ -100,7 +101,7 @@ class Route
|
||||||
if (is_numeric($name)) {
|
if (is_numeric($name)) {
|
||||||
$this->properties[] = $type;
|
$this->properties[] = $type;
|
||||||
} else {
|
} else {
|
||||||
$this->properties[] = $name;
|
$this->properties[] = $name;
|
||||||
$this->propertyData[$name]['type'] = $type;
|
$this->propertyData[$name]['type'] = $type;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -109,15 +110,13 @@ class Route
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param mixed $propertyOptions
|
|
||||||
*
|
|
||||||
* @return Route
|
* @return Route
|
||||||
*/
|
*/
|
||||||
public function setPropertyOptions($propertyOptions)
|
public function setPropertyOptions($propertyOptions)
|
||||||
{
|
{
|
||||||
$this->propertyOptions = [];
|
$this->propertyOptions = [];
|
||||||
foreach ($propertyOptions as $name => $options) {
|
foreach ($propertyOptions as $name => $options) {
|
||||||
$this->propertyOptions[$name] = $options;
|
$this->propertyOptions[$name] = $options;
|
||||||
$this->propertyData[$name]['options'] = $options;
|
$this->propertyData[$name]['options'] = $options;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -166,7 +165,7 @@ class Route
|
||||||
|
|
||||||
public function setArgument(string $argument, $value): Route
|
public function setArgument(string $argument, $value): Route
|
||||||
{
|
{
|
||||||
$argument = $this->prefixArgumentKey($argument);
|
$argument = $this->prefixArgumentKey($argument);
|
||||||
$this->arguments[$argument] = $value;
|
$this->arguments[$argument] = $value;
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
|
@ -322,8 +321,6 @@ class Route
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param mixed $exampleEntity
|
|
||||||
*
|
|
||||||
* @return Route
|
* @return Route
|
||||||
*/
|
*/
|
||||||
public function setExampleEntity($exampleEntity)
|
public function setExampleEntity($exampleEntity)
|
||||||
|
@ -339,8 +336,6 @@ class Route
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param mixed $exampleEntityFinderFunction
|
|
||||||
*
|
|
||||||
* @return Route
|
* @return Route
|
||||||
*/
|
*/
|
||||||
public function setExampleEntityFinderFunction($exampleEntityFinderFunction)
|
public function setExampleEntityFinderFunction($exampleEntityFinderFunction)
|
||||||
|
@ -389,7 +384,7 @@ class Route
|
||||||
return count($this->validDomains) > 0;
|
return count($this->validDomains) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function isInContainedInValidDomains(string $host = null): bool
|
public function isInContainedInValidDomains(?string $host = null): bool
|
||||||
{
|
{
|
||||||
if (null === $host) {
|
if (null === $host) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -413,7 +408,7 @@ class Route
|
||||||
|
|
||||||
private function prefixArgumentKey(string $key)
|
private function prefixArgumentKey(string $key)
|
||||||
{
|
{
|
||||||
if (0 !== strpos($key, '_')) {
|
if (!str_starts_with($key, '_')) {
|
||||||
$key = "_{$key}";
|
$key = "_{$key}";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Router;
|
namespace Benzine\Router;
|
||||||
|
|
||||||
use Cache\Adapter\Chain\CachePoolChain;
|
use Cache\Adapter\Chain\CachePoolChain;
|
||||||
|
@ -22,13 +24,13 @@ class Router
|
||||||
|
|
||||||
public function __construct(Logger $logger, CachePoolChain $cachePoolChain)
|
public function __construct(Logger $logger, CachePoolChain $cachePoolChain)
|
||||||
{
|
{
|
||||||
$this->logger = $logger;
|
$this->logger = $logger;
|
||||||
$this->cachePoolChain = $cachePoolChain;
|
$this->cachePoolChain = $cachePoolChain;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function loadRoutesFromAnnotations(
|
public function loadRoutesFromAnnotations(
|
||||||
array $controllerPaths,
|
array $controllerPaths,
|
||||||
string $baseNamespace = null
|
?string $baseNamespace = null
|
||||||
): void {
|
): void {
|
||||||
AnnotationRegistry::registerLoader('class_exists');
|
AnnotationRegistry::registerLoader('class_exists');
|
||||||
|
|
||||||
|
@ -39,15 +41,15 @@ class Router
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
$dirIterator = new \RecursiveDirectoryIterator($controllerPath);
|
$dirIterator = new \RecursiveDirectoryIterator($controllerPath);
|
||||||
$iteratorIterator = new \RecursiveIteratorIterator($dirIterator);
|
$iteratorIterator = new \RecursiveIteratorIterator($dirIterator);
|
||||||
$phpFiles = new \RegexIterator($iteratorIterator, '/^.+\.php$/i', \RecursiveRegexIterator::GET_MATCH);
|
$phpFiles = new \RegexIterator($iteratorIterator, '/^.+\.php$/i', \RecursiveRegexIterator::GET_MATCH);
|
||||||
|
|
||||||
foreach ($phpFiles as $controllerFile) {
|
foreach ($phpFiles as $controllerFile) {
|
||||||
$fileClassName = ltrim(str_replace([$controllerPath, '/', '.php'], ['', '\\', ''], $controllerFile[0]), '\\');
|
$fileClassName = ltrim(str_replace([$controllerPath, '/', '.php'], ['', '\\', ''], $controllerFile[0]), '\\');
|
||||||
$expectedClasses = [
|
$expectedClasses = [
|
||||||
$baseNamespace.'\\Controllers\\'.$fileClassName,
|
$baseNamespace . '\\Controllers\\' . $fileClassName,
|
||||||
'Benzine\\Controllers\\'.$fileClassName,
|
'Benzine\\Controllers\\' . $fileClassName,
|
||||||
];
|
];
|
||||||
|
|
||||||
foreach ($expectedClasses as $expectedClass) {
|
foreach ($expectedClasses as $expectedClass) {
|
||||||
|
@ -82,8 +84,8 @@ class Router
|
||||||
|
|
||||||
$newRoute
|
$newRoute
|
||||||
->setHttpMethod($httpMethod)
|
->setHttpMethod($httpMethod)
|
||||||
->setRouterPattern('/'.ltrim($routeAnnotation->path, '/'))
|
->setRouterPattern('/' . ltrim($routeAnnotation->path, '/'))
|
||||||
->setCallback($expectedClass.':'.$method->name)
|
->setCallback($expectedClass . ':' . $method->name)
|
||||||
->setWeight($routeAnnotation->weight)
|
->setWeight($routeAnnotation->weight)
|
||||||
;
|
;
|
||||||
|
|
||||||
|
@ -101,7 +103,7 @@ class Router
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function populateRoutes(App $app, ServerRequestInterface $request = null): App
|
public function populateRoutes(App $app, ?ServerRequestInterface $request = null): App
|
||||||
{
|
{
|
||||||
if ($this->routesArePopulated) {
|
if ($this->routesArePopulated) {
|
||||||
return $app;
|
return $app;
|
||||||
|
@ -141,13 +143,13 @@ class Router
|
||||||
|
|
||||||
public function loadCache(): bool
|
public function loadCache(): bool
|
||||||
{
|
{
|
||||||
$time = microtime(true);
|
$time = microtime(true);
|
||||||
$cacheItem = $this->cachePoolChain->getItem('routes');
|
$cacheItem = $this->cachePoolChain->getItem('routes');
|
||||||
if (!$cacheItem || null === $cacheItem->get()) {
|
if (!$cacheItem || null === $cacheItem->get()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->routes = $cacheItem->get();
|
$this->routes = $cacheItem->get();
|
||||||
$timeToLoadFromCacheMs = (microtime(true) - $time) * 1000;
|
$timeToLoadFromCacheMs = (microtime(true) - $time) * 1000;
|
||||||
if ($timeToLoadFromCacheMs >= 500) {
|
if ($timeToLoadFromCacheMs >= 500) {
|
||||||
$this->logger->warning(sprintf('Loaded routes from Cache in %sms, which is slower than 500ms', number_format($timeToLoadFromCacheMs, 2)));
|
$this->logger->warning(sprintf('Loaded routes from Cache in %sms, which is slower than 500ms', number_format($timeToLoadFromCacheMs, 2)));
|
||||||
|
@ -168,13 +170,13 @@ class Router
|
||||||
$this->cachePoolChain->save($routeItem);
|
$this->cachePoolChain->save($routeItem);
|
||||||
// $this->logger->info('Cached router to cache pool');
|
// $this->logger->info('Cached router to cache pool');
|
||||||
} catch (CachePoolException $cachePoolException) {
|
} catch (CachePoolException $cachePoolException) {
|
||||||
$this->logger->critical('Cache Pool Exception: '.$cachePoolException->getMessage());
|
$this->logger->critical('Cache Pool Exception: ' . $cachePoolException->getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function weighRoutes(string $host = null): self
|
protected function weighRoutes(?string $host = null): self
|
||||||
{
|
{
|
||||||
$allocatedRoutes = [];
|
$allocatedRoutes = [];
|
||||||
if (is_array($this->routes) && count($this->routes) > 0) {
|
if (is_array($this->routes) && count($this->routes) > 0) {
|
||||||
|
@ -189,7 +191,7 @@ class Router
|
||||||
});
|
});
|
||||||
|
|
||||||
foreach ($this->routes as $index => $route) {
|
foreach ($this->routes as $index => $route) {
|
||||||
$routeKey = $route->getHttpMethod().$route->getRouterPattern();
|
$routeKey = $route->getHttpMethod() . $route->getRouterPattern();
|
||||||
if (!isset($allocatedRoutes[$routeKey]) && ($route->isInContainedInValidDomains($host) || !$route->hasValidDomains())) {
|
if (!isset($allocatedRoutes[$routeKey]) && ($route->isInContainedInValidDomains($host) || !$route->hasValidDomains())) {
|
||||||
$allocatedRoutes[$routeKey] = true;
|
$allocatedRoutes[$routeKey] = true;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Services;
|
namespace Benzine\Services;
|
||||||
|
|
||||||
use Benzine\App;
|
use Benzine\App;
|
||||||
|
@ -9,14 +11,14 @@ use Symfony\Component\Yaml\Yaml;
|
||||||
|
|
||||||
class ConfigurationService
|
class ConfigurationService
|
||||||
{
|
{
|
||||||
public const KEY_APP_NAME = 'application/name';
|
public const KEY_APP_NAME = 'application/name';
|
||||||
public const KEY_APP_ROOT = 'application/root';
|
public const KEY_APP_ROOT = 'application/root';
|
||||||
public const KEY_DEBUG_ENABLE = 'application/debug';
|
public const KEY_DEBUG_ENABLE = 'application/debug';
|
||||||
public const KEY_DEFAULT_ACCESS = 'application/default_access';
|
public const KEY_DEFAULT_ACCESS = 'application/default_access';
|
||||||
public const KEY_TIMEZONE = 'application/timezone';
|
public const KEY_TIMEZONE = 'application/timezone';
|
||||||
public const KEY_LOCALE = 'application/locale';
|
public const KEY_LOCALE = 'application/locale';
|
||||||
public const KEY_SESSION_ENABLED = 'application/session_enabled';
|
public const KEY_SESSION_ENABLED = 'application/session_enabled';
|
||||||
public const KEY_LOG_FORMAT_DATE = 'logging/format_date';
|
public const KEY_LOG_FORMAT_DATE = 'logging/format_date';
|
||||||
public const KEY_LOG_FORMAT_MESSAGE = 'logging/format_message';
|
public const KEY_LOG_FORMAT_MESSAGE = 'logging/format_message';
|
||||||
|
|
||||||
protected App $app;
|
protected App $app;
|
||||||
|
@ -28,9 +30,9 @@ class ConfigurationService
|
||||||
|
|
||||||
public function __construct(App $app, EnvironmentService $environmentService)
|
public function __construct(App $app, EnvironmentService $environmentService)
|
||||||
{
|
{
|
||||||
$this->app = $app;
|
$this->app = $app;
|
||||||
$this->environmentService = $environmentService;
|
$this->environmentService = $environmentService;
|
||||||
$this->findConfig();
|
$this->findConfig($this->environmentService->get('BENZINE_CONFIG_PATH', null));
|
||||||
$this->setupDefines();
|
$this->setupDefines();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,7 +44,7 @@ class ConfigurationService
|
||||||
/**
|
/**
|
||||||
* @return null|array|string
|
* @return null|array|string
|
||||||
*/
|
*/
|
||||||
public function get(string $key, string $defaultValue = null)
|
public function get(string $key, ?string $defaultValue = null)
|
||||||
{
|
{
|
||||||
$scope = $this->config;
|
$scope = $this->config;
|
||||||
foreach (explode('/', strtolower($key)) as $keyBit) {
|
foreach (explode('/', strtolower($key)) as $keyBit) {
|
||||||
|
@ -101,16 +103,16 @@ class ConfigurationService
|
||||||
/**
|
/**
|
||||||
* Locate .benzine.yml.
|
* Locate .benzine.yml.
|
||||||
*/
|
*/
|
||||||
protected function findConfig(string $path = null): bool
|
protected function findConfig(?string $path = null): bool
|
||||||
{
|
{
|
||||||
if (!$path) {
|
if (!$path) {
|
||||||
$path = getcwd();
|
$path = getcwd();
|
||||||
// $path = dirname($this->environmentService->get('SCRIPT_FILENAME'));
|
// $path = dirname($this->environmentService->get('SCRIPT_FILENAME'));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(new Filesystem())->exists($path.'/.benzine.yml')) {
|
if (!(new Filesystem())->exists($path . '/.benzine.yml')) {
|
||||||
$this->configNotFoundInPaths[] = $path;
|
$this->configNotFoundInPaths[] = $path;
|
||||||
$currentDirElem = explode(DIRECTORY_SEPARATOR, $path);
|
$currentDirElem = explode(DIRECTORY_SEPARATOR, $path);
|
||||||
array_pop($currentDirElem);
|
array_pop($currentDirElem);
|
||||||
$parentPath = implode(DIRECTORY_SEPARATOR, $currentDirElem);
|
$parentPath = implode(DIRECTORY_SEPARATOR, $currentDirElem);
|
||||||
|
|
||||||
|
@ -125,7 +127,7 @@ class ConfigurationService
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->parseFile($path.'/.benzine.yml');
|
$this->parseFile($path . '/.benzine.yml');
|
||||||
$this->appRoot = $path;
|
$this->appRoot = $path;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Services;
|
namespace Benzine\Services;
|
||||||
|
|
||||||
class EnvironmentService
|
class EnvironmentService
|
||||||
|
@ -24,7 +26,7 @@ class EnvironmentService
|
||||||
return $this->environmentVariables;
|
return $this->environmentVariables;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function get(string $key, string $default = null)
|
public function get(string $key, ?string $default = null)
|
||||||
{
|
{
|
||||||
if (isset($this->environmentVariables[$key])) {
|
if (isset($this->environmentVariables[$key])) {
|
||||||
return $this->environmentVariables[$key];
|
return $this->environmentVariables[$key];
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Services;
|
namespace Benzine\Services;
|
||||||
|
|
||||||
use Benzine\Redis\Redis;
|
use Benzine\Redis\Redis;
|
||||||
|
@ -17,7 +19,7 @@ class QueueService
|
||||||
Redis $redis,
|
Redis $redis,
|
||||||
Logger $logger
|
Logger $logger
|
||||||
) {
|
) {
|
||||||
$this->redis = $redis;
|
$this->redis = $redis;
|
||||||
$this->logger = $logger;
|
$this->logger = $logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,7 +32,7 @@ class QueueService
|
||||||
{
|
{
|
||||||
$this->redis->multi();
|
$this->redis->multi();
|
||||||
foreach ($queueItems as $item) {
|
foreach ($queueItems as $item) {
|
||||||
$itemId = UUID::v4();
|
$itemId = UUID::v4();
|
||||||
$serialised = serialize($item);
|
$serialised = serialize($item);
|
||||||
// Set the data element itself
|
// Set the data element itself
|
||||||
$this->redis->set("queue:data:{$queueName}:{$itemId}", $serialised);
|
$this->redis->set("queue:data:{$queueName}:{$itemId}", $serialised);
|
||||||
|
@ -110,7 +112,7 @@ class QueueService
|
||||||
$this->redis->get("queue:data:{$queueName}:{$itemId}");
|
$this->redis->get("queue:data:{$queueName}:{$itemId}");
|
||||||
$this->redis->del(["queue:data:{$queueName}:{$itemId}"]);
|
$this->redis->del(["queue:data:{$queueName}:{$itemId}"]);
|
||||||
$this->redis->decr("queue:length:{$queueName}");
|
$this->redis->decr("queue:length:{$queueName}");
|
||||||
$response = $this->redis->exec();
|
$response = $this->redis->exec();
|
||||||
$workerWorkItems[] = unserialize($response[0]);
|
$workerWorkItems[] = unserialize($response[0]);
|
||||||
}
|
}
|
||||||
if ($this->redis->get("queue:length:{$queueName}") <= 0) {
|
if ($this->redis->get("queue:length:{$queueName}") <= 0) {
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Services;
|
namespace Benzine\Services;
|
||||||
|
|
||||||
use Benzine\Redis\Redis;
|
use Benzine\Redis\Redis;
|
||||||
|
@ -10,7 +12,7 @@ class SessionService implements \SessionHandlerInterface
|
||||||
protected $oldID;
|
protected $oldID;
|
||||||
private ?bool $redisIsAvailable = null;
|
private ?bool $redisIsAvailable = null;
|
||||||
|
|
||||||
private int $lifetime = 43200;
|
private int $lifetime = 43200;
|
||||||
private array $dirtyCheck = [];
|
private array $dirtyCheck = [];
|
||||||
|
|
||||||
public function __construct(Redis $redis)
|
public function __construct(Redis $redis)
|
||||||
|
@ -87,8 +89,8 @@ class SessionService implements \SessionHandlerInterface
|
||||||
public function read($session_id)
|
public function read($session_id)
|
||||||
{
|
{
|
||||||
if ($this->useAPCU()) {
|
if ($this->useAPCU()) {
|
||||||
if (apcu_exists('read-'.$session_id)) {
|
if (apcu_exists('read-' . $session_id)) {
|
||||||
return apcu_fetch('read-'.$session_id);
|
return apcu_fetch('read-' . $session_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -110,9 +112,9 @@ class SessionService implements \SessionHandlerInterface
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->useAPCU()) {
|
if ($this->useAPCU()) {
|
||||||
apcu_store('read-'.$session_id, $result, 30);
|
apcu_store('read-' . $session_id, $result, 30);
|
||||||
} else {
|
} else {
|
||||||
$this->dirtyCheck['read-'.$session_id] = crc32($result);
|
$this->dirtyCheck['read-' . $session_id] = crc32($result);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $result;
|
return $result;
|
||||||
|
@ -127,9 +129,9 @@ class SessionService implements \SessionHandlerInterface
|
||||||
public function write($session_id, $session_data): bool
|
public function write($session_id, $session_data): bool
|
||||||
{
|
{
|
||||||
if ($this->useAPCU()) {
|
if ($this->useAPCU()) {
|
||||||
$dirty = crc32(apcu_fetch('read-'.$session_id)) != crc32($session_data);
|
$dirty = crc32(apcu_fetch('read-' . $session_id)) != crc32($session_data);
|
||||||
} else {
|
} else {
|
||||||
$dirty = $this->dirtyCheck['read-'.$session_id] != crc32($session_data);
|
$dirty = $this->dirtyCheck['read-' . $session_id] != crc32($session_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->useRedis() && $dirty) {
|
if ($this->useRedis() && $dirty) {
|
||||||
|
@ -138,7 +140,7 @@ class SessionService implements \SessionHandlerInterface
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->useAPCU()) {
|
if ($this->useAPCU()) {
|
||||||
apcu_store('read-'.$session_id, $session_data);
|
apcu_store('read-' . $session_id, $session_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Twig\Extensions;
|
namespace Benzine\Twig\Extensions;
|
||||||
|
|
||||||
use Twig\Extension\AbstractExtension;
|
use Twig\Extension\AbstractExtension;
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Twig\Extensions;
|
namespace Benzine\Twig\Extensions;
|
||||||
|
|
||||||
use Twig\Extension\AbstractExtension;
|
use Twig\Extension\AbstractExtension;
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Twig\Extensions;
|
namespace Benzine\Twig\Extensions;
|
||||||
|
|
||||||
use Twig\Extension\AbstractExtension;
|
use Twig\Extension\AbstractExtension;
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Twig\Extensions;
|
namespace Benzine\Twig\Extensions;
|
||||||
|
|
||||||
use MatthewBaggett\Inflection\Inflect;
|
use MatthewBaggett\Inflection\Inflect;
|
||||||
|
@ -10,13 +12,9 @@ class InflectionExtension extends AbstractExtension
|
||||||
{
|
{
|
||||||
public function getFilters()
|
public function getFilters()
|
||||||
{
|
{
|
||||||
$filters = [];
|
$filters = [];
|
||||||
$filters['pluralize'] = new TwigFilter('pluralize', function (string $word = null): string {
|
$filters['pluralize'] = new TwigFilter('pluralize', fn (?string $word = null): string => !empty($word) ? Inflect::pluralize($word) : '');
|
||||||
return !empty($word) ? Inflect::pluralize($word) : '';
|
$filters['singularize'] = new TwigFilter('singularize', fn (?string $word = null): string => !empty($word) ? Inflect::singularize($word) : '');
|
||||||
});
|
|
||||||
$filters['singularize'] = new TwigFilter('singularize', function (string $word = null): string {
|
|
||||||
return !empty($word) ? Inflect::singularize($word) : '';
|
|
||||||
});
|
|
||||||
|
|
||||||
return $filters;
|
return $filters;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Twig\Extensions;
|
namespace Benzine\Twig\Extensions;
|
||||||
|
|
||||||
use Twig\Extension\AbstractExtension;
|
use Twig\Extension\AbstractExtension;
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Twig\Extensions;
|
namespace Benzine\Twig\Extensions;
|
||||||
|
|
||||||
use Camel\CaseTransformer;
|
use Camel\CaseTransformer;
|
||||||
|
@ -22,12 +24,10 @@ class TransformExtension extends AbstractExtension
|
||||||
$filters = [];
|
$filters = [];
|
||||||
foreach ($this->transformers as $fromTransformer) {
|
foreach ($this->transformers as $fromTransformer) {
|
||||||
foreach ($this->transformers as $toTransformer) {
|
foreach ($this->transformers as $toTransformer) {
|
||||||
$name = 'transform_'.strtolower($fromTransformer).'_to_'.strtolower($toTransformer);
|
$name = 'transform_' . strtolower($fromTransformer) . '_to_' . strtolower($toTransformer);
|
||||||
$context = $this;
|
$context = $this;
|
||||||
$filters[$name] =
|
$filters[$name] =
|
||||||
new TwigFilter($name, function (string $word) use ($context, $fromTransformer, $toTransformer): string {
|
new TwigFilter($name, fn (string $word): string => $context->transform($word, $fromTransformer, $toTransformer));
|
||||||
return $context->transform($word, $fromTransformer, $toTransformer);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@ class TransformExtension extends AbstractExtension
|
||||||
public function transform($string, $from, $to)
|
public function transform($string, $from, $to)
|
||||||
{
|
{
|
||||||
$fromTransformer = $this->getTransformer($from);
|
$fromTransformer = $this->getTransformer($from);
|
||||||
$toTransformer = $this->getTransformer($to);
|
$toTransformer = $this->getTransformer($to);
|
||||||
|
|
||||||
$transformer = new CaseTransformer($fromTransformer, $toTransformer);
|
$transformer = new CaseTransformer($fromTransformer, $toTransformer);
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Twig\Extensions;
|
namespace Benzine\Twig\Extensions;
|
||||||
|
|
||||||
final class TransformExtensionException extends \Exception
|
final class TransformExtensionException extends \Exception {}
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Workers;
|
namespace Benzine\Workers;
|
||||||
|
|
||||||
abstract class AbstractForeverLoopWorker extends AbstractWorker implements WorkerInterface
|
abstract class AbstractForeverLoopWorker extends AbstractWorker implements WorkerInterface
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Workers;
|
namespace Benzine\Workers;
|
||||||
|
|
||||||
use Benzine\Services\EnvironmentService;
|
use Benzine\Services\EnvironmentService;
|
||||||
|
@ -117,7 +119,7 @@ abstract class AbstractQueueWorker extends AbstractWorker
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$items = $this->queueService->pop($this->inputQueue);
|
$items = $this->queueService->pop($this->inputQueue);
|
||||||
$this->resultItems = [];
|
$this->resultItems = [];
|
||||||
|
|
||||||
// If there are no items popped, return fast.
|
// If there are no items popped, return fast.
|
||||||
|
@ -144,9 +146,9 @@ abstract class AbstractQueueWorker extends AbstractWorker
|
||||||
$e->getMessage()
|
$e->getMessage()
|
||||||
),
|
),
|
||||||
[
|
[
|
||||||
'file' => $e->getFile(),
|
'file' => $e->getFile(),
|
||||||
'line' => $e->getLine(),
|
'line' => $e->getLine(),
|
||||||
'code' => $e->getCode(),
|
'code' => $e->getCode(),
|
||||||
'trace' => array_slice($e->getTrace(), 0, 5),
|
'trace' => array_slice($e->getTrace(), 0, 5),
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Workers;
|
namespace Benzine\Workers;
|
||||||
|
|
||||||
use Benzine\Services\EnvironmentService;
|
use Benzine\Services\EnvironmentService;
|
||||||
|
@ -10,13 +12,13 @@ abstract class AbstractWorker implements WorkerInterface
|
||||||
protected Logger $logger;
|
protected Logger $logger;
|
||||||
protected EnvironmentService $environmentService;
|
protected EnvironmentService $environmentService;
|
||||||
protected int $timeBetweenRuns = 5;
|
protected int $timeBetweenRuns = 5;
|
||||||
protected bool $stopOnZero = false;
|
protected bool $stopOnZero = false;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
Logger $logger,
|
Logger $logger,
|
||||||
EnvironmentService $environmentService
|
EnvironmentService $environmentService
|
||||||
) {
|
) {
|
||||||
$this->logger = $logger;
|
$this->logger = $logger;
|
||||||
$this->environmentService = $environmentService;
|
$this->environmentService = $environmentService;
|
||||||
$this->setUp();
|
$this->setUp();
|
||||||
$this->logger->info(
|
$this->logger->info(
|
||||||
|
@ -27,13 +29,8 @@ abstract class AbstractWorker implements WorkerInterface
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function setUp(): void
|
protected function setUp(): void {}
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param bool $stopOnZero
|
|
||||||
*/
|
|
||||||
public function setStopOnZero(bool $stopOnZero): self
|
public function setStopOnZero(bool $stopOnZero): self
|
||||||
{
|
{
|
||||||
$this->stopOnZero = $stopOnZero;
|
$this->stopOnZero = $stopOnZero;
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Workers;
|
namespace Benzine\Workers;
|
||||||
|
|
||||||
class ExampleQueueWorker extends AbstractQueueWorker
|
class ExampleQueueWorker extends AbstractQueueWorker
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Workers;
|
namespace Benzine\Workers;
|
||||||
|
|
||||||
use Benzine\Redis\Redis;
|
use Benzine\Redis\Redis;
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Workers;
|
namespace Benzine\Workers;
|
||||||
|
|
||||||
interface WorkerInterface
|
interface WorkerInterface
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Workers;
|
namespace Benzine\Workers;
|
||||||
|
|
||||||
use Benzine\Exceptions\WorkerException;
|
use Benzine\Exceptions\WorkerException;
|
||||||
|
@ -12,7 +14,7 @@ class WorkerWorkItem implements \Serializable
|
||||||
public function __call($name, $arguments)
|
public function __call($name, $arguments)
|
||||||
{
|
{
|
||||||
$method = substr(strtolower($name), 0, 3);
|
$method = substr(strtolower($name), 0, 3);
|
||||||
$field = substr(strtolower($name), 3);
|
$field = substr(strtolower($name), 3);
|
||||||
|
|
||||||
switch ($method) {
|
switch ($method) {
|
||||||
case 'set':
|
case 'set':
|
||||||
|
@ -40,7 +42,7 @@ class WorkerWorkItem implements \Serializable
|
||||||
|
|
||||||
public static function Factory(object $object)
|
public static function Factory(object $object)
|
||||||
{
|
{
|
||||||
$class = get_class($object);
|
$class = $object::class;
|
||||||
|
|
||||||
return (new WorkerWorkItem())
|
return (new WorkerWorkItem())
|
||||||
->setKey($class, $object)
|
->setKey($class, $object)
|
||||||
|
@ -52,9 +54,6 @@ class WorkerWorkItem implements \Serializable
|
||||||
return $this->data;
|
return $this->data;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @return WorkerWorkItem
|
|
||||||
*/
|
|
||||||
public function setData(array $data): self
|
public function setData(array $data): self
|
||||||
{
|
{
|
||||||
$this->data = $data;
|
$this->data = $data;
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Tests;
|
namespace Benzine\Tests;
|
||||||
|
|
||||||
use Faker\Factory as FakerFactory;
|
use Faker\Factory as FakerFactory;
|
||||||
|
@ -55,8 +57,8 @@ abstract class AbstractBaseTestCase extends AbstractTestCase
|
||||||
*/
|
*/
|
||||||
public function invokeMethod(&$object, $methodName, array $parameters = [])
|
public function invokeMethod(&$object, $methodName, array $parameters = [])
|
||||||
{
|
{
|
||||||
$reflection = new \ReflectionClass(get_class($object));
|
$reflection = new \ReflectionClass($object::class);
|
||||||
$method = $reflection->getMethod($methodName);
|
$method = $reflection->getMethod($methodName);
|
||||||
$method->setAccessible(true);
|
$method->setAccessible(true);
|
||||||
|
|
||||||
return $method->invokeArgs($object, $parameters);
|
return $method->invokeArgs($object, $parameters);
|
||||||
|
@ -64,8 +66,8 @@ abstract class AbstractBaseTestCase extends AbstractTestCase
|
||||||
|
|
||||||
public function setProtectedProperty(&$object, $property, $value)
|
public function setProtectedProperty(&$object, $property, $value)
|
||||||
{
|
{
|
||||||
$reflection = new \ReflectionClass(get_class($object));
|
$reflection = new \ReflectionClass($object::class);
|
||||||
$prop = $reflection->getProperty($property);
|
$prop = $reflection->getProperty($property);
|
||||||
$prop->setAccessible(true);
|
$prop->setAccessible(true);
|
||||||
|
|
||||||
return $prop->setValue($object, $value);
|
return $prop->setValue($object, $value);
|
||||||
|
@ -73,8 +75,8 @@ abstract class AbstractBaseTestCase extends AbstractTestCase
|
||||||
|
|
||||||
public function getProtectedProperty(&$object, $property)
|
public function getProtectedProperty(&$object, $property)
|
||||||
{
|
{
|
||||||
$reflection = new \ReflectionClass(get_class($object));
|
$reflection = new \ReflectionClass($object::class);
|
||||||
$prop = $reflection->getProperty($property);
|
$prop = $reflection->getProperty($property);
|
||||||
$prop->setAccessible(true);
|
$prop->setAccessible(true);
|
||||||
|
|
||||||
return $prop->getValue($object);
|
return $prop->getValue($object);
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Tests;
|
namespace Benzine\Tests;
|
||||||
|
|
||||||
use Benzine\Tests\Traits\AppTestTrait;
|
use Benzine\Tests\Traits\AppTestTrait;
|
||||||
|
@ -38,7 +40,7 @@ abstract class AbstractRoutesTestCase extends AbstractBaseTestCase
|
||||||
if ($isJsonRequest) {
|
if ($isJsonRequest) {
|
||||||
if ($dataOrPost !== null) {
|
if ($dataOrPost !== null) {
|
||||||
$dataOrPost = json_decode(json_encode($dataOrPost), true);
|
$dataOrPost = json_decode(json_encode($dataOrPost), true);
|
||||||
$request = $request->withParsedBody($dataOrPost);
|
$request = $request->withParsedBody($dataOrPost);
|
||||||
}
|
}
|
||||||
$request = $request->withHeader('Content-Type', 'application/json');
|
$request = $request->withHeader('Content-Type', 'application/json');
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Tests;
|
namespace Benzine\Tests;
|
||||||
|
|
||||||
use Benzine\App;
|
use Benzine\App;
|
||||||
|
@ -23,10 +25,10 @@ abstract class AbstractSeleniumTestCase extends AbstractBaseTestCase
|
||||||
{
|
{
|
||||||
parent::setUpBeforeClass();
|
parent::setUpBeforeClass();
|
||||||
|
|
||||||
self::$logger = App::DI(Logger::class);
|
self::$logger = App::DI(Logger::class);
|
||||||
self::$environmentService = App::DI(EnvironmentService::class);
|
self::$environmentService = App::DI(EnvironmentService::class);
|
||||||
|
|
||||||
$capabilities = [WebDriverCapabilityType::BROWSER_NAME => 'chrome'];
|
$capabilities = [WebDriverCapabilityType::BROWSER_NAME => 'chrome'];
|
||||||
self::$webDriver = RemoteWebDriver::create(
|
self::$webDriver = RemoteWebDriver::create(
|
||||||
sprintf(
|
sprintf(
|
||||||
'http://%s:%d/wd/hub',
|
'http://%s:%d/wd/hub',
|
||||||
|
@ -40,7 +42,7 @@ abstract class AbstractSeleniumTestCase extends AbstractBaseTestCase
|
||||||
|
|
||||||
self::$webDriver->manage()->timeouts()->implicitlyWait(3);
|
self::$webDriver->manage()->timeouts()->implicitlyWait(3);
|
||||||
|
|
||||||
self::$screenshotsDir = APP_ROOT.'/build/Screenshots/'.date('Y-m-d H-i-s').'/';
|
self::$screenshotsDir = APP_ROOT . '/build/Screenshots/' . date('Y-m-d H-i-s') . '/';
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function tearDownAfterClass(): void
|
public static function tearDownAfterClass(): void
|
||||||
|
@ -68,9 +70,9 @@ abstract class AbstractSeleniumTestCase extends AbstractBaseTestCase
|
||||||
protected function takeScreenshot($name): void
|
protected function takeScreenshot($name): void
|
||||||
{
|
{
|
||||||
if (!(new Filesystem())->exists(self::$screenshotsDir)) {
|
if (!(new Filesystem())->exists(self::$screenshotsDir)) {
|
||||||
(new Filesystem())->mkdir(self::$screenshotsDir, 0777);
|
(new Filesystem())->mkdir(self::$screenshotsDir, 0o777);
|
||||||
}
|
}
|
||||||
self::$webDriver->takeScreenshot(self::$screenshotsDir.self::$screenshotIndex."_{$name}.jpg");
|
self::$webDriver->takeScreenshot(self::$screenshotsDir . self::$screenshotIndex . "_{$name}.jpg");
|
||||||
++self::$screenshotIndex;
|
++self::$screenshotIndex;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Tests;
|
namespace Benzine\Tests;
|
||||||
|
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
|
@ -17,8 +19,8 @@ abstract class AbstractTestCase extends TestCase
|
||||||
public function setUp(): void
|
public function setUp(): void
|
||||||
{
|
{
|
||||||
parent::setUp();
|
parent::setUp();
|
||||||
$this->singleTestTime = microtime(true);
|
$this->singleTestTime = microtime(true);
|
||||||
$this->waypoint_count = 0;
|
$this->waypoint_count = 0;
|
||||||
$this->waypoint_last_time = $this->singleTestTime;
|
$this->waypoint_last_time = $this->singleTestTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,7 +29,7 @@ abstract class AbstractTestCase extends TestCase
|
||||||
parent::tearDown();
|
parent::tearDown();
|
||||||
if (defined('DEBUG') && DEBUG) {
|
if (defined('DEBUG') && DEBUG) {
|
||||||
$time = microtime(true) - $this->singleTestTime;
|
$time = microtime(true) - $this->singleTestTime;
|
||||||
echo ''.get_called_class().':'.$this->getName().': Took '.number_format($time, 3)." seconds\n\n";
|
echo '' . get_called_class() . ':' . $this->getName() . ': Took ' . number_format($time, 3) . " seconds\n\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,7 +37,7 @@ abstract class AbstractTestCase extends TestCase
|
||||||
{
|
{
|
||||||
if (defined('DEBUG') && DEBUG) {
|
if (defined('DEBUG') && DEBUG) {
|
||||||
$time_since_last_waypoint = number_format((microtime(true) - $this->waypoint_last_time) * 1000, 2, '.', '');
|
$time_since_last_waypoint = number_format((microtime(true) - $this->waypoint_last_time) * 1000, 2, '.', '');
|
||||||
$time_since_begin = number_format((microtime(true) - $this->singleTestTime) * 1000, 2, '.', '');
|
$time_since_begin = number_format((microtime(true) - $this->singleTestTime) * 1000, 2, '.', '');
|
||||||
++$this->waypoint_count;
|
++$this->waypoint_count;
|
||||||
if (1 == $this->waypoint_count) {
|
if (1 == $this->waypoint_count) {
|
||||||
echo "\n";
|
echo "\n";
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Tests\Traits;
|
namespace Benzine\Tests\Traits;
|
||||||
|
|
||||||
use Benzine\App as BenzineApp;
|
use Benzine\App as BenzineApp;
|
||||||
|
@ -30,9 +32,9 @@ trait AppTestTrait
|
||||||
*/
|
*/
|
||||||
protected function setupContainer(): void
|
protected function setupContainer(): void
|
||||||
{
|
{
|
||||||
$this->benzineApp = require __DIR__.'/../../../../../bootstrap.php';
|
$this->benzineApp = require __DIR__ . '/../../../../../bootstrap.php';
|
||||||
$this->slimApp = $this->benzineApp->getApp();
|
$this->slimApp = $this->benzineApp->getApp();
|
||||||
$container = $this->slimApp->getContainer();
|
$container = $this->slimApp->getContainer();
|
||||||
|
|
||||||
if ($container === null) {
|
if ($container === null) {
|
||||||
throw new \UnexpectedValueException('Container must be initialized');
|
throw new \UnexpectedValueException('Container must be initialized');
|
||||||
|
@ -41,7 +43,7 @@ trait AppTestTrait
|
||||||
$this->container = $container;
|
$this->container = $container;
|
||||||
|
|
||||||
$serverRequestCreator = ServerRequestCreatorFactory::create();
|
$serverRequestCreator = ServerRequestCreatorFactory::create();
|
||||||
$request = $serverRequestCreator->createServerRequestFromGlobals();
|
$request = $serverRequestCreator->createServerRequestFromGlobals();
|
||||||
|
|
||||||
$this->benzineApp->loadAllRoutes($request);
|
$this->benzineApp->loadAllRoutes($request);
|
||||||
}
|
}
|
||||||
|
@ -98,7 +100,7 @@ trait AppTestTrait
|
||||||
* @param string|UriInterface $uri The URI
|
* @param string|UriInterface $uri The URI
|
||||||
* @param null|array $data The json data
|
* @param null|array $data The json data
|
||||||
*/
|
*/
|
||||||
protected function createJsonRequest(string $method, $uri, array $data = null): ServerRequestInterface
|
protected function createJsonRequest(string $method, $uri, ?array $data = null): ServerRequestInterface
|
||||||
{
|
{
|
||||||
$request = $this->createRequest($method, $uri);
|
$request = $this->createRequest($method, $uri);
|
||||||
|
|
||||||
|
@ -116,7 +118,7 @@ trait AppTestTrait
|
||||||
* @param string|UriInterface $uri The URI
|
* @param string|UriInterface $uri The URI
|
||||||
* @param null|array $data The form data
|
* @param null|array $data The form data
|
||||||
*/
|
*/
|
||||||
protected function createFormRequest(string $method, $uri, array $data = null): ServerRequestInterface
|
protected function createFormRequest(string $method, $uri, ?array $data = null): ServerRequestInterface
|
||||||
{
|
{
|
||||||
$request = $this->createRequest($method, $uri);
|
$request = $this->createRequest($method, $uri);
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Tests\Traits;
|
namespace Benzine\Tests\Traits;
|
||||||
|
|
||||||
trait ArrayEquitabilityTrait
|
trait ArrayEquitabilityTrait
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Tests\Traits;
|
namespace Benzine\Tests\Traits;
|
||||||
|
|
||||||
use Slim\Container;
|
use Slim\Container;
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Tests\Traits;
|
namespace Benzine\Tests\Traits;
|
||||||
|
|
||||||
use Faker\Factory as FakerFactory;
|
use Faker\Factory as FakerFactory;
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
namespace Benzine\Tests\Traits;
|
namespace Benzine\Tests\Traits;
|
||||||
|
|
||||||
trait OverrideProtectionTrait
|
trait OverrideProtectionTrait
|
||||||
|
@ -15,8 +17,8 @@ trait OverrideProtectionTrait
|
||||||
*/
|
*/
|
||||||
public function invokeMethod(&$object, $methodName, array $parameters = [])
|
public function invokeMethod(&$object, $methodName, array $parameters = [])
|
||||||
{
|
{
|
||||||
$reflection = new \ReflectionClass(get_class($object));
|
$reflection = new \ReflectionClass($object::class);
|
||||||
$method = $reflection->getMethod($methodName);
|
$method = $reflection->getMethod($methodName);
|
||||||
$method->setAccessible(true);
|
$method->setAccessible(true);
|
||||||
|
|
||||||
return $method->invokeArgs($object, $parameters);
|
return $method->invokeArgs($object, $parameters);
|
||||||
|
@ -24,8 +26,8 @@ trait OverrideProtectionTrait
|
||||||
|
|
||||||
public function setProtectedProperty(&$object, $property, $value)
|
public function setProtectedProperty(&$object, $property, $value)
|
||||||
{
|
{
|
||||||
$reflection = new \ReflectionClass(get_class($object));
|
$reflection = new \ReflectionClass($object::class);
|
||||||
$prop = $reflection->getProperty($property);
|
$prop = $reflection->getProperty($property);
|
||||||
$prop->setAccessible(true);
|
$prop->setAccessible(true);
|
||||||
|
|
||||||
return $prop->setValue($object, $value);
|
return $prop->setValue($object, $value);
|
||||||
|
@ -33,8 +35,8 @@ trait OverrideProtectionTrait
|
||||||
|
|
||||||
public function getProtectedProperty(&$object, $property)
|
public function getProtectedProperty(&$object, $property)
|
||||||
{
|
{
|
||||||
$reflection = new \ReflectionClass(get_class($object));
|
$reflection = new \ReflectionClass($object::class);
|
||||||
$prop = $reflection->getProperty($property);
|
$prop = $reflection->getProperty($property);
|
||||||
$prop->setAccessible(true);
|
$prop->setAccessible(true);
|
||||||
|
|
||||||
return $prop->getValue($object);
|
return $prop->getValue($object);
|
||||||
|
|
Loading…
Reference in a new issue