Last active
September 25, 2015 07:19
-
-
Save Isinlor/c0e44755f2e989bb679f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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