mnapoli on 7.0.0-beta3
mnapoli on v7
Run APCu tests in CI (compare)
mnapoli on v7
Support psr/container 2.0 (compare)
mnapoli on v7
Remove now useless test Run APCu tests in CI (compare)
mnapoli on v7
Require psr/container 1.1 to st… (compare)
mnapoli on v7
Install Composer 1 by default t… Update .gitattributes Remove u… Update .gitattributes and 12 more (compare)
mnapoli on master
Update dev dependency (compare)
Hi there,
I have a question about \DI\get()
and the documentation saying that it's a "alias" to any existing definition. The result I get is a bit misleading when dealing with non-singleton objects. Here's my example:
class UniqId {
public $id;
public function __construct() {
$this->id = uniqid();
}
}
class OtherClass {
public $id;
public function __construct(UniqId $u) {
$this->id = $u->id;
}
}
$containerBuilder = new DI\ContainerBuilder();
$containerBuilder->addDefinitions([
UniqId::class => \DI\create(),
'UniqId_alias' => \DI\get(UniqId::class),
OtherClass::class => \DI\autowire(),
'OtherClass_alias' => \DI\get(OtherClass::class),
'OtherClass_alias2' => \DI\autowire(OtherClass::class)
->constructorParameter('u', \DI\get('UniqId_alias'))
]);
$container = $containerBuilder->build();
var_dump([
'UniqId ' => $container->make(UniqId::class)->id,
'UniqId (again) ' => $container->make(UniqId::class)->id,
'UniqId_alias ' => $container->make('UniqId_alias')->id,
'OtherClass ' => $container->make(OtherClass::class)->id,
'OtherClass_alias ' => $container->make('OtherClass_alias')->id,
'OtherClass_alias2 ' => $container->make('OtherClass_alias2')->id,
]);
The result is as follows:
array (size=6)
'UniqId ' => string '5d0e6194728ec' (length=13)
'UniqId (again) ' => string '5d0e619472911' (length=13)
'UniqId_alias ' => string '5d0e61947294e' (length=13)
'OtherClass ' => string '5d0e61947294e' (length=13)
'OtherClass_alias ' => string '5d0e61947294e' (length=13)
'OtherClass_alias2 ' => string '5d0e61947294e' (length=13)
My idea was that as UniqId
is defined as a non-singleton because of \DI\create()
, so were its references when used as dependencies of other classes (here OtherClass
ot its aliases). But actually it's not. The only solution I've found is to "force" it when defining the dependent class:
...
'OtherClass_alias3' => \DI\autowire(OtherClass::class)
->constructorParameter('u', \DI\create(UniqId::class))
...
To be more precise about what results I'm confused about, it's:
'OtherClass ' => string '5d0e6316dbd5a' (length=13)
'OtherClass_alias ' => string '5d0e6316dbd5a' (length=13)
'OtherClass_alias2 ' => string '5d0e6316dbd5a' (length=13)
where clearly the instance of UniqId
which is injected in OtherClass
is a singleton, when I would like to have a new instance each time a new OtherClass
is created.
== index.php
declare(strict_types=1);
(require __DIR__ . '/app/config/bootstrap.php')->run();
== bootstrap.php
declare(strict_types=1);
use DI\ContainerBuilder;
use Slim\App;
require_once __DIR__ . '/../../../vendor/autoload.php';
$containerBuilder = new ContainerBuilder();
$containerBuilder->addDefinitions(__DIR__ . '/container.php');
$container = $containerBuilder->build();
$app = $container->get(App::class);
(require __DIR__ . '/routes.php')($app);
(require __DIR__ . '/middleware.php')($app);
return $app;
== container.php
declare(strict_types=1);
use Psr\Container\ContainerInterface;
use Selective\Config\Configuration;
use Slim\App;
use Slim\Factory\AppFactory;
return [
Configuration::class => function () {
return new Configuration(require __DIR__ . '/settings.php');
},
App::class => function (ContainerInterface $container) {
AppFactory::setContainer($container);
$app = AppFactory::create();
//$app->setBasePath('/app');
return $app;
},
PDO::class => function (ContainerInterface $container) {
$config = $container->get(Configuration::class);
...
return new PDO($dsn, $username, $password, $flags);
},
];
== settings.php
$settings = [];
$settings['root'] = dirname(__DIR__);
$settings['temp'] = $settings['root'] . '/tmp';
$settings['public'] = $settings['root'] . '/public';
$settings['error_handler_middleware'] = [
'display_error_details' => true,
'log_errors' => true,
'log_error_details' => true,
];
$settings['db'] = [
'driver' => 'mysql',
'host' => 'localhost',
...
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'flags' => [
...
],
];
return $settings;
== routes.php
declare(strict_types=1);
use Slim\Http\Response;
use Slim\Http\ServerRequest;
use Slim\App;
//require \App\Action\HomeAction;
//require __DIR__ . '/../action/HomeAction.php';
//require __DIR__ . '/../action/AccountReadAction.php';
return function (App $app) {
$app->get('/', \App\Action\HomeAction::class);
$app->get( '/api/v1/accounts', \App\Action\AccountReadAllAction::class);
$app->post( '/api/v1/account/new', \App\Action\AccountCreateAction::class);
$app->get( '/api/v1/account/{id}', \App\Action\AccountReadAction::class);
$app->patch( '/api/v1/account/{id}', \App\Action\AccountUpdateAction::class);
$app->delete( '/api/v1/account/{id}', \App\Action\AccountDeleteAction::class);
};
== Error Message
Slim Application Error
The application could not run because of the following error:
Details
Type: RuntimeException
Code: 0
Message: Callable App\Action\AccountReadAction does not exist
File: /home/PROJECTNAME/vendor/slim/slim/Slim/CallableResolver.php
Line: 137
Trace
#0 /home/PROJECTNAME/vendor/slim/slim/Slim/CallableResolver.php(91): Slim\CallableResolver->resolveSlimNotation('App\\Action\\Acco...')
#1 /home/PROJECTNAME/vendor/slim/slim/Slim/CallableResolver.php(61): Slim\CallableResolver->resolveByPredicate('App\\Action\\Acco...', Array, 'handle')
#2 /home/PROJECTNAME/vendor/slim/slim/Slim/Routing/Route.php(358): Slim\CallableResolver->resolveRoute('App\\Action\\Acco...')
#3 /home/PROJECTNAME/vendor/slim/slim/Slim/MiddlewareDispatcher.php(73): Slim\Routing\Route->handle(Object(Slim\Http\ServerRequest))
#4 /home/PROJECTNAME/vendor/slim/slim/Slim/MiddlewareDispatcher.php(73): Slim\MiddlewareDispatcher->handle(Object(Slim\Http\ServerRequest))
#5 /home/PROJECTNAME/vendor/slim/slim/Slim/Routing/Route.php(333): Slim\MiddlewareDispatcher->handle(Object(Slim\Http\ServerRequest))
#6 /home/PROJECTNAME/vendor/slim/slim/Slim/Routing/RouteRunner.php(80): Slim\Routing\Route->run(Object(Slim\Http\ServerRequest))
#7 /home/PROJECTNAME/vendor/slim/slim/Slim/Middleware/BodyParsingMiddleware.php(50): Slim\Routing\RouteRunner->handle(Object(Slim\Http\ServerRequest))
#8 /home/PROJECTNAME/vendor/slim/slim/Slim/MiddlewareDispatcher.php(132): Slim\Middleware\BodyParsingMiddleware->process(Object(Slim\Http\ServerRequest), Object(Slim\Routing\RouteRunner))
#9 /home/PROJECTNAME/vendor/slim/slim/Slim/Middleware/RoutingMiddleware.php(58): class@anonymous->handle(Object(Slim\Http\ServerRequest))
#10 /home/PROJECTNAME/vendor/slim/slim/Slim/MiddlewareDispatcher.php(132): Slim\Middleware\RoutingMiddleware->process(Object(Slim\Http\ServerRequest), Object(class@anonymous))
#11 /home/PROJECTNAME/vendor/slim/slim/Slim/Middleware/ErrorMiddleware.php(89): class@anonymous->handle(Object(Slim\Http\ServerRequest))
#12 /home/PROJECTNAME/vendor/slim/slim/Slim/MiddlewareDispatcher.php(132): Slim\Middleware\ErrorMiddleware->process(Object(Slim\Http\ServerRequest), Object(class@anonymous))
#13 /home/PROJECTNAME/vendor/slim/slim/Slim/Middleware/ErrorMiddleware.php(89): class@anonymous->handle(Object(Slim\Http\ServerRequest))
#14 /home/PROJECTNAME/vendor/slim/slim/Slim/MiddlewareDispatcher.php(132): Slim\Middleware\ErrorMiddleware->process(Object(Slim\Http\ServerRequest), Object(class@anonymous))
#15 /home/PROJECTNAME/vendor/slim/slim/Slim/MiddlewareDispatcher.php(73): class@anonymous->handle(Object(Slim\Http\ServerRequest))
#16 /home/PROJECTNAME/vendor/slim/slim/Slim/App.php(208): Slim\MiddlewareDispatcher->handle(Object(Slim\Http\ServerRequest))
#17 /home/PROJECTNAME/vendor/slim/slim/Slim/App.php(192): Slim\App->handle(Object(Slim\Http\ServerRequest))
#18 /home/PROJECTNAME/public_html/index.php(5): Slim\App->run()
#19 {main}
\App
classes? Otherwise if it follows PSR-4 convention (which it should) you can add it to your composer.json
like so: https://getcomposer.org/doc/04-schema.md#psr-4
{
"require": {
"php": ">=7.1",
"ext-json": "*",
"monolog/monolog": "^2.0",
"php-di/php-di": "^6.0",
"selective/config": "^0.1.1",
"slim/http": "^0.8.0",
"slim/psr7": "^0.6.0",
"slim/slim": "4.*"
},
"require-dev": {
"phpunit/phpunit": "8"
},
"autoload": {
"psr-4": {
"App\\": "public/app/"
}
}
}
App\Action
, then your directory should be named like this: src/Action/
and not src/action/
.
Hi. I have this problem, when I upload my project to a host this error activates me: Fatal error: Not captured DI \ NotFoundException: No entry or class was found for 'App \ Controllers \ AuthController' in /home/vrfctuqw/myhonsting.com/ vendor /php-di/php-di/src/Container.php:135 Stack tracking: # 0 /home/vrfctuqw/myhosting.com/vendor/php-di/php-di/src/CompiledContainer.php(64) : DI \ Container-> get ('App \ Controllers ...') # 1 /home/vrfctuqw/myhosting.com/public/index.php(474): DI \ CompiledContainer-> get ('App \ \ Controllers ... ') # 2 {main} included in /home/vrfctuqw/myhosting.com/vendor/php-di/php-di/src/Container.php on line 135
Locally it works correctly, but in hosting I present this. I would like you to help me please
composer update
I get a notice that the package jeremeamia/superclosure is abandoned and php-di seems to require/depend on this package. Any solutions to this problem especially that the recommendation is using opis/closure and it's not advisable to edit composer.lock directly??