怎么在 CakePHP 项目中集成 PJAX

之前发了一篇帖子提到 在 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,
]);

怎么样是不是很方便。❤️

0 回复

回复