Skip to content

Instantly share code, notes, and snippets.

@Isinlor
Last active September 25, 2015 07:19
Show Gist options
  • Save Isinlor/c0e44755f2e989bb679f to your computer and use it in GitHub Desktop.
Save Isinlor/c0e44755f2e989bb679f to your computer and use it in GitHub Desktop.
<?php
interface Middelware {
public function run(Request $request, Response $response, Pipe $next);
}
interface Pipe {
public function __invoke(Request $request, Response $response);
}
interface MiddelwarePipe {
public function add(Middelware $middelware);
}
interface RoutePipe {
public function add($path, Middelware $middelware);
}
interface Session {
public function setSessionId($sessionId);
public function set($key, $value);
public function get($key);
}
interface Auth {
public function isAddmin($userId);
}
interface HttpClient {
public function send(Response $response);
}
class SimplePipe implements Pipe {
private $middelwares = [];
public function add(Middelware $middelware) {
$this->middelwares[] = $middelware;
}
public function __invoke(Request $request, Response $response) {
if(empty($this->middelwares)) {
return $response;
}
$nextMiddelware = array_shift($this->middelwares);
return $nextMiddelware->run($request, $response, $this);
}
}
class RoutePipeMiddelware implements Pipe, RoutePipe, Middelware {
private $middelwares = [];
private $path;
public function add($path, Middelware $middelware) {
$this->middelwares[$path][] = $middelware;
}
public function run(Request $request, Response $response, Pipe $next) {
$this->path = $request->getPath();
$response = $this->__invoke($request, $response);
return $next($request, $response);
}
public function __invoke(Request $request, Response $response) {
if(empty($this->middelwares[$this->path])) {
return $response;
}
$nextMiddelware = array_shift($this->middelwares[$this->path]);
return $nextMiddelware->run($request, $response, $this);
}
}
class SessionMiddelware implements Middelware {
private $session;
public function __construct(Session $session) {
$this->session = $session;
}
public function run(Request $request, Response $response, Pipe $next) {
$this->session->setSessionId($request->get('session_id'));
return $next($request, $response);
}
}
class AuthMiddelware implements Middelware {
private $session;
private $auth;
public function __construct(Session $session, Auth $auth) {
$this->session = $session;
$this->auth = $auth;
}
public function run(Request $request, Response $response, Pipe $next) {
$userId = $this->session->get('user_id');
if(!$auth->isAdmin($userId)) {
return $response->status('303');
}
return $next($request, $response);
}
}
class AdminMiddelware implements Middelware {
public function run(Request $request, Response $response) {
return $response->setBody('Admin panel');
}
}
class SimpleSession {
public function setSessionId($sessionId) {}
public function set($key, $value) {}
public function get($key) {}
}
class SimpleAuth {
public function isAdmin($userId) {}
}
class SimpleHttpClient implements HttpClient {
public function send(Request $response) {}
}
$session = new SimpleSession;
$auth = new SimpleAuth;
$pipe = new SimplePipe;
$pipe->add(new SessionMiddelware($session));
$routePipe = new RoutePipeMiddelware();
$routePipe->add('\admin', new AuthMiddelware($session, $auth));
$routePipe->add('\admin', new AdminMiddelware);
$pipe->add($routePipe);
$request = new Request;
$response = new Response;
$response = $pipe($request, $response);
$httpClient = new HttpClient;
$httpClient->send($response);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment