awurth/slim-helpers
Lightweight helper collection for Slim Framework apps, adding convenient Twig integration, validation, and common view utilities so you can cut boilerplate and build routes faster.
awurth/slim-helpers is a small utility layer for Slim 3 — not Slim 4. It exists to remove the boilerplate you would otherwise copy into every controller (rendering Twig, returning JSON, redirecting, wiring the container) and to ship the error/shutdown handlers that the Slim docs only give you as sample code.
composer require awurth/slim-helpers
Before you write anything, check two things in the repo: the composer.json (PHP and slim/slim version constraints — this package predates Slim 4 and its PHP floor is old) and the src/ tree. The whole package is roughly a dozen files, so reading src/Controller/AbstractController.php and src/Handler/ end-to-end takes ten minutes and is more reliable than any tutorial.
The first use case is a controller that stops repeating response plumbing:
<?php
namespace App\Controller;
use Awurth\Slim\Helper\Controller\AbstractController;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
final class HomeController extends AbstractController
{
public function index(Request $request, Response $response): Response
{
return $this->render($response, 'home.twig', ['title' => 'Home']);
}
public function api(Request $request, Response $response): Response
{
return $this->json($response, ['ok' => true]);
}
}
Register it in dependencies.php (the base class is container-aware, so hand it the container when you build it):
$container[App\Controller\HomeController::class] = function ($c) {
$controller = new App\Controller\HomeController();
$controller->setContainer($c); // confirm the exact method in AbstractController
return $controller;
};
$app->get('/', App\Controller\HomeController::class . ':index')->setName('home');
Controller-per-resource with DIC factories. Every controller extends AbstractController and gets its dependencies from the container factory, not from the constructor. This keeps routes as simple one-liners (HomeController::class . ':index') and means you can add a render()/json()/redirect() helper without importing anything.
Named routes + path_for. Because controllers are route-addressable and Slim 3's Twig extension already gives you path_for/url_for in templates, the natural workflow is: name every route in routes.php, build links by name in Twig, and return $this->redirect($response, 'home')-style redirects from controllers instead of hardcoded paths. If the base class accepts a route name, this is the single biggest day-to-day win.
Flash + validation as controller conveniences. If the sibling packages are installed (slim/flash, and the author's awurth/slim-validation), the base controller is the intended entry point for pulling the validator/flash service instead of reaching into $this->container->get(...) in every action. Confirm the accessor names in AbstractController before relying on them.
Register the bundled error handlers once, in dependencies.php. The package ships the HttpErrorHandler/ShutdownHandler pair from Slim's example app. Registering them there means PHP fatals and uncaught exceptions render your Twig error page instead of a blank 500 — and the shutdown handler must be registered before $app->run().
Copy, don't couple, where it's cheap. These are thin classes. If you only want render()/json()/redirect(), copying AbstractController into App\Controller and deleting the rest of the package is a legitimate pattern for an archived dependency.
Container, $app->getContainer(), and callable-string routes. Slim 4 removed the container from the app and moved to PSR-15 middleware — porting means rewriting the controller base and both handlers, not upgrading a constraint.setContainer() must be called before any helper runs, or you get a null/fatal deep inside a helper rather than at the call site. It also makes unit-testing controllers awkward; write feature tests through the app, or refactor to constructor injection as you touch each controller.render() needs a view service. It assumes slim/twig-view is registered under view in the container. Without it, you get a container-not-found error that looks like a package bug but is a wiring bug. Same for flash messages and slim/flash.displayErrorDetails in production. The bundled handlers happily render exception details when that setting is true. Gate it on an environment variable; also verify the shutdown handler doesn't double-render after the error handler has already produced a response.composer.json before dropping it into a modern runtime, and expect deprecation noise on PHP 8.var_dump(array_keys($this->container->get('settings'))) and open the actual src/ file — with no community Q&A for this package, the source is the only authoritative doc.How can I help you explore Laravel packages today?