怎么在 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,

]);

怎么样是不是很方便。:heart:

你可能感兴趣的:(怎么在 CakePHP 项目中集成 PJAX)