Skip to content

Commit

Permalink
Create dispatcher
Browse files Browse the repository at this point in the history
  • Loading branch information
dederobert committed Aug 23, 2017
1 parent fc2ed50 commit bdc7499
Show file tree
Hide file tree
Showing 4 changed files with 88 additions and 3 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
/.idea

/vendor/
composer.lock
12 changes: 10 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,17 @@
{
"name": "hovensoft/duskphp",
"name": "hovensoft/duskphp-core",
"description": "A simple PHP framework",
"type": "project",
"require": {
"http-interop/response-sender": "^1.0"
"http-interop/response-sender": "^1.0",
"http-interop/http-middleware": "0.4.1",
"psr/http-message": "1.0.1",
"guzzlehttp/psr7": "1.4.2"
},
"autoload": {
"psr-4": {
"DuskPHP\\": "src/"
}
},
"license": "GNU General Public License v3.0",
"authors": [
Expand Down
7 changes: 6 additions & 1 deletion index.php
Original file line number Diff line number Diff line change
@@ -1 +1,6 @@
<?php
<?php

require 'vendor/autoload.php';

use function Http\Response\send;

70 changes: 70 additions & 0 deletions src/Dispatcher.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
<?php

namespace DuskPHP;

use GuzzleHttp\Psr7\Response;
use Interop\Http\ServerMiddleware\DelegateInterface;
use Interop\Http\ServerMiddleware\MiddlewareInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;

/**
* Class Dispacher
* @package DuskPHP
*/
class Dispatcher implements DelegateInterface
{

/**
* @var array
*/
private $middlewares = [];

/**
* @var int
*/
private $index = 0;

private $response;

function __construct()
{
$this->response = new Response();
}

/**
* Save a new middleware
*
* @param callable|MiddlewareInterface $middleware
*/
public function pipe($middleware)
{
$this->middlewares[] =$middleware;
}

/**
* Dispatch the next available middleware and return the response.
*
* @param ServerRequestInterface $request
*
* @return ResponseInterface
*/
public function process(ServerRequestInterface $request)
{
$middleware = $this->getMiddleware();
$this->index++;
if (is_null($middleware))
return $this->response;
if(is_callable($middleware))
return $middleware($request, $this->response, [$this, 'process']);
if ($middleware instanceof MiddlewareInterface)
return $middleware->process($request, $this);
}

private function getMiddleware() {
if (isset($this->middlewares[$this->index]))
return $this->middlewares[$this->index];
return null;
}

}

0 comments on commit bdc7499

Please sign in to comment.