Hyperf 初體驗-視圖

  • 2019 年 12 月 18 日
  • 筆記

今天走一遍 Hyperf 框架的視圖,

先讀一遍 文檔,大致需要安裝 3 處依賴

安裝視圖

composer require hyperf/view

配置

新建 config/autoload/view.php 配置文件

<?php  declare(strict_types=1);    use HyperfViewMode;  use HyperfViewEngineBladeEngine;    return [      // 使用的渲染引擎      'engine' => BladeEngine::class,      // 不填寫則默認為 Task 模式,推薦使用 Task 模式      'mode' => Mode::TASK,      'config' => [          // 若下列文件夾不存在請自行創建          'view_path' => BASE_PATH . '/storage/view/',          'cache_path' => BASE_PATH . '/runtime/view/',      ],  ];

根據文檔 在根目錄新建 /storage/view/runtime/view 文件夾

使用 Task 模式時,需引入 hyperf/task 組件且必須配置 task_enable_coroutinefalse,否則會出現協程數據混淆的問題,更多請查閱 Task 組件文檔。 若使用 Sync 模式渲染視圖時,請確保相關引擎是協程安全的,否則會出現數據混淆的問題,建議使用更加數據安全的 Task 模式。

安裝 Task

composer require hyperf/task

配置

server.php 增加 Task 相關的配置。

<?php    declare(strict_types=1);    use HyperfServerSwooleEvent;    return [      // 這裡省略了其它不相關的配置項      'settings' => [          // Task Worker 數量,根據您的伺服器配置而配置適當的數量          'task_worker_num' => 8,          // 因為 `Task` 主要處理無法協程化的方法,所以這裡推薦設為 `false`,避免協程下出現數據混淆的情況          'task_enable_coroutine' => false,      ],      'callbacks' => [          // Task callbacks          SwooleEvent::ON_TASK => [HyperfFrameworkBootstrapTaskCallback::class, 'onTask'],          SwooleEvent::ON_FINISH => [HyperfFrameworkBootstrapFinishCallback::class, 'onFinish'],      ],  ];

配置靜態資源

如果您希望 Swoole 來管理靜態資源,請在 config/autoload/server.php配置中增加以下配置。

return [      'settings' => [          ...          // 靜態資源          'document_root' => BASE_PATH . '/public',          'static_handler_locations' => ['/'],          'enable_static_handler' => true,      ],  ];

必須在根目錄新建 public 文件夾,否則會出現 xxxx/public does not exist

以下是配置文件 server.php 的完整內容

<?php    declare(strict_types=1);  /**   * This file is part of Hyperf.   *   * @link     https://www.hyperf.io   * @document https://doc.hyperf.io   * @contact  [email protected]   * @license  https://github.com/hyperf-cloud/hyperf/blob/master/LICENSE   */    use HyperfServerServer;  use HyperfServerSwooleEvent;    return [      'mode' => SWOOLE_PROCESS,      'servers' => [          [              'name' => 'http',              'type' => Server::SERVER_HTTP,              'host' => '0.0.0.0',              'port' => 9501,              'sock_type' => SWOOLE_SOCK_TCP,              'callbacks' => [                  SwooleEvent::ON_REQUEST => [HyperfHttpServerServer::class, 'onRequest'],              ],          ],      ],      'settings' => [          'enable_coroutine' => true,          'worker_num' => swoole_cpu_num(),          'pid_file' => BASE_PATH . '/runtime/hyperf.pid',          'open_tcp_nodelay' => true,          'max_coroutine' => 100000,          'open_http2_protocol' => true,          'max_request' => 100000,          'socket_buffer_size' => 2 * 1024 * 1024,            // Task Worker 數量,根據您的伺服器配置而配置適當的數量          'task_worker_num' => 8,          // 因為 `Task` 主要處理無法協程化的方法,所以這裡推薦設為 `false`,避免協程下出現數據混淆的情況          'task_enable_coroutine' => false,             // 靜態資源          'document_root' => BASE_PATH . '/public',          'static_handler_locations' => ['/'],          'enable_static_handler' => true,      ],      'callbacks' => [          SwooleEvent::ON_BEFORE_START => [HyperfFrameworkBootstrapServerStartCallback::class, 'beforeStart'],          SwooleEvent::ON_WORKER_START => [HyperfFrameworkBootstrapWorkerStartCallback::class, 'onWorkerStart'],          SwooleEvent::ON_PIPE_MESSAGE => [HyperfFrameworkBootstrapPipeMessageCallback::class, 'onPipeMessage'],          // Task callbacks          SwooleEvent::ON_TASK => [HyperfFrameworkBootstrapTaskCallback::class, 'onTask'],          SwooleEvent::ON_FINISH => [HyperfFrameworkBootstrapFinishCallback::class, 'onFinish'],      ],  ];

安裝視圖渲染引擎

blade 為例

composer require duncan3dc/blade

使用

storageview 中新建 index.blade.php 文件

<!DOCTYPE html>  <html lang="en">  <head>      <meta charset="UTF-8">      <title>Hyperf</title>  </head>  <body>  Hello, {{ $ name } }. You are using blade template now.  </body>  </html>

IndexController 為例 ,實例化 RenderInterface 調用 render 即可

<?php    declare(strict_types=1);  /**   * This file is part of Hyperf.   *   * @link     https://www.hyperf.io   * @document https://doc.hyperf.io   * @contact  [email protected]   * @license  https://github.com/hyperf-cloud/hyperf/blob/master/LICENSE   */    namespace AppController;    use HyperfViewRenderInterface;    class IndexController extends Controller  {      public function index(RenderInterface $render)      {          return $render->render('index', ['name' => 'Hyperf']);      }  }

重啟服務、應該就可以訪問到視圖頁面了

上面說到 由 Hyperf 接管靜態路由,那麼在視圖中該怎樣訪問呢? 比如 public/css/app.css 該怎樣引入呢?

<link rel="stylesheet" href="/css/app.css">

直接 / 即可

建議通讀一遍文檔、按文檔一步一步來,就可以、否則你會遇到一對錯誤。比如 task 問題、public 文件不存在等等。