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_coroutine
為fals
e,否則會出現協程數據混淆的問題,更多請查閱 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 文件不存在等等。