anton-am/phalcon-middleware

Middleware component for Phalcon.

4.0.0 2023-02-02 08:10 UTC

This package is auto-updated.

Last update: 2024-04-30 00:33:06 UTC


README

Middleware component for Phalcon MVC controllers

Latest Stable Version Total Downloads Build Status

Installing

Install using Composer:

composer require anton-am/phalcon-middleware

or add to your composer.json

"anton-am/phalcon-middleware": "^3.0.0"

You'll need to add the event to the dispatcher DI service:

use AntonAm\Phalcon\Middleware\Event;
use Phalcon\Events\Manager;
use Phalcon\Mvc\Dispatcher;

// ...

$di->set(
    "dispatcher",
    function () use ($di) {
            $eventsManager = new Manager();
            
            //Attach a listener
            $eventsManager->attach(
                'dispatch:beforeExecuteRoute',
                new Event()
            );

            $dispatcher = new Dispatcher();
            $dispatcher->setEventsManager($eventsManager);
            return $dispatcher;
    },
    true
);

Now, you can create middleware classes:

namespace Modules\Frontend\Middlewares;

use Phalcon\Mvc\User\Plugin;
use AntonAm\Phalcon\Middleware\MiddlewareInterface;

/**
 * Class CSRF
 *
 * @package Modules\Frontend\Middlewares
 */
class CSRF extends Plugin implements MiddlewareInterface
{
    /**
     * @param array $params
     * @return bool
     */
    public function handle(array $params = []): bool
    {
        if (!$this->security->checkToken()) {
            $this->flashSession->error('Wrong CSRF');
            $this->response->redirect($this->request->getHTTPReferer(), true)->send();
            return false;
        }

        return true;
    }

Example

Controller

class IndexController extends \Phalcon\Mvc\Controller
{
    /**
     * @Middleware("Modules\Frontend\Middlewares\MustBeLoggedIn")
     * @Middleware("Modules\Frontend\Middlewares\HasProject")
     * @Middleware("Modules\Frontend\Middlewares\MustBeInProjectAs", "Creator")
     * @Middleware("Modules\Frontend\Middlewares\CSRF")
     */
    public function indexAction()
    {
        // ...
    }
}