处理 JavaScript Unpoly 框架请求的栈中间件

v2.0.0 2022-02-18 07:20 UTC

This package is auto-updated.

Last update: 2024-08-30 13:08:43 UTC


README

Latest Version on Packagist Build Status StyleCI Total Downloads

处理 JavaScript Unpoly 框架 请求的栈中间件。

Sponsored by The Webstronauts

安装

您可以通过 Composer 安装此包。

composer require webstronauts/unpoly

使用方法

您可以使用 Unpoly 对象手动装饰响应。

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Webstronauts\Unpoly\Unpoly;

// ...

$unpoly = new Unpoly();
$unpoly->decorateResponse($request, $response);

栈中间件

您可以使用提供的 Stack 中间件装饰响应。

use Webstronauts\Unpoly\StackUnpoly;
use Webstronauts\Unpoly\Unpoly;

// ...

$app = new StackUnpoly($app, new Unpoly());

Laravel

要使用 Laravel 的包,您需要将其包装在一个中间件实例周围。

<?php

namespace App\Http\Middleware;

use Closure;
use Webstronauts\Unpoly\Unpoly as UnpolyMiddleware;

class Unpoly
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $response = $next($request);

        (new UnpolyMiddleware)->decorateResponse($request, $response);

        return $response;
    }
}

现在按照 Laravel 文档 中的说明使用此中间件。

<?php

// Within App\Http\Kernel class...

protected $routeMiddleware = [
    // ...
    'unpoly' => \App\Http\Middleware\Unpoly::class,
];

验证错误

每次表单通过 Unpoly 提交时,默认情况下都会以 JSON 格式返回响应。这是因为 Laravel 为任何设置了 X-Requested-With 标头为 XMLHttpRequest 的请求返回 JSON 格式的响应。为了确保应用程序在发生任何验证错误时返回 HTML 响应,请覆盖您 App\Exceptions\Handler 类中的 convertValidationExceptionToResponse 方法。

<?php

// Within App\Exceptions\Handler class...

protected function convertValidationExceptionToResponse(ValidationException $e, $request)
{
    if ($e->response) {
        return $e->response;
    }

    return $request->expectsJson() && ! $request->hasHeader('X-Up-Target')
        ? $this->invalidJson($request, $e)
        : $this->invalid($request, $e);
}

其他 HTTP 错误

如果您的 Laravel 会话过期,并且用户尝试使用 Unpoly 在页面上导航或执行操作,将向用户显示一个突兀的 JSON 错误响应。

{'error': 'Unauthenticated.'}

要防止这种情况,创建自己的 Request 并扩展 Laravel 内置的 Illuminate\Http\Request,并覆盖 expectsJson 方法。

namespace App\Http;

use Illuminate\Http\Request as BaseRequest;

class Request extends BaseRequest
{
    public function expectsJson()
    {
        if ($this->hasHeader('X-Up-Target')) {
            return false;
        }

        return parent::expectsJson();
    }
}

然后,转到您的 public/index.php 文件,并更新使用方法

// From...
$response = $kernel->handle(
    $request = Illuminate\Http\Request::capture()
);

// To...
$response = $kernel->handle(
    $request = App\Http\Request::capture()
);

现在当用户会话过期时,您的页面 <body> 将被替换为您的登录页面,允许用户在不刷新页面的情况下重新登录。

测试

composer test

变更日志

请参阅 CHANGELOG 了解最近更改的更多信息。

致谢

由于这只是从 Ruby 到 PHP 代码的简单移植。所有的荣誉都应该归功于 Unpoly 团队和他们的 unpoly 晶体。

许可

MIT 许可证 (MIT)。请参阅 许可文件 了解更多信息。