Skip to content

Commit

Permalink
Fix compatibility with nette/di
Browse files Browse the repository at this point in the history
  • Loading branch information
PavelJurasek committed Mar 28, 2019
1 parent 55fbe69 commit 8984aa1
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 25 deletions.
89 changes: 67 additions & 22 deletions src/Events/DI/EventsExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,18 @@
use Nette\Configurator;
use Nette\DI\Compiler;
use Nette\DI\Config\Helpers as DIConfigHelpers;
use Nette\DI\Config\Helpers;
use Nette\DI\Config\Processor;
use Nette\DI\Container as DIContainer;
use Nette\DI\ContainerBuilder as DIContainerBuilder;
use Nette\DI\ServiceDefinition;
use Nette\DI\Statement;
use Nette\DI\Definitions\AccessorDefinition;
use Nette\DI\Definitions\Definition;
use Nette\DI\Definitions\FactoryDefinition;
use Nette\DI\Definitions\ImportedDefinition;
use Nette\DI\Definitions\Reference;
use Nette\DI\Definitions\ServiceDefinition;
use Nette\DI\Definitions\Statement;
use Nette\DI\Resolver;
use Nette\PhpGenerator\ClassType as ClassTypeGenerator;
use Nette\PhpGenerator\Helpers as GeneratorHelpers;
use Nette\PhpGenerator\PhpLiteral;
Expand Down Expand Up @@ -80,7 +88,7 @@ public function loadConfiguration()
$this->allowedManagerSetup = [];

$builder = $this->getContainerBuilder();
$config = $this->getConfig($this->defaults);
$config = Helpers::merge($this->getConfig(), $this->defaults);

$userConfig = $this->getConfig();
if (!array_key_exists('debugger', $userConfig)) {
Expand Down Expand Up @@ -113,11 +121,12 @@ public function loadConfiguration()
foreach ($config['subscribers'] as $i => $subscriber) {
$def = $builder->addDefinition($this->prefix('subscriber.' . $i));

$def->setFactory(Compiler::filterArguments([
$def->setFactory(Processor::processArguments([
is_string($subscriber) ? new Statement($subscriber) : $subscriber,
])[0]);

[$subscriberClass] = (array) $builder->normalizeEntity($def->getEntity());
// [$subscriberClass] = (array) $builder->normalizeEntity($def->getEntity());
$subscriberClass = $def->getEntity();
if (class_exists($subscriberClass)) {
$def->setClass($subscriberClass);
}
Expand Down Expand Up @@ -219,23 +228,39 @@ private function validateSubscribers(DIContainerBuilder $builder, ServiceDefinit
}

try {
$serviceName = $builder->getServiceName(reset($stt->arguments));
$def = $builder->getDefinition($serviceName);
// $serviceName = $builder->getServiceName(reset($stt->arguments));
// $def = $builder->getDefinition($serviceName);
$argument = reset($stt->arguments);
dump(is_object($argument) ? get_class($argument) : null);
if ($argument instanceof Reference) {
$serviceName = $argument->getValue();
$def = $builder->getDefinition($serviceName);
} elseif ($argument instanceof Statement) {
$serviceName = (string) $argument->getEntity();
$def = $builder->getDefinition($serviceName);
} else {
$serviceName = ltrim($argument, '@');
$def = $builder->getDefinition($serviceName);
}

// $serviceName = $argument instanceof Reference ? $argument->getName() : ltrim($argument, '@');
// $def = $argument instanceof Reference ? $argument : $builder->getDefinition();
// $def = $builder->getDefinition($serviceName);

} catch (\Exception $e) {
throw new \Nette\Utils\AssertionException(
sprintf(
'Please, do not register listeners directly to service %s. Use section "%s: subscribers: ", or tag the service as "%s".',
$this->prefix('@manager'),
$this->name,
self::SUBSCRIBER_TAG
self::TAG_SUBSCRIBER
),
0,
$e
);
}

$defClass = $def->getClass();
$defClass = $def->getType();

if (!$defClass) {
throw new \Nette\Utils\AssertionException(
Expand Down Expand Up @@ -301,12 +326,16 @@ private function validateSubscribers(DIContainerBuilder $builder, ServiceDefinit
}
}

private function isAlias(ServiceDefinition $definition)
private function isAlias(Definition $definition)
{
return $definition->getFactory() && (
$definition->getEntity() instanceof ServiceDefinition
|| (is_string($definition->getEntity()) && substr($definition->getEntity(), 0, 1) === '@')
);
if ($definition instanceof ServiceDefinition) {
return $definition->getFactory() && (
$definition->getEntity() instanceof Reference
|| (is_string($definition->getEntity()) && substr($definition->getEntity(), 0, 1) === '@')
);
}

return $definition instanceof Reference;
}

/**
Expand All @@ -315,18 +344,32 @@ private function isAlias(ServiceDefinition $definition)
private function autowireEvents(DIContainerBuilder $builder)
{
foreach ($builder->getDefinitions() as $def) {
/** @var \Nette\DI\ServiceDefinition $def */
if ($def instanceof ImportedDefinition) {
continue;
}
dump($def);

/** @var \Nette\DI\Definitions\ServiceDefinition $def */
if ($this->isAlias($def)) {
continue; // alias
}

$class = $builder->expand($def->getClass());
$class = $def->getType();
if (!class_exists($class)) {
if (!$def->getFactory()) {
if ($def instanceof AccessorDefinition) {
continue;
}

$class = $builder->expand($def->getEntity());
if ($def instanceof FactoryDefinition && !$def->getResultDefinition()->getFactory()) {
continue;
}

if ($def instanceof FactoryDefinition) {
$class = $def->getResultDefinition()->getEntity();
} else {
$class = $def->getEntity();
}

if (is_array($class)) {
continue;
}
Expand All @@ -335,16 +378,18 @@ private function autowireEvents(DIContainerBuilder $builder)
continue;
}
}
if ($def->getImplementMode() === $def::IMPLEMENT_MODE_GET) {
if ($def instanceof AccessorDefinition || $def instanceof ImportedDefinition) {
continue;
}

$this->bindEventProperties($def, ClassTypeReflection::from($class));
}
}

protected function bindEventProperties(ServiceDefinition $def, ClassTypeReflection $class)
protected function bindEventProperties(Definition $def, ClassTypeReflection $class)
{
$def = $def instanceof FactoryDefinition ? $def->getResultDefinition() : $def;

foreach ($class->getProperties(ReflectionProperty::IS_PUBLIC) as $property) {
$name = $property->getName();
if (!preg_match('#^on[A-Z]#', $name)) {
Expand Down Expand Up @@ -402,7 +447,7 @@ private function optimizeListeners(DIContainerBuilder $builder)
}

$builder->getDefinition($this->prefix('manager'))
->setClass(LazyEventManager::class, [$listeners])
->setFactory(LazyEventManager::class, [$listeners])
->setSetup($this->allowedManagerSetup);
}

Expand All @@ -412,7 +457,7 @@ private function optimizeListeners(DIContainerBuilder $builder)
*/
private function filterArgs($statement)
{
return Compiler::filterArguments([is_string($statement) ? new Statement($statement) : $statement]);
return Processor::processArguments([is_string($statement) ? new Statement($statement) : $statement]);
}

/**
Expand Down
2 changes: 1 addition & 1 deletion tests/KdybyTests/Events/ExtensionTest.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ class ExtensionTest extends \Tester\TestCase
);

} catch (\Nette\DI\ServiceCreationException $e) {
Assert::match("Class NonExistingClass_%a% used in service 'events.subscriber.%a%' not found%a?%.", $e->getMessage());
Assert::match("Service 'events.subscriber.0': Class NonExistingClass_%a% not found%a?%.", $e->getMessage());

} catch (\Exception $e) {
Assert::fail($e->getMessage());
Expand Down
1 change: 0 additions & 1 deletion tests/KdybyTests/Events/config/alias.neon
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,5 @@ events:

services:
application:
class: NULL
factory: Nette\Application\Application
alias: @application
2 changes: 1 addition & 1 deletion tests/KdybyTests/Events/config/autowire.neon
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ events:

services:
application:
class: NULL
class: Nette\Application\Application
factory: Nette\Application\Application

routerFactory: KdybyTests\Events\RouterFactory
Expand Down

0 comments on commit 8984aa1

Please sign in to comment.