Simplex
Our application will have four different layers.
require_once __DIR__.'/../vendor/autoload.php';
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\Matcher\UrlMatcher;
use Symfony\Component\HttpKernel\Controller\ControllerResolver;
use Symfony\Component\HttpKernel\Controller\ArgumentResolver;
$request = Request::createFromGlobals();
$routes = include __DIR__.'/../src/app.php';
$context = new RequestContext();
$context->fromRequest($request);
$matcher = new UrlMatcher($routes, $context);
$controllerResolver = new ControllerResolver();
$argumentResolver = new ArgumentResolver();
$framework = new Simplex\Framework(
$matcher, $controllerResolver, $argumentResolver
);
$response = $framework->handle($request);
$response->send();
App
The application configuration src/app.php
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;
$routes = new RouteCollection();
$routes->add('isEven', new Route('/isEven/{no}', [
'no' => null,
'_controller' =>
'NumberChecker\Controller\CheckNumberController::index',
]));
return $routes;
Simplex
The reusable framework Simplex that abstacts the handling of Requests.
namespace Simplex;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Matcher\UrlMatcher;
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
use Symfony\Component\HttpKernel\Controller\ControllerResolver;
use Symfony\Component\HttpKernel\Controller\ArgumentResolver;
class Framework
{
private $matcher;
private $controllerResolver;
private $argumentResolver;
public function __construct(UrlMatcher $matcher,
ControllerResolver $controllerResolver,
ArgumentResolver $argumentResolver)
{
$this->matcher = $matcher;
$this->controllerResolver = $controllerResolver;
$this->argumentResolver = $argumentResolver;
}
public function handle(Request $request)
{
try {
$request->attributes->add(
$this->matcher->match($request->getPathInfo())
);
$controller =$this->controllerResolver->getController($request);
$arguments =$this->argumentResolver
->getArguments($request, $controller);
return call_user_func_array($controller, $arguments);
} catch(ResourceNotFoundException $e) {
return new Response('Not found', 404);
} catch (\Exception $e) {
return new Response('An error occured', 500);
}
}
}
Render
The render controller is moved to NumberChecker module.
namespace NumberChecker\Controller;
use NumberChecker\Model\NumberModel;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class CheckNumberController
{
public function index (Request $request, $no)
{
$model = new NumberModel();
if ($model->isEven($no)) {
return new Response("The number is even");
}
return new Response("The number is odd of null");
}
}
namespace NumberChecker\Model;
class NumberModel
{
public function isEven($no)
{
return $no % 2 == 0;
}
}