├── .github └── workflows │ └── run-tests.yml ├── .phpunit.result.cache ├── composer.json ├── phpunit.xml └── src ├── ClosureHttpKernel.php ├── ClosureMiddleware.php ├── Facade.php ├── ServiceProvider.php ├── StackMiddleware.php └── TerminableClosureMiddleware.php /.github/workflows/run-tests.yml: -------------------------------------------------------------------------------- 1 | name: Tests 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | pull_request: 8 | branches: 9 | - "*" 10 | 11 | jobs: 12 | php-tests: 13 | runs-on: ubuntu-20.04 14 | timeout-minutes: 15 15 | env: 16 | COMPOSER_NO_INTERACTION: 1 17 | 18 | strategy: 19 | matrix: 20 | php: [8.4, 8.3, 8.2, 8.1] 21 | laravel: [9.*, 10.*, 11.*, 12.*] 22 | dependency-version: [prefer-lowest, prefer-stable] 23 | exclude: 24 | - laravel: 9.* 25 | php: 8.4 26 | - laravel: 1.* 27 | php: 8.4 28 | - laravel: 11.* 29 | php: 8.1 30 | - laravel: 12.* 31 | php: 8.1 32 | 33 | name: P${{ matrix.php }} - L${{ matrix.laravel }} - ${{ matrix.dependency-version }} 34 | 35 | steps: 36 | - name: Checkout code 37 | uses: actions/checkout@v2 38 | 39 | - name: Setup PHP 40 | uses: shivammathur/setup-php@v2 41 | with: 42 | php-version: ${{ matrix.php }} 43 | coverage: none 44 | extensions: mbstring 45 | 46 | - name: Install dependencies 47 | run: | 48 | composer require "illuminate/support:${{ matrix.laravel }}" --no-update --no-progress 49 | composer update --${{ matrix.dependency-version }} --prefer-dist --no-progress 50 | 51 | - name: Execute Unit Tests 52 | run: composer test 53 | -------------------------------------------------------------------------------- /.phpunit.result.cache: -------------------------------------------------------------------------------- 1 | {"version":1,"defects":{"Barryvdh\\StackMiddleware\\Tests\\ClosureHttpKernelTest::testSetClosure":5,"Barryvdh\\StackMiddleware\\Tests\\ClosureHttpKernelTest::testHandleCallsInjectedClosure":3,"Barryvdh\\StackMiddleware\\Tests\\ClosureMiddlewareTest::testHandleSetsClosureAndProxiesHandleMethod":4,"Barryvdh\\StackMiddleware\\Tests\\StackMiddlewareTest::testSimpleWrap":4,"Barryvdh\\StackMiddleware\\Tests\\StackMiddlewareTest::testAdvancedWrapWithTerminableInterface":4,"Barryvdh\\StackMiddleware\\Tests\\TerminableClosureMiddlewareTest::testTerminateProxiesToMiddleware":4},"times":{"Barryvdh\\StackMiddleware\\Tests\\ClosureHttpKernelTest::testSetClosure":0.012,"Barryvdh\\StackMiddleware\\Tests\\ClosureHttpKernelTest::testHandleCallsInjectedClosure":0.007,"Barryvdh\\StackMiddleware\\Tests\\ClosureMiddlewareTest::testHandleSetsClosureAndProxiesHandleMethod":0.006,"Barryvdh\\StackMiddleware\\Tests\\FacadeTest::testFacadeAccessor":0.027,"Barryvdh\\StackMiddleware\\Tests\\ServiceProviderTest::testRegister":0.001,"Barryvdh\\StackMiddleware\\Tests\\StackMiddlewareTest::testSimpleWrap":0.001,"Barryvdh\\StackMiddleware\\Tests\\StackMiddlewareTest::testAdvancedWrapWithTerminableInterface":0.001,"Barryvdh\\StackMiddleware\\Tests\\TerminableClosureMiddlewareTest::testTerminateProxiesToMiddleware":0}} -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "barryvdh/laravel-stack-middleware", 3 | "description": "Stack Middleware for Laravel", 4 | "license": "MIT", 5 | "keywords": ["laravel", "stack", "stackphp", "middleware"], 6 | "authors": [ 7 | { 8 | "name": "Barry vd. Heuvel", 9 | "email": "barryvdh@gmail.com" 10 | } 11 | ], 12 | "require": { 13 | "php": "^8.1", 14 | "illuminate/support": "^9|^10|^11|^12", 15 | "symfony/http-kernel": "^6|^7" 16 | }, 17 | "require-dev": { 18 | "orchestra/testbench": "^7|^8|^9|^10" 19 | }, 20 | "autoload": { 21 | "psr-4": { 22 | "Barryvdh\\StackMiddleware\\": "src/" 23 | } 24 | }, 25 | "autoload-dev": { 26 | "psr-4": { 27 | "Barryvdh\\StackMiddleware\\Tests\\": "tests" 28 | } 29 | }, 30 | "extra": { 31 | "branch-alias": { 32 | "dev-master": "1.2-dev" 33 | }, 34 | "laravel": { 35 | "providers": [ 36 | "Barryvdh\\StackMiddleware\\ServiceProvider" 37 | ], 38 | "aliases": { 39 | "Stack": "Barryvdh\\StackMiddleware\\Facade" 40 | } 41 | } 42 | }, 43 | "scripts": { 44 | "test": "phpunit" 45 | }, 46 | "minimum-stability": "dev", 47 | "prefer-stable": true 48 | } 49 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | tests 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/ClosureHttpKernel.php: -------------------------------------------------------------------------------- 1 | closure = $closure; 18 | } 19 | 20 | /** 21 | * @param Request $request A Request instance 22 | * @param int $type 23 | * @param bool $catch 24 | * 25 | * @return Response A Response instance 26 | */ 27 | public function handle(Request $request, $type = HttpKernelInterface::MAIN_REQUEST, $catch = true): Response 28 | { 29 | $closure = $this->closure; 30 | 31 | return $closure($request); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/ClosureMiddleware.php: -------------------------------------------------------------------------------- 1 | kernel = $kernel; 21 | $this->middleware = $middleware; 22 | } 23 | 24 | /** 25 | * Handle an incoming request. 26 | * 27 | * @param \Illuminate\Http\Request $request 28 | * @param Closure $next 29 | * 30 | * @return mixed 31 | */ 32 | public function handle($request, Closure $next) 33 | { 34 | $this->kernel->setClosure($next); 35 | 36 | return $this->middleware->handle($request); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/Facade.php: -------------------------------------------------------------------------------- 1 | app->bind('stack', function () { 15 | return new StackMiddleware($this->app); 16 | }); 17 | 18 | $this->app->alias('stack', 'Barryvdh\StackMiddleware\StackMiddleware'); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/StackMiddleware.php: -------------------------------------------------------------------------------- 1 | container = $container; 17 | } 18 | 19 | /** 20 | * Wrap and register the middleware in the Container. 21 | * 22 | * @param string $abstract 23 | * @param callable|string $callable 24 | * @param array $params 25 | */ 26 | public function bind($abstract, $callable, $params = []) 27 | { 28 | $this->container->bind($abstract, function () use ($callable, $params) { 29 | return $this->wrap($callable, $params); 30 | }); 31 | } 32 | 33 | /** 34 | * Wrap the StackPHP Middleware in a Laravel Middleware. 35 | * 36 | * @param callable|string $callable 37 | * @param array $params 38 | * 39 | * @return ClosureMiddleware 40 | */ 41 | public function wrap($callable, $params = []) 42 | { 43 | $kernel = new ClosureHttpKernel(); 44 | 45 | if (is_callable($callable)) { 46 | $middleware = $callable($kernel); 47 | } else { 48 | // Add kernel as 'app' parameter 49 | $params = ['app' => $kernel] + $params; 50 | $makeMethod = method_exists($this->container, 'makeWith') ? 'makeWith' : 'make'; 51 | $middleware = $this->container->$makeMethod($callable, $params); 52 | } 53 | 54 | if ($middleware instanceof TerminableInterface) { 55 | return new TerminableClosureMiddleware($kernel, $middleware); 56 | } 57 | 58 | return new ClosureMiddleware($kernel, $middleware); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/TerminableClosureMiddleware.php: -------------------------------------------------------------------------------- 1 | middleware->terminate($request, $response); 15 | } 16 | } 17 | --------------------------------------------------------------------------------