1. Go to this page and download the library: Download brtriver/karen library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
brtriver / karen example snippets
= new class extends Karen\Framework\Karen {
public function action($map)
{
// hello name controller sample.
$map->get('hello', '/hello/{name}', function($args, $controller) {
$name = $args['name']?? 'karen';
return $controller->render('[Karen] Hello, ' . $name);
})->tokens(['name' => '.*']);
// with twig
$map->get('render_with_twig', '/template/{name}', function($args, $controller) {
return $controller->renderWithT('demo.html', ['name' => $args['name']]);
});
return $map;
}
};
$app->run();
$app->sendResponse();
$app = new YourFramework(); // YourFramework class extends Application class and implement your logic.
$app->run();
$app->sendResponse();
$c['controller'] = new Controller();
$c['controller'] = function($c) {
$controller = new class extends Controller{
use Templatable;
};
$controller->setTemplate($c['template']);
return $controller;
};
public function run()
{
$this->container();
$this->middleware();
$this->route();
$this->response();
}
public function container()
{
$this->c = new Container();
$this->c['template'] = function($c) {
$loader = new \Twig_Loader_Filesystem( __DIR__ . '/../../templates');
return new \Twig_Environment($loader, array(
'cache' => '/tmp/',
));
};
}
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\RequestInterface as Request;
function (
Request $request, // the request
Response $response, // the response
callable $next // the next middleware
) {
// ...
}
public function middleware()
{
// if open http://localhost:8888/hello/ssss?status=404, response status is set to 404
$this->addQueue('changeStatus', function (Request $request, Response $response, callable $next) {
$response = $next($request, $response);
$status = $request->getQueryParams()['status']?? null;
if ($status) {
$response = $response->withStatus((int)$status);
}
return $response;
});
}
public function route()
{
$map = $this->c['router']->getMap();
// define routes at an action method in an extended class
$map->get('hello', '/hello/{name}', function($args, $controller) {
$name = $args['name']?? 'karen';
return $controller->render('[Karen] Hello, ' . $name);
})->tokens(['name' => '.*']);
$this->route = $this->c['router']->getMatcher()->match($this->request);;
}
public function route()
{
$map = $this->c['router']->getMap();
// define routes at an action method in an extended class
$map = $this->action($map);
$this->route = $this->c['router']->getMatcher()->match($this->request);;
}
$app = new class extends Karen\Framework\Karen {
public function action($map)
{
// hello name controller sample.
$map->get('hello', '/hello/{name}', function($args, $controller) {
$name = $args['name']?? 'karen';
return $controller->render('[Karen] Hello, ' . $name);
})->tokens(['name' => '.*']);
return $map;
}
};
public function response(){
if (!$this->route) {
$response =$this->response->withStatus(404);
$response->getBody()->write('not found');
return;
}
// parse args
$args = [];
foreach ((array)$this->route->attributes as $key => $val) {
$args[$key] = $val;
}
// add route action to the queue of Midlleware
$this->addQueue('action', $this->c['controller']->actionQueue($this->route->handler, $args));
}
public function response(){
switch ($this->route[0]) {
case \FastRoute\Dispatcher::NOT_FOUND:
echo "Not Found\n";
break;
case \FastRoute\Dispatcher::FOUND:
$handler = $this->route[1];
$args = $this->route[2];
$this->addQueue('action', $this->c['controller']->actionQueue($handler, $args));
break;
default:
throw new \LogicException('Should not reach this point');
}
}