Obullo / Stack (Psr15 Middleware)

Build Status Software License Total Downloads

Obullo http katmanı Node.Js Express 4 middleware kütüphanesinin psr15 standartlarına uyarlanmış versiyonudur.

Http katmanları http çözümlemesinden önce $request yada response nesnelerini etkilemek için kullanılırlar. Her bir katman uygulamayı sarar ve merkeze doğru ilerledikçe uygulamaya ulaşılır.Böylece uygulamanın çalışmaya başlamasından önceki ve sonraki aşamalar kontrol altına alınmış olur.

Express 4 middleware

router.use(function(req, res, next) {
    if (!req.route)
        return next (new Error('404'));  
    next();
});

Obullo Psr15 middleware

class SendResponse implements MiddlewareInterface
{
    public function process(Request $request, RequestHandler $handler) : ResponseInterface
    {
        $router = $this->getContainer()->get('router');
        $response = null;
        if ($router->hasMatch()) {  // Dispatch application
            // $response = call_user_func_array(array($class, $method),$parameters);
        }
        if ($response instanceof ResponseInterface) {
            return $response;
        }
        return $handler->process(new Error('404'));
    }
}

Bu yaklaşım bir middleware içerisinden başka bir middleware çağırmaya olanak sağlar.

Yükleme

$ composer require obullo/stack

Minumum gereksinim

Bu versiyon php dilinin aşağıdaki sürümlerini destekler.

Test etme

$ vendor/bin/phpunit

Başlangıç

Aşağıda listelen middleware dosyalarını projenizin App\Middleware dosyası içerisine yerleştirin. Sonraki adımda aşağıdaki gibi çözümlemeyi gerçekleştirin.

require '../vendor/autoload.php';

use App\Middleware\{
    Error,
    Router,
    NotAllowed,
    ParsedBody,
    Dummy
};
use Obullo\Stack\Builder as Stack;

$request = Zend\Diactoros\ServerRequestFactory::fromGlobals();

$stack = new Stack;
$stack = $stack->withMiddleware(new Error)
    ->withMiddleware(new Router);

$response = $stack->process($request);

echo $response->getBody();

Dizi yöntemi

require '../vendor/autoload.php';

use App\Middleware\{
    Error,
    Router,
    NotAllowed,
    ParsedBody,
    Dummy
};
use Obullo\Stack\Builder as Stack;

$request = Zend\Diactoros\ServerRequestFactory::fromGlobals();

$queue = [
    new Error,
    new Dummy,
    new Router
];
$stack = new Stack;
foreach ($queue as $value) {
    $stack = $stack->withMiddleware($value);
}
$response = $stack->process($request);

echo $response->getBody();

StackHandler Http\Stack\StackInterface arayüzünü kullanır.

Psr7 konteyner desteği

Psr7\Container\ContainerInterface arayüzünü kullanan herhangi bir konteyner sınıfı dışarıdan aşağıdaki gibi construct() metodu ile Stack sınıfına tanımlanabilir.

use Obullo\Stack\Builder as Stack;

$container = new Container;
$queue = [
    new Error,
    new Dummy,
    new Router,
];
$stack = new Stack($container);
foreach ($queue as $value) {
    $stack = $stack->withMiddleware($value);
}

Eğer katmanlardan biri aşağıdaki gibi bir ContainerAwareInterface arayüzünü kullanıyorsa bu katmana konteyner sınıfınız otomatik olarak enjekte edilir.

use Psr\Container\ContainerInterface;

interface ContainerAwareInterface
{
    /**
     * Set container
     * 
     * @param ContainerInterface $container container
     */
    public function setContainer(ContainerInterface $container);

    /**
     * Get container
     * 
     * @return object
     */
    public function getContainer() : ContainerInterface;
}

ContainerAwareInterface arayüzü kullanan örnek bir middleware.

namespace App\Middleware;

class ParsedBody implements MiddlewareInterface, ContainerAwareInterface
{
    use ContainerAwareTrait;
    ...
}

Katmanlar

Error middleware

Bu katman varsayılan olarak uygulamada tanımlıdır. Php7 istisnai hatalarını yakalayarak uygulama hatalarının tek bir yerden yönetilmesini sağlar.

Aynı zamanda Router katmanını vasıtası ile error yönetimini üstlenebilir.

Uygulamanızın Json,Html, Xml gibi yanıt türleri ile hata çıktılaması için özelleştirilebilir.

NotAllowed middleware

NotAllowed katmanı uygulamaya gelen http istek türlerini kısıtlamanızı sağlar.

Eğer uygulamanıza http PUT türünde bir istek gelirse NotAllowed katmanı içerisindeki response nesnesi, uygulama çalıştırılmadan aşağıdaki gibi bir hata ile sonlanır.

Only Http GET, POST Methods Allowed

ParsedBody middleware

Web servisinize json,xml gibi medya türlerinde gelen verileri http raw biçimine dönüştürür.

SendResponse middleware

Uygulama çözümlendikten sonra tarayıcıya yanıt göndermek için son ara katmandır.