mnapoli on v7
mnapoli on php8-only
Require PHP 8.0 and use stricte… Fix psalm warnings Require PHP 8 and 4 more (compare)
mnapoli on v7
Test and document using PHP 8 n… (compare)
SDFSDFSDFGhttps://dev.mysql.com/doc/refmhhttps://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_byttps://dhttps://https://dhttps://dev.mysql.com/doc/refman/5.7/en/group-by-handling.htmlev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_bydev.mysql.com/doc/refman/5.7/en/group-by-handling.htmlev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_byan/5.7/en/group-by-h
@mandeephub Have a look at this two links :https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by
_
@mandeephub Have a look at this two links :https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by
_
@mandeephub Have a look at this two links :https://dev.mysq
l.com/https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.htmldoc/refman/5.7/en/group-by-handling.html
https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by
_
@mandeephub Have a look at this two links :https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by
_
anhttps://dev.mysql.com/doc/refman/5.7/en/group-by-handling.htmldling.html
as i understood definitions are instructions on how classes should be instantiated once requested
im trying to create a definition for the class to call some method which will receive container itself
twig works good by my Model class doesnt. what is wrong ?
use Twig\Environment;
use Core\Model;
use Psr\Container\ContainerInterface;
return [
Environment::class => function () {
$loader = new \Twig\Loader\FilesystemLoader(__DIR__ . '/../App/Views');
return new \Twig\Environment($loader);
},
Model::class => function (ContainerInterface $container){
$model = new Model();
$model->setContainer($container)->getConnection();
return $model;
}
];
public function __construct()
{
}
public function setContainer(ContainerInterface $container)
{
$this->container = $container;
return $this;
}
public function getConnection()
{
$dbType = ucfirst($this->container->get('db.type'));
$class = self::DB_NAMESPACE . $dbType;
try {
$this->db = $this->container->get($class)->getConnection();
} catch (\Exception $e) {
echo $e->getMessage();
}
return $this->db;
}
/*
public function __construct(ContainerInterface $container)
{
$dbType = ucfirst($container->get('db.type'));
$class = self::DB_NAMESPACE . $dbType;
try {
$this->db = $container->get($class)->getConnection();
} catch (\Exception $e) {
echo $e->getMessage();
}
}
*/
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/
.