Simple handler-based router middleware for the php-lambda-runtime library.
Run composer require netolabs/php-lambda-router netolabs/php-lambda-runtime
from the root of your project.
The Router middleware is used to route our Lambda to a Controller and Action, much like an MVC framework would. The difference being that instead of routing based on the request path, we use the Lambda handler name. This allows us to have multiple Lambda functions inside the same repository and also allowing more reuse of code.
The handler name is expected in the format of "controller.action". Internally, the router will attempt to load the controller and check if the action method exists. If not, it will pass the request on to the next middleware in the queue; usually a fallback or a 404 middleware.
For example: if the handler name is helloworld.get, the router will attempt to load the \App\Controller\HelloworldController
class and execute the method getAction($request)
.
The default namespace is \App\Controller\
, however this is configurable via constructor parameter.
In this example we're using the Router to route our Lambda to a Controller and Action.
It includes an exception handler and a fallback which returns a 404 response if the route isn't matched.
In your app.php
use the following code:
<?php
$app = \Neto\Lambda\Application\AppFactory::create();
$app->addMiddleware(new \Neto\Lambda\Middleware\ExceptionHandler(true))
->addMiddleware(new \Neto\Lambda\Middleware\HandlerRouter(getenv('_HANDLER')))
->addMiddleware(new \Neto\Lambda\Middleware\FileNotFound())
->run();
Controllers are autoloaded using the Lambda handler name and must conform to the PSR-4 standard.
mkdir -p src/App/Controller
touch src/App/Controller/AppController.php
src/App/Controller/AppController.php:
<?php
namespace App\Controller;
use GuzzleHttp\Psr7\Response;
use Neto\Lambda\Controller\AbstractController;
class AppController extends AbstractController
{
public function helloworldAction(RequestInterface $request)
{
return new Response(200, [], '<h1>Hello world!</h1>');
}
}
Now run it using vendor/bin/invoke -h app.helloworld
.
You'll notice we are using "app.helloworld" as our handler name - this is used to resolve our controller class
(AppController) and action method (HelloworldAction).
Both the Router middleware and the AbstractController implement the ContainerAwareInterface.
If you'd like to use a DI container, you only need to inject it into the HandlerRouter either via constructor or method.
The container object (when set) will also be injected automatically into controllers during instantiation.
Because this library uses PHP-DI's invoker, you can use typed parameters for your action methods in any order
and we will attempt to resolve them in your PSR-11 container using either the parameter type or the parameter name.
The MIT License (MIT). Please see the License File for more information.