PHPackages                             kafkiansky/symfony-middleware - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Framework](/categories/framework)
4. /
5. kafkiansky/symfony-middleware

ActiveLibrary[Framework](/categories/framework)

kafkiansky/symfony-middleware
=============================

PSR-15 Middleware for symfony.

1.0.0(2y ago)7959.6k—8.3%2[3 issues](https://github.com/kafkiansky/symfony-middleware/issues)MITPHPPHP ^8.2

Since Aug 24Pushed 2y ago3 watchersCompare

[ Source](https://github.com/kafkiansky/symfony-middleware)[ Packagist](https://packagist.org/packages/kafkiansky/symfony-middleware)[ RSS](/packages/kafkiansky-symfony-middleware/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (3)Dependencies (12)Versions (10)Used By (0)

PSR-15 middleware now in Symfony
================================

[](#psr-15-middleware-now-in-symfony)

[![test](https://github.com/kafkiansky/symfony-middleware/workflows/test/badge.svg?event=push)](https://github.com/kafkiansky/symfony-middleware/workflows/test/badge.svg?event=push)[![Codecov](https://camo.githubusercontent.com/f08f9c100f4a2039e17353ecaa897fd44d28dfce9c03e06aa98c0545721bc537/68747470733a2f2f636f6465636f762e696f2f67682f6b61666b69616e736b792f73796d666f6e792d6d6964646c65776172652f6272616e63682f6d61737465722f67726170682f62616467652e737667)](https://codecov.io/gh/kafkiansky/symfony-middleware)[![Software License](https://camo.githubusercontent.com/55c0218c8f8009f06ad4ddae837ddd05301481fcf0dff8e0ed9dadda8780713e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d627269676874677265656e2e7376673f7374796c653d666c61742d737175617265)](LICENSE.md)[![Total Downloads](https://camo.githubusercontent.com/65c80e58ec7cec953ea7ebacb9e4b6097ec7d3b9d85c0ea1769f9f99c5346a6d/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f6b61666b69616e736b792f73796d666f6e792d6d6964646c65776172652e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/kafkiansky/symfony-middleware)[![Quality Score](https://camo.githubusercontent.com/87104bcc259681a055a94daf22a74d97fc5033f07a653e50cd4553b4490eb967/68747470733a2f2f696d672e736869656c64732e696f2f7363727574696e697a65722f672f6b61666b69616e736b792f73796d666f6e792d6d6964646c65776172652e7376673f7374796c653d666c61742d737175617265)](https://scrutinizer-ci.com/g/kafkiansky/symfony-middleware)

### Contents

[](#contents)

- [Installation](#installation)
- [Configuration](#configuration)
- [Usage](#usage)
- [Examples](#examples)
- [Customization](#customization)
- [Caching](#caching)
- [Real World Example](#real-world-example)
- [Middlewares](#middlewares)
- [Testing](#testing)
- [License](#license)

Installation
------------

[](#installation)

```
composer require kafkiansky/symfony-middleware
```

Configuration
-------------

[](#configuration)

Ensure you have added bundle in `config/bundles.php`:

```
Kafkiansky\SymfonyMiddleware\SymiddlewareBundle::class => ['all' => true],
```

Create the configuration file in `packages/symiddleware.yaml`:

```
symiddleware:
  global:
    ##
```

Usage
-----

[](#usage)

Each middleware must implement the `Psr\Http\Server\MiddlewareInterface` interface. Thanks for symfony autoconfiguration now the middleware registry knows your middleware.

So that middlewares can start execution, they must be defined on controller class and/or on controller method.

```
use Kafkiansky\SymfonyMiddleware\Attribute\Middleware;

#[Middleware([ValidatesQueryParams::class])]
final class SomeController
{
    #[Middleware([ConvertStringsToNull::class])]
    public function index(): void
    {

    }
}
```

If controller is invokable, middleware can be defined just on controller class:

```
use Kafkiansky\SymfonyMiddleware\Attribute\Middleware;

#[Middleware([ValidatesQueryParams::class, ConvertStringsToNull::class])]
final class SomeController
{
    public function __invoke(): void
    {
    }
}
```

#### groups

[](#groups)

If you want to use the list of middlewares, you can define middleware group inside `symfony_middleware.yaml` configuration file:

```
symiddleware:
  groups:
    debug:
      if: '%env(RUN_DEBUG_MIDDLEWARE)%'
      middlewares:
        - 'App\Middleware\TrackRequestTime'
        - 'App\Middleware\EnableSqlLogger'
```

Now define this middleware on controller class or method:

```
use Kafkiansky\SymfonyMiddleware\Attribute\Middleware;

#[Middleware(['debug'])]
final class SomeController
{
    public function __invoke(): void
    {
    }
}
```

Pay attention to the `if` parameter in configuration file. This parameter tells the middleware runner when the middleware group can be run. If false, this middleware will not be executed.

#### global

[](#global)

If you want to run the list of middleware every request, you need the `global` middleware section. This keyword is reserved and `if` parameter is not supported.

```
symiddleware:
  global:
      - App\Controller\SetCorsHeaders
  groups:
    web:
      middlewares:
        - 'App\Middleware\ModifyRequestMiddleware'
```

Now the `App\Controller\SetCorsHeaders` middleware will execute on every request.

Examples
--------

[](#examples)

1. Simple middleware that modifies request:

```
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Psr\Http\Message\ResponseInterface;

final class ModifyRequestMiddleware implements MiddlewareInterface
{
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
    {
        return $handler->handle($request->withAttribute(__CLASS__, 'handled'))
    }
}
```

2. Middleware that modifies response:

```
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Psr\Http\Message\ResponseInterface;

final class ModifyResponseMiddleware implements MiddlewareInterface
{
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
    {
        $response = $handler->handle($request)

        return $response->withHeader('x-developer', 'kafkiansky');
    }
}
```

3. Middleware that stop execution:

```
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Psr\Http\Message\ResponseInterface;
use Nyholm\Psr7\Response;

final class StopExecution implements MiddlewareInterface
{
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
    {
        $response = new Response(200, [], json_encode(['success' => false]));

        return $response;
    }
}
```

In this example controller will not be executed.

4. Stop execution with symfony response:

```
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Psr\Http\Message\ResponseInterface;
use Nyholm\Psr7\Response;
use Kafkiansky\SymfonyMiddleware\Psr\PsrResponseTransformer;
use Symfony\Component\HttpFoundation\JsonResponse;

final class StopExecution implements MiddlewareInterface
{
    private PsrResponseTransformer $psrResponseTransformer;

    public function __construct(PsrResponseTransformer $psrResponseTransformer)
    {
        $this->psrResponseTransformer = $psrResponseTransformer;
    }

    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
    {
        return $this->psrResponseTransformer->toPsrResponse(new JsonResponse(['success' => false]));
    }
}
```

You can compose middleware group with single middleware, use list of `Middleware` attributes and so on. All the following examples will work:

```
use Kafkiansky\SymfonyMiddleware\Attribute\Middleware;

#[Middleware(['debug', 'api', SomeMiddleware::class])]
#[Middleware([SomeAnotherMiddleware::class])]
final class SomeController
{
    public function __invoke(): void
    {
    }
}
```

```
use Kafkiansky\SymfonyMiddleware\Attribute\Middleware;

#[Middleware(['debug', 'api', SomeMiddleware::class])]
final class SomeController
{
    #[Middleware([SomeAnotherMiddleware::class, 'web'])]
    #[Middleware(['tracking'])]
    public function index(): void
    {
    }
}
```

Also, you can use nested groups:

```
symiddleware:
  global:
      - App\Controller\SetCorsHeaders
      - web
  groups:
    web:
      middlewares:
        - 'App\Middleware\ModifyRequestMiddleware'
        - debug
    debug:
      if: false
      middlewares:
        - 'App\Middleware\LogSqlQuery'
```

Duplicated middlewares will be removed.

Customization
-------------

[](#customization)

PSR middlewares and Symfony has different incompatible Request objects. If your middleware going to change the request object, only `attributes`, `query params`, `headers` and `parsed body` will be copied from psr request to symfony request. If you wish to change this behaviour, you may change the `Kafkiansky\SymfonyMiddleware\Psr\PsrRequestCloner` interface binding it to your realization.

Caching
-------

[](#caching)

Package use caching on production environment to prevent reflection usage. First of all, package will search of the `app.cache_middleware` parameter. If package doesn't find it, it's going to use the `kernel.environment` definition and will cache attributes when it set to `prod`.

Package will cache all controllers even if it doesn't found the attributes for it. This approach will allow to remember all the controllers and not use reflection further.

Real World Example
------------------

[](#real-world-example)

Imagine that you have some endpoints which requires authorization access via basic. Write middleware:

```
# services.yaml

services:
    _defaults:
        autowire: true
        autoconfigure: true

        bind:
            $basicUser: 'root'
            $basicPassword: 'secret'
```

```
// Authorization Middleware

use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Psr\Http\Message\ResponseInterface;
use Nyholm\Psr7\Response;

final class AuthorizeRequests implements MiddlewareInterface
{
    private string $basicUser;
    private string $basicPassword;

    public function __construct(string $basicUser, string $basicPassword)
    {
        $this->basicUser = $basicUser;
        $this->basicPassword = $basicPassword;
    }

    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
    {
        $user = $request->getServerParams()['PHP_AUTH_USER'] ?? null;
        $passwd = $request->getServerParams()['PHP_AUTH_PW'] ?? null;

        if ($user === $this->basicUser && $passwd === $this->basicPassword) {
            return $handler->handle($request);
        }

        return new Response(401, [
            'WWW-Authenticate' => 'Basic realm="Backend"'
        ]);
    }
}
```

```
# example configuration
symiddleware:
  groups:
    basic:
      middlewares:
        - App\Middleware\AuthorizeRequests
```

```
// Some controller

use Symfony\Component\HttpFoundation\JsonResponse;
use Kafkiansky\SymfonyMiddleware\Attribute\Middleware;

final class SomeController
{
    #[Middleware(['basic'])] // via middleware group
    public function writeArticle(): JsonResponse
    {
    }

    #[Middleware([App\Middleware\AuthorizeRequests::class])] // via concrete class
    public function deleteArticle(): JsonResponse
    {
    }
}
```

Middlewares
-----------

[](#middlewares)

[Handle HTTP Basic Auth PSR-15 middleware for Symfony](https://github.com/kafkiansky/symfony-basic-auth-middleware)

Testing
-------

[](#testing)

```
$ composer test
```

License
-------

[](#license)

The MIT License (MIT). See [License File](LICENSE.md) for more information.

###  Health Score

40

—

FairBetter than 88% of packages

Maintenance19

Infrequent updates — may be unmaintained

Popularity43

Moderate usage in the ecosystem

Community10

Small or concentrated contributor base

Maturity69

Established project with proven stability

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~140 days

Recently: every ~210 days

Total

7

Last Release

888d ago

Major Versions

0.3.0 → 1.x-dev2021-12-01

0.4.0 → 1.0.02023-12-13

PHP version history (3 changes)0.1.0PHP ^8.0

0.3.0PHP ^8.0 || ^8.1

0.4.0PHP ^8.2

### Community

Maintainers

![](https://www.gravatar.com/avatar/4b0c87976a285325177559e27d154a9b5019466800c6a3342db916140c512ede?d=identicon)[kafkiansky](/maintainers/kafkiansky)

---

Top Contributors

[![kafkiansky](https://avatars.githubusercontent.com/u/37590388?v=4)](https://github.com/kafkiansky "kafkiansky (32 commits)")

---

Tags

middlewaresymfonypsr-15

###  Code Quality

TestsPHPUnit

Static AnalysisPsalm

Type Coverage Yes

### Embed Badge

![Health badge](/badges/kafkiansky-symfony-middleware/health.svg)

```
[![Health](https://phpackages.com/badges/kafkiansky-symfony-middleware/health.svg)](https://phpackages.com/packages/kafkiansky-symfony-middleware)
```

###  Alternatives

[shopware/platform

The Shopware e-commerce core

3.3k1.5M3](/packages/shopware-platform)[sulu/sulu

Core framework that implements the functionality of the Sulu content management system

1.3k1.3M152](/packages/sulu-sulu)[prestashop/prestashop

PrestaShop is an Open Source e-commerce platform, committed to providing the best shopping cart experience for both merchants and customers.

9.0k15.4k](/packages/prestashop-prestashop)[symfony/framework-bundle

Provides a tight integration between Symfony components and the Symfony full-stack framework

3.6k235.4M9.7k](/packages/symfony-framework-bundle)[shopware/core

Shopware platform is the core for all Shopware ecommerce products.

595.2M386](/packages/shopware-core)[drupal/core

Drupal is an open source content management platform powering millions of websites and applications.

19562.3M1.3k](/packages/drupal-core)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
