Skip to content

Commit

Permalink
Nette 3
Browse files Browse the repository at this point in the history
  • Loading branch information
mabar committed Jun 10, 2019
1 parent 9c83067 commit 8464896
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 51 deletions.
19 changes: 7 additions & 12 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,13 @@
}
],
"require": {
"php": ">= 7.1",
"contributte/psr7-http-message": "~0.5"
"php": "^7.2",
"contributte/psr7-http-message": "dev-next"
},
"require-dev": {
"nette/application": "~2.4.12",
"nette/di": "~2.4.12",
"nette/http": "~2.4.9",
"nette/utils": "~2.5.2",
"nette/application": "~3.0.0",
"nette/di": "~3.0.0",
"nette/http": "~3.0.1",
"ninjify/nunjuck": "~0.2",
"ninjify/qa": "~0.8.0",
"phpstan/extension-installer": "^1.0",
Expand All @@ -35,11 +34,7 @@
"tracy/tracy": "~2.6.1"
},
"conflict": {
"nette/application": "<2.4.12",
"nette/di": "<2.4.12",
"nette/http": "<2.4.9",
"nette/utils": "<2.5.2",
"tracy/tracy": "<2.5.4"
"nette/di": "<3.0.0"
},
"suggest": {
"tracy/tracy": "to use TracyMiddleware",
Expand All @@ -64,7 +59,7 @@
},
"extra": {
"branch-alias": {
"dev-master": "0.8.x-dev"
"dev-master": "0.9.x-dev"
}
}
}
1 change: 1 addition & 0 deletions phpstan.neon
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ parameters:
- '#Only booleans are allowed in an if condition, mixed given.#'
- '#Only booleans are allowed in a negated boolean, mixed given.#'
- '#^Parameter \#2 \$parameters of function call_user_func_array expects array\<int, mixed\>, array\<int\|string, mixed\> given\.$#'
- '#^Parameter \#1 \$name of method Nette\\DI\\ContainerBuilder\:\:getDefinition\(\) expects string, int\|string given\.$#'
81 changes: 44 additions & 37 deletions src/DI/AbstractMiddlewaresExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,38 +6,42 @@
use Contributte\Middlewares\Tracy\DebugChainBuilder;
use Contributte\Middlewares\Tracy\MiddlewaresPanel;
use Contributte\Middlewares\Utils\ChainBuilder;
use Nette\DI\Compiler;
use Nette\DI\CompilerExtension;
use Nette\DI\Statement;
use Nette\DI\Definitions\Definition;
use Nette\DI\Definitions\ServiceDefinition;
use Nette\DI\Definitions\Statement;
use Nette\PhpGenerator\ClassType;
use Nette\Utils\Validators;

use Nette\Schema\Expect;
use Nette\Schema\Schema;
use Nette\Utils\Strings;
use stdClass;

/**
* @property-read stdClass $config
*/
abstract class AbstractMiddlewaresExtension extends CompilerExtension
{

public const MIDDLEWARE_TAG = 'middleware';

/** @var mixed[] */
protected $defaults = [
'middlewares' => [],
'debug' => false,
];
public function getConfigSchema(): Schema
{
return Expect::structure([
'middlewares' => Expect::arrayOf(Expect::type('string|array|' . Statement::class)),
'debug' => Expect::bool(false),
]);
}

/**
* Register services
*/
public function loadConfiguration(): void
{
$builder = $this->getContainerBuilder();
$config = $this->validateConfig($this->defaults);

Validators::assertField($config, 'middlewares', 'array');
$config = $this->config;

// Register middleware chain builder
$chain = $builder->addDefinition($this->prefix('chain'))
->setAutowired(false);

if ($config['debug'] !== true) {
if (!$config->debug) {
$chain->setFactory(ChainBuilder::class);
} else {
$chain->setFactory(DebugChainBuilder::class);
Expand All @@ -47,16 +51,13 @@ public function loadConfiguration(): void
}
}

/**
* Decorate services
*/
public function beforeCompile(): void
{
$builder = $this->getContainerBuilder();
$config = $this->getConfig();
$config = $this->config;

// Compile defined middlewares
if ($config['middlewares'] !== []) {
if ($config->middlewares !== []) {
$this->compileDefinedMiddlewares();

return;
Expand All @@ -72,29 +73,34 @@ public function beforeCompile(): void
throw new InvalidStateException('There must be at least one middleware registered or added by tag.');
}

/**
* @param string|mixed[]|Statement $config
*/
private function getDefinitionFromConfig($config, string $preferredPrefix): Definition
{
if (is_string($config) && Strings::startsWith($config, '@')) {
$prefix = substr($config, 1);
} else {
$prefix = $preferredPrefix;
$this->compiler->loadDefinitionsFromConfig([$prefix => $config]);
}
return $this->getContainerBuilder()->getDefinition($prefix);
}

private function compileDefinedMiddlewares(): void
{
$builder = $this->getContainerBuilder();
$config = $this->getConfig();
$config = $this->config;

// Obtain middleware chain builder
$chain = $builder->getDefinition($this->prefix('chain'));
assert($chain instanceof ServiceDefinition);

// Add middleware services to chain
$counter = 0;
foreach ($config['middlewares'] as $service) {

foreach ($config->middlewares as $service) {
// Create middleware as service
if (
is_array($service)
|| $service instanceof Statement
|| (is_string($service) && strncmp($service, '@', 1) !== 0)
) {
$def = $builder->addDefinition($this->prefix('middleware' . ($counter++)));
Compiler::loadDefinition($def, $service);
} else {
$def = $builder->getDefinition(ltrim($service, '@'));
}
$def = $this->getDefinitionFromConfig($service, $this->prefix('middleware' . ($counter++)));

// Append to chain of middlewares
$chain->addSetup('add', [$def]);
Expand All @@ -114,7 +120,7 @@ private function compileTaggedMiddlewares(): void
}

// Sort by priority
uasort($definitions, function ($a, $b) {
uasort($definitions, function (array $a, array $b) {
$p1 = $a['priority'] ?? 10;
$p2 = $b['priority'] ?? 10;

Expand All @@ -127,6 +133,7 @@ private function compileTaggedMiddlewares(): void

// Obtain middleware chain builder
$chain = $builder->getDefinition($this->prefix('chain'));
assert($chain instanceof ServiceDefinition);

// Add middleware services to chain
foreach ($definitions as $name => $tag) {
Expand All @@ -137,9 +144,9 @@ private function compileTaggedMiddlewares(): void

public function afterCompile(ClassType $class): void
{
$config = $this->validateConfig($this->defaults);
$config = $this->config;

if ($config['debug'] === true) {
if ($config->debug) {
$initialize = $class->getMethod('initialize');
$initialize->addBody(
'$this->getService(?)->addPanel($this->getService(?));',
Expand Down
2 changes: 1 addition & 1 deletion src/DI/MiddlewaresExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
namespace Contributte\Middlewares\DI;

use Contributte\Middlewares\Application\MiddlewareApplication;
use Nette\DI\Statement;
use Nette\DI\Definitions\Statement;

class MiddlewaresExtension extends AbstractMiddlewaresExtension
{
Expand Down
2 changes: 1 addition & 1 deletion src/DI/NetteMiddlewaresExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
namespace Contributte\Middlewares\DI;

use Contributte\Middlewares\Application\NetteMiddlewareApplication;
use Nette\DI\Definitions\Statement;
use Nette\DI\ServiceCreationException;
use Nette\DI\Statement;
use Nette\Http\Request;
use Nette\Http\Response;

Expand Down

0 comments on commit 8464896

Please sign in to comment.