webstronauts / unpoly
处理 JavaScript Unpoly 框架请求的栈中间件
Requires
- php: ^7.4|^8.0
- symfony/http-foundation: ^4.4|^5.4|^6.0
- symfony/http-kernel: ^4.4|^5.4|^6.0
Requires (Dev)
- phpunit/phpunit: ^9.5
README
处理 JavaScript Unpoly 框架 请求的栈中间件。
安装
您可以通过 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)。请参阅 许可文件 了解更多信息。