之前发了一篇帖子提到 在 Symfony 中与 Pjax 集成,使用 Pjax 进行单页加速;这次来讲一下怎么在cakephp的项目中集成pjax;
前端的代码与在symfony里实现是一样的,这里主要讲一下后端的部分,在symfony里我们是利用了symfony的kernel.response
事件,在cakephp里我们换个做法,使用cake支持的 middleware 机制,
延伸
这里延伸一点middleware相关的知识点;middleware都是大差不差的,不同于laravel的 middleware “单传”,cake的middleware采用的是“双传(double pass)”, 两种机制有什么区别有兴趣的童鞋可以去看看 php-fig 关于 middleware的讨论,传送门, psr15仍然在讨论当中,所以并没有被广大框架实现,这里我实现了一个psr15的中间件调度器 https://github.com/slince/middleware 有兴趣的可以看看。
Middleware
书归正传,继续说在cake实现pjax的事情, 首先我们需要创建一个middleware,在你的项目 /src/Middleware
下创建 PjaxMiddleware
类
namespace App\Middleware;
class PjaxMiddleware
{
public function __invoke($request, $response, $next) //注意cake使用的是双传,所以会接收到request和response
{
$response = $next($request, $response);
//如果是pjax请求则提取response body中相应的部分即可
//由于提取代码与symfony的一致,随意不在写出来,如果有兴趣的同学可以去研究下 symfony/DomCrawler
}
}
接下来注册你的middleware;打开/src/Application.php
文件,作如下修改:
class Application extends BaseApplication
{
/**
* Setup the middleware queue your application will use.
*
* @param \Cake\Http\MiddlewareQueue $middlewareQueue The middleware queue to setup.
* @return \Cake\Http\MiddlewareQueue The updated middleware queue.
*/
public function middleware($middlewareQueue)
{
$middlewareQueue
->add(ErrorHandlerMiddleware::class)
->add(AssetMiddleware::class)
->add(new RoutingMiddleware($this));
//....
$middlewareQueue->add(\App\Middleware\PjaxMiddleware::class); //注册pjax middleware
return $middlewareQueue;
}
}
到此结束,接下来cake会自动处理pjax请求;
使用cakephp-pjax插件
为了更方便我做了一个cakephp的pjax插件,大家可以看看 https://github.com/slince/cakephp-pjax;
相比上述繁琐的步骤,你只需要在安装之后在 /config/bootstrap.php
里加上即可;
Plugin::load('Slince/Pjax', [
'bootstrap' => true,
]);
怎么样是不是很方便。:heart:
网友评论