Skip to content

Commit

Permalink
Deprecate usage of the traits without registered DI extension
Browse files Browse the repository at this point in the history
  • Loading branch information
xificurk committed Sep 11, 2022
1 parent cd117f5 commit 0513fed
Show file tree
Hide file tree
Showing 7 changed files with 93 additions and 32 deletions.
17 changes: 9 additions & 8 deletions docs/en/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,15 @@ $ composer require kdyby/autowired
Include in application
----------------------

Enable AutowiredExtension in config, which registers Tracy panel and other necessary services


```php
extensions:
autowired: Kdyby\Autowired\DI\AutowiredExtension
```


Package contains two traits that you can include in your Components.

The first one is just for properties and the second one is for component factories.
Expand All @@ -28,14 +37,6 @@ abstract class BasePresenter extends Nette\Application\UI\Presenter
}
```

For debugging purposes you may also add the AutowiredExtension in config, which registers Tracy panel


```php
extensions:
autowired: Kdyby\Autowired\DI\AutowiredExtension
```



Autowired properties
Expand Down
1 change: 1 addition & 0 deletions src/Kdyby/Autowired/AutowireComponentFactories.php
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ public function injectComponentFactories(Nette\DI\Container $dic): void
try {
$cacheFactory = $dic->getByType(CacheFactory::class);
} catch (Nette\DI\MissingServiceException $exception) {
trigger_error('Using ' . __TRAIT__ . ' without registered AutowiredExtension is deprecated, register the extension in your config.', E_USER_DEPRECATED);
$cacheFactory = CacheFactory::fromContainer($dic);
}
$cache = $cacheFactory->create(static::class, 'Kdyby.Autowired.AutowireComponentFactories');
Expand Down
1 change: 1 addition & 0 deletions src/Kdyby/Autowired/AutowireProperties.php
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ public function injectProperties(Nette\DI\Container $dic): void
try {
$cacheFactory = $dic->getByType(CacheFactory::class);
} catch (Nette\DI\MissingServiceException $exception) {
trigger_error('Using ' . __TRAIT__ . ' without registered AutowiredExtension is deprecated, register the extension in your config.', E_USER_DEPRECATED);
$cacheFactory = CacheFactory::fromContainer($dic);
}
$cache = $cacheFactory->create(static::class, 'Kdyby.Autowired.AutowireProperties');
Expand Down
12 changes: 6 additions & 6 deletions tests/KdybyTests/Autowired/AutowireComponentFactoriesTest.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ class AutowireComponentFactoriesTest extends ContainerTestCase
public function testAutowireComponentFactories(): void
{
$presenter = new ComponentFactoriesFixtures\SillyPresenter();
$this->container->callMethod([$presenter, 'injectComponentFactories']);
@$this->container->callMethod([$presenter, 'injectComponentFactories']);

Assert::type(SillyComponent::class, $presenter['autowired']);
Assert::type(SillyComponent::class, $presenter['optional']);
Expand Down Expand Up @@ -68,7 +68,7 @@ class AutowireComponentFactoriesTest extends ContainerTestCase
Assert::noError(
function (): void {
$presenter = new ComponentFactoriesFixtures\WithMissingServicePresenter();
$this->container->callMethod([$presenter, 'injectComponentFactories']);
@$this->container->callMethod([$presenter, 'injectComponentFactories']);
},
);
}
Expand All @@ -80,7 +80,7 @@ class AutowireComponentFactoriesTest extends ContainerTestCase
Assert::exception(
function () use ($container): void {
$presenter = new ComponentFactoriesFixtures\WithMissingServicePresenter();
$container->callMethod([$presenter, 'injectComponentFactories']);
@$container->callMethod([$presenter, 'injectComponentFactories']);
},
Kdyby\Autowired\MissingServiceException::class,
'Service of type KdybyTests\Autowired\ComponentFactoriesFixtures\ComponentFactoryWithMissingService required by $factory in KdybyTests\Autowired\ComponentFactoriesFixtures\WithMissingServicePresenter::createComponentSilly() not found. Did you add it to configuration file?',
Expand All @@ -94,7 +94,7 @@ class AutowireComponentFactoriesTest extends ContainerTestCase
Assert::exception(
function () use ($container): void {
$presenter = new ComponentFactoriesFixtures\WithMultipleServicesPresenter();
$container->callMethod([$presenter, 'injectComponentFactories']);
@$container->callMethod([$presenter, 'injectComponentFactories']);
},
Kdyby\Autowired\MissingServiceException::class,
'Service of type KdybyTests\Autowired\ComponentFactoriesFixtures\ComponentFactoryWithMultipleServices required by $factory in KdybyTests\Autowired\ComponentFactoriesFixtures\WithMultipleServicesPresenter::createComponentSilly() not found. Did you add it to configuration file?',
Expand All @@ -108,7 +108,7 @@ class AutowireComponentFactoriesTest extends ContainerTestCase
Assert::exception(
function () use ($container): void {
$presenter = new ComponentFactoriesFixtures\WithDisabledAutowiringPresenter();
$container->callMethod([$presenter, 'injectComponentFactories']);
@$container->callMethod([$presenter, 'injectComponentFactories']);
},
Kdyby\Autowired\MissingServiceException::class,
'Service of type KdybyTests\Autowired\ComponentFactoriesFixtures\ComponentFactoryWithDisabledAutowiring required by $factory in KdybyTests\Autowired\ComponentFactoriesFixtures\WithDisabledAutowiringPresenter::createComponentSilly() not found. Did you add it to configuration file?',
Expand All @@ -122,7 +122,7 @@ class AutowireComponentFactoriesTest extends ContainerTestCase
Assert::exception(
function () use ($container): void {
$component = new ComponentFactoriesFixtures\NonPresenterComponent();
$container->callMethod([$component, 'injectComponentFactories']);
@$container->callMethod([$component, 'injectComponentFactories']);
},
Kdyby\Autowired\MemberAccessException::class,
'Trait Kdyby\Autowired\AutowireComponentFactories can be used only in descendants of Nette\Application\UI\Component.',
Expand Down
36 changes: 18 additions & 18 deletions tests/KdybyTests/Autowired/AutowirePropertiesTest.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ class AutowirePropertiesTest extends ContainerTestCase
public function testAutowireAnnotationProperties(): void
{
$presenter = new PropertiesFixtures\AutowireAnnotationPresenter();
$this->container->callMethod([$presenter, 'injectProperties']);
@$this->container->callMethod([$presenter, 'injectProperties']);

Assert::false(isset($presenter->typedService));
Assert::type(SampleService::class, $presenter->typedService);
Expand Down Expand Up @@ -189,7 +189,7 @@ class AutowirePropertiesTest extends ContainerTestCase
public function testAutowireAttributeProperties(): void
{
$control = new PropertiesFixtures\AutowireAttributeControl();
$this->container->callMethod([$control, 'injectProperties']);
@$this->container->callMethod([$control, 'injectProperties']);

Assert::false(isset($control->baseService));
Assert::type(SampleService::class, $control->baseService);
Expand Down Expand Up @@ -240,7 +240,7 @@ class AutowirePropertiesTest extends ContainerTestCase
);

$presenter = new PropertiesFixtures\AutowireAnnotationPresenter();
$this->container->callMethod([$presenter, 'injectProperties']);
@$this->container->callMethod([$presenter, 'injectProperties']);

Assert::false(isset($presenter->typedService));
Assert::type(SampleService::class, $presenter->typedService);
Expand All @@ -257,7 +257,7 @@ class AutowirePropertiesTest extends ContainerTestCase
Assert::noError(
function (): void {
$presenter = new PropertiesFixtures\WithMissingServiceFactoryPresenter();
$this->container->callMethod([$presenter, 'injectProperties']);
@$this->container->callMethod([$presenter, 'injectProperties']);
},
);
}
Expand All @@ -269,7 +269,7 @@ class AutowirePropertiesTest extends ContainerTestCase
Assert::exception(
function () use ($container): void {
$presenter = new PropertiesFixtures\WithServiceFactoryReturnTypeMismatchPresenter();
$container->callMethod([$presenter, 'injectProperties']);
@$container->callMethod([$presenter, 'injectProperties']);
},
Kdyby\Autowired\UnexpectedValueException::class,
'The property KdybyTests\Autowired\PropertiesFixtures\WithServiceFactoryReturnTypeMismatchPresenter::$service requires KdybyTests\Autowired\PropertiesFixtures\UseExpansion\ImportedService, but factory of type KdybyTests\Autowired\PropertiesFixtures\SampleServiceFactory, that creates KdybyTests\Autowired\PropertiesFixtures\SampleService was provided.',
Expand All @@ -283,7 +283,7 @@ class AutowirePropertiesTest extends ContainerTestCase
Assert::exception(
function () use ($container): void {
$presenter = new PropertiesFixtures\WithMissingServiceFactoryPresenter();
$container->callMethod([$presenter, 'injectProperties']);
@$container->callMethod([$presenter, 'injectProperties']);
},
Kdyby\Autowired\MissingServiceException::class,
'Unable to autowire service factory for KdybyTests\Autowired\PropertiesFixtures\WithMissingServiceFactoryPresenter::$service: Service of type KdybyTests\Autowired\PropertiesFixtures\MissingService not found. Did you add it to configuration file?',
Expand All @@ -297,7 +297,7 @@ class AutowirePropertiesTest extends ContainerTestCase
Assert::exception(
function () use ($container): void {
$presenter = new PropertiesFixtures\WithMultipleServiceFactoriesPresenter();
$container->callMethod([$presenter, 'injectProperties']);
@$container->callMethod([$presenter, 'injectProperties']);
},
Kdyby\Autowired\MissingServiceException::class,
'Unable to autowire service factory for KdybyTests\Autowired\PropertiesFixtures\WithMultipleServiceFactoriesPresenter::$service: Multiple services of type KdybyTests\Autowired\PropertiesFixtures\FactoryWithMultipleServices found: one, two.',
Expand All @@ -311,7 +311,7 @@ class AutowirePropertiesTest extends ContainerTestCase
Assert::exception(
function () use ($container): void {
$presenter = new PropertiesFixtures\WithDisabledAutowiringServiceFactoryPresenter();
$container->callMethod([$presenter, 'injectProperties']);
@$container->callMethod([$presenter, 'injectProperties']);
},
Kdyby\Autowired\MissingServiceException::class,
'Unable to autowire service factory for KdybyTests\Autowired\PropertiesFixtures\WithDisabledAutowiringServiceFactoryPresenter::$service: Service of type KdybyTests\Autowired\PropertiesFixtures\FactoryWithDisabledAutowiring is not autowired or is missing in di › export › types.',
Expand All @@ -325,7 +325,7 @@ class AutowirePropertiesTest extends ContainerTestCase
Assert::exception(
function () use ($container): void {
$presenter = new PropertiesFixtures\WithInvalidFactoryTypePresenter();
$container->callMethod([$presenter, 'injectProperties']);
@$container->callMethod([$presenter, 'injectProperties']);
},
Kdyby\Autowired\MissingClassException::class,
'Neither class "string" or "KdybyTests\Autowired\PropertiesFixtures\string" was found, please check the typehint on KdybyTests\Autowired\PropertiesFixtures\WithInvalidFactoryTypePresenter::$service in annotation @autowire.',
Expand All @@ -339,7 +339,7 @@ class AutowirePropertiesTest extends ContainerTestCase
Assert::exception(
function () use ($container): void {
$presenter = new PropertiesFixtures\WithDisabledAutowiringServicePresenter();
$container->callMethod([$presenter, 'injectProperties']);
@$container->callMethod([$presenter, 'injectProperties']);
},
Kdyby\Autowired\MissingServiceException::class,
'Unable to autowire service for KdybyTests\Autowired\PropertiesFixtures\WithDisabledAutowiringServicePresenter::$service: Service of type KdybyTests\Autowired\PropertiesFixtures\FactoryWithDisabledAutowiring is not autowired or is missing in di › export › types.',
Expand All @@ -353,7 +353,7 @@ class AutowirePropertiesTest extends ContainerTestCase
Assert::exception(
function () use ($container): void {
$presenter = new PropertiesFixtures\WithMultipleServicesPresenter();
$container->callMethod([$presenter, 'injectProperties']);
@$container->callMethod([$presenter, 'injectProperties']);
},
Kdyby\Autowired\MissingServiceException::class,
'Unable to autowire service for KdybyTests\Autowired\PropertiesFixtures\WithMultipleServicesPresenter::$service: Multiple services of type KdybyTests\Autowired\PropertiesFixtures\FactoryWithMultipleServices found: one, two.',
Expand All @@ -367,7 +367,7 @@ class AutowirePropertiesTest extends ContainerTestCase
Assert::exception(
function () use ($container): void {
$presenter = new PropertiesFixtures\WithMissingServicePresenter();
$container->callMethod([$presenter, 'injectProperties']);
@$container->callMethod([$presenter, 'injectProperties']);
},
Kdyby\Autowired\MissingServiceException::class,
'Unable to autowire service for KdybyTests\Autowired\PropertiesFixtures\WithMissingServicePresenter::$service: Service of type KdybyTests\Autowired\PropertiesFixtures\MissingService not found. Did you add it to configuration file?',
Expand All @@ -381,7 +381,7 @@ class AutowirePropertiesTest extends ContainerTestCase
Assert::exception(
function () use ($container): void {
$presenter = new PropertiesFixtures\WithInvalidPropertyTypePresenter();
$container->callMethod([$presenter, 'injectProperties']);
@$container->callMethod([$presenter, 'injectProperties']);
},
Kdyby\Autowired\MissingClassException::class,
'Class "string" not found, please check the typehint on KdybyTests\Autowired\PropertiesFixtures\WithInvalidPropertyTypePresenter::$service.',
Expand All @@ -395,7 +395,7 @@ class AutowirePropertiesTest extends ContainerTestCase
Assert::exception(
function () use ($container): void {
$presenter = new PropertiesFixtures\WithMissingPropertyTypePresenter();
$container->callMethod([$presenter, 'injectProperties']);
@$container->callMethod([$presenter, 'injectProperties']);
},
Kdyby\Autowired\InvalidStateException::class,
'Missing property typehint or annotation @var on KdybyTests\Autowired\PropertiesFixtures\WithMissingPropertyTypePresenter::$service.',
Expand All @@ -409,7 +409,7 @@ class AutowirePropertiesTest extends ContainerTestCase
Assert::exception(
function () use ($container): void {
$presenter = new PropertiesFixtures\PrivateAutowiredPropertyPresenter();
$container->callMethod([$presenter, 'injectProperties']);
@$container->callMethod([$presenter, 'injectProperties']);
},
Kdyby\Autowired\MemberAccessException::class,
'Autowired properties must be protected or public. Please fix visibility of KdybyTests\Autowired\PropertiesFixtures\PrivateAutowiredPropertyPresenter::$service or remove the @autowire annotation.',
Expand All @@ -423,7 +423,7 @@ class AutowirePropertiesTest extends ContainerTestCase
Assert::exception(
function () use ($container): void {
$presenter = new PropertiesFixtures\AutowireAnnotationWrongCasePresenter();
$container->callMethod([$presenter, 'injectProperties']);
@$container->callMethod([$presenter, 'injectProperties']);
},
Kdyby\Autowired\UnexpectedValueException::class,
'Annotation @Autowire on KdybyTests\Autowired\PropertiesFixtures\AutowireAnnotationWrongCasePresenter::$service should be fixed to lowercase @autowire.',
Expand All @@ -437,7 +437,7 @@ class AutowirePropertiesTest extends ContainerTestCase
Assert::exception(
function () use ($container): void {
$presenter = new PropertiesFixtures\AutowireAnnotationTypoPresenter();
$container->callMethod([$presenter, 'injectProperties']);
@$container->callMethod([$presenter, 'injectProperties']);
},
Kdyby\Autowired\UnexpectedValueException::class,
'Annotation @autowired on KdybyTests\Autowired\PropertiesFixtures\AutowireAnnotationTypoPresenter::$service should be fixed to lowercase @autowire.',
Expand All @@ -451,7 +451,7 @@ class AutowirePropertiesTest extends ContainerTestCase
Assert::exception(
function () use ($container): void {
$component = new PropertiesFixtures\NonPresenterComponent();
$container->callMethod([$component, 'injectProperties']);
@$container->callMethod([$component, 'injectProperties']);
},
Kdyby\Autowired\MemberAccessException::class,
'Trait Kdyby\Autowired\AutowireProperties can be used only in descendants of Nette\Application\UI\Component.',
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php
declare(strict_types=1);

namespace KdybyTests\Autowired\DeprecationsFixtures;

use Kdyby;
use Nette;


class SimplePresenter extends Nette\Application\UI\Presenter
{

use Kdyby\Autowired\AutowireProperties;
use Kdyby\Autowired\AutowireComponentFactories;

}
42 changes: 42 additions & 0 deletions tests/KdybyTests/Autowired/DeprecationsTest.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<?php
declare(strict_types=1);

namespace KdybyTests\Autowired;

use KdybyTests\Autowired\DeprecationsFixtures\SimplePresenter;
use KdybyTests\ContainerTestCase;
use Tester\Assert;


require_once __DIR__ . '/../bootstrap.php';



final class DeprecationsTest extends ContainerTestCase
{

public function testDIExtensionNotRegistered(): void
{
$container = $this->compileContainer();
$presenter = new SimplePresenter();

Assert::error(
function () use ($container, $presenter): void {
$container->callMethod([$presenter, 'injectComponentFactories']);
},
E_USER_DEPRECATED,
'Using Kdyby\Autowired\AutowireComponentFactories without registered AutowiredExtension is deprecated, register the extension in your config.',
);

Assert::error(
function () use ($container, $presenter): void {
$container->callMethod([$presenter, 'injectProperties']);
},
E_USER_DEPRECATED,
'Using Kdyby\Autowired\AutowireProperties without registered AutowiredExtension is deprecated, register the extension in your config.',
);
}

}

(new DeprecationsTest())->run();

0 comments on commit 0513fed

Please sign in to comment.