Hi, i want extend the slim\app class but i am getting this error message.
[07-Jun-2024 13:06:51 UTC] PHP Fatal error: Uncaught TypeError: DI\Definition\Source\DefinitionFile::{closure}(): Argument #1 ($app) must be of type Ultra\Foundation\App, Slim\App given, called in /home/myphp/public_html/myph/config/container.php on line 18 and defined in /home/myphp/public_html/myphp/routes/web.php:12
Stack trace:
This is what i have tried.
App.php
<?php
declare(strict_types=1);
namespace Ultra\Foundation;
use Slim\App;
//use Slim\Factory\AppFactory;
class App extends Slim\App
{
i don’t know what i am doing wrong,
i need help.
odan
June 7, 2024, 4:04pm
2
Somewhere in you application you are passing a Slim\App instance instead of your custom App instance.
Check the file container.php on line 18 to see where it is coming from.
I guess it’s a incorrect using
statement, because the classname is App in both cases.
Thanks, i will check and get back to you.
Still not working.
this is my container.php
<?php
declare(strict_types=1);
use Psr\Container\ContainerInterface;
use Ultra\Foundation\App;
use Slim\Factory\AppFactory;
use Slim\Views\Twig;
return [
'settings' => function () {
return require __DIR__ . '/../config/settings.php';
},
App::class => function (ContainerInterface $container) {
$app = AppFactory::createFromContainer($container);
// Require routes
(require __DIR__ . '/../routes/web.php')($app);
//Require middlewares
(require __DIR__ . '/../app/Http/Middlewares/middleware.php')($app);
return $app;
},
Twig::class => function (ContainerInterface $container): Twig {
/** @var array<string, array<string, mixed>> $settings */
$settings = $container->get('settings');
$options = [
'debug' => $settings['app']['debug'],
'cache' => $settings['view']['cache'],
];
/** @var string $path */
$path = $settings['view']['path'];
$twig = Twig::create($path, $options);
/** @var Translator $translator */
//$translator = $container->get(Translator::class);
//$twig->getEnvironment()->addGlobal('locale', $translator->getLocale());
//$twig->addExtension(new TranslationExtension($translator));
return $twig;
},
];
and this is my route/web.php
<?php
declare(strict_types=1);
use App\Controllers\AboutController;
use App\Controllers\ContactController;
use App\Http\Controllers\IndexController;
return static function (Ultra\Foundation\App $app): void {
$app->get('/', [IndexController::class, 'index'])->setName('home.index');
$app->get('/about', [AboutController::class, 'index'])->setName('about.index');
$app->get('/contact', [ContactController::class, 'index'])->setName('contact.index');
};
Please take a look. thanks
In container.php
, you are using Slim’s AppFactory
here:
$app = AppFactory::createFromContainer($container);
This returns in instance of Slim\App
as you can see here: Slim/Slim/Factory/AppFactory.php at 4.x · slimphp/Slim · GitHub .
You will need your own AppFactory
.
1 Like
tiara
June 26, 2024, 10:01am
7
Thanks it helped me too:)
1 Like
Hello,
Thanks for the solution ,this is very helpful for me.