Upgrading from Slim 3 to Slim 4
Friday, September 18th, 2020 | Programming
Slim is one of my favourite PHP microframeworks and many websites are built on Slim 3. I have recently moved to Slim 4 and thought I would document the upgrade process for anyone else looking to make the leap.
Dependencies
Slim 3 came with its own dependency injection container. This is no longer the case. Therefore, we need to bring one in, such as php-di that Slim supports out-of-the-box. We will also need a PSR-7 library and the Slim HTTP helpers.
"slim/slim": "4.*",
"slim/psr7": "1.*",
"slim/http": "1.*",
"php-di/php-di": "^6.1",
Creating the app
In Slim 3, we created the app and then accessed the container.
$app = new \Slim\App([
'settings' => []
]);
$container = $app->getContainer();
In Slim 4, we create the container then attached it to the app.
$container = new \DI\Container();
\Slim\Factory\AppFactory::setContainer($container);
$app = \Slim\Factory\AppFactory::create();
You can still access the container in the old way and inject dependencies into it, but you need to manually pass it into the app as above.
Accessing dependencies
Now we are using our PSR-11 DI of choice, we need to change how we access our dependencies. Previously, wee could use the Slim shorthand.
$db = $this->ci->db;
Now we need to use the PSR-11 standard.
$db = $this->ci->get('db');
Exception handling
Previously, we could set error handling using the dependency injection container.
$container['notFoundHandler'] = function ($container) {
return function ($request, $response) use ($container) {
$controller = new \App\Controller\ExceptionController($container);
return $controller->notFound($request, $response);
};
};
In Slim 4, we need to use the bundled middleware.
$errorMiddleware = $app->addErrorMiddleware(true, true, true);
$errorMiddleware->setErrorHandler(
Slim\Exception\HttpNotFoundException::class,
function (Psr\Http\Message\ServerRequestInterface $request) use ($container) {
$controller = new App\Controller\ExceptionController($container);
return $controller->notFound($request);
});
This also means changing the exception controller, too, if you use one. In Slim 3, we would still get a response object passed in.
public function notFound(Request $request, Response $response)
{
return $this->render($response, 'not-found.html');
}
With Slim 4, we need to create our own.
public function notFound(Request $request)
{
$response = new \Slim\Psr7\Response;
return $this->render($response, 'not-found.html');
}
That should take care of most of the changes. If you run into anything else, let me know, and I’ll update this article.
Slim is one of my favourite PHP microframeworks and many websites are built on Slim 3. I have recently moved to Slim 4 and thought I would document the upgrade process for anyone else looking to make the leap.
Dependencies
Slim 3 came with its own dependency injection container. This is no longer the case. Therefore, we need to bring one in, such as php-di that Slim supports out-of-the-box. We will also need a PSR-7 library and the Slim HTTP helpers.
"slim/slim": "4.*", "slim/psr7": "1.*", "slim/http": "1.*", "php-di/php-di": "^6.1",
Creating the app
In Slim 3, we created the app and then accessed the container.
$app = new \Slim\App([ 'settings' => [] ]); $container = $app->getContainer();
In Slim 4, we create the container then attached it to the app.
$container = new \DI\Container(); \Slim\Factory\AppFactory::setContainer($container); $app = \Slim\Factory\AppFactory::create();
You can still access the container in the old way and inject dependencies into it, but you need to manually pass it into the app as above.
Accessing dependencies
Now we are using our PSR-11 DI of choice, we need to change how we access our dependencies. Previously, wee could use the Slim shorthand.
$db = $this->ci->db;
Now we need to use the PSR-11 standard.
$db = $this->ci->get('db');
Exception handling
Previously, we could set error handling using the dependency injection container.
$container['notFoundHandler'] = function ($container) { return function ($request, $response) use ($container) { $controller = new \App\Controller\ExceptionController($container); return $controller->notFound($request, $response); }; };
In Slim 4, we need to use the bundled middleware.
$errorMiddleware = $app->addErrorMiddleware(true, true, true); $errorMiddleware->setErrorHandler( Slim\Exception\HttpNotFoundException::class, function (Psr\Http\Message\ServerRequestInterface $request) use ($container) { $controller = new App\Controller\ExceptionController($container); return $controller->notFound($request); });
This also means changing the exception controller, too, if you use one. In Slim 3, we would still get a response object passed in.
public function notFound(Request $request, Response $response) { return $this->render($response, 'not-found.html'); }
With Slim 4, we need to create our own.
public function notFound(Request $request) { $response = new \Slim\Psr7\Response; return $this->render($response, 'not-found.html'); }
That should take care of most of the changes. If you run into anything else, let me know, and I’ll update this article.