Rendering strategy
Zend_view là thành phần để dựng mã trả về như HTML, khi bắt đầu dựng nó phát đi sự kiện render
,
lúc đó ứng dụng có thể bắt sự kiện này và thay đổi một cơ chế dựng kết quả trả về (Rendering strategy).
Trong Zend có sẵn ba rendering strategy
Zend\View\Strategy\PhpRendererStrategy
, nếu đăng ký cơ chế này thì đối tượng render trả về khi phát sự kiệnrender
làZend\View\Renderer\PhpRenderer
, đây là cơ chế đăng ký mặc định. Nó sẽ can thiệp vào phần body củaResponse
để lưu nội dung trả vềZend\View\Strategy\JsonStrategy
, đối tượng trả về làZend\View\Renderer\JsonRenderer
, nó sẽ lưu vào body củaResponse
nội dung JSON và thiết lập phần header là:Content-Type: application/json
Zend\View\Strategy\FeedStrategy
, trả vềZend\View\Renderer\FeedRenderer
nó sẽ thiết lập trả về là "rss" hay "atom"
PhpRendererStrategy đã đăng ký mặc định, nếu muốn dùng thêm JsonStrategy hoặc FeedStrategy thì đăng ký thêm trong hệ thống bằng cách cầu hình,
để khi sự kiện render
gửi đi nó nhận được đối tượng render phù hợp bằng cách:
Đăng ký sử dụng thêm JsonStratery, FeedStrategy
Cập nhật vào module.config.php
module/Application/config/module.config.php
<?php return [ //... 'view_manager' => [ //... 'strategies' => [ 'ViewJsonStrategy', 'ViewFeedStrategy' //Nếu không dùng bỏ di ], ], ];
Thay đổi ViewModel trả về với từng Rendering Stratery
Mặc định bạn vẫn trả về từ các action của controller một đối tượng ViewModel
, nếu vậy sẽ dùng PhpRender
.
Giờ nếu bạn trả về JsonModel
sẽ dùng JsonRenderer
, tương tự nếu là FeedModel
sẽ dùng FeedRender
Ví dụ về JsonRenderer
Ở ứng dụng Skeleton, bạn cập nhật module.config.php như trên
Tiếp theo tạo một action tên là getJson
với nội dung như sau:
module/Application/src/Controller/IndexController.php
use Zend\View\Model\JsonModel; //... public function getJsonAction() { $view = new JsonModel(); $view->setVariables([ [ 'status' => 'SUCCESS', 'message'=>'Đây là dữ liệu JSON', 'data' => [ 'full_name' => 'XUANTHU', 'address' => 'HANOI, VIETNAM' ] ] ]); return $view; } //....
Chạy http://localhost/zf3/application/getJson để xem kết quả JSON trả về
Ví dụ về FeedRender
Cần đảm bảo ZF có sử dụng zend_feed
, nếu chưa có gõ lệnh composer
ở thư mục dự án để tải về
composer require zendframework/zend-feed
Tiếp theo tạo một action tên là feed
với nội dung như sau:
module/Application/src/Controller/IndexController.php
use Zend\View\Model\FeedModel; use Zend\Feed\Writer\Feed; //... public function feedAction() { $feed = new Feed(); $feed->setTitle('Ví dụ về Feed / RSS') ->setLink('http://xuanthulab.net/') ->setFeedLink('http://xuanthulab.net/feed.xml', 'rss') ->addAuthor(['name' => 'XuanThuLab', 'email' => 'info@xuanthulab.net', 'uri' => 'https://xuanthulab.net']) ->setDescription('Mô tả về Feed') ->setId('http://xuanthulab.net/') ->setDateModified(time()); //Mục tin ví dụ $data = []; $data[] = [ 'title' => 'Tin 1', 'link' => 'http://xuanthulab.net//link1', 'content' => 'Noi dung 1', 'date_created' => '2017-01-01 00:00:00', 'date_created' => '2017-01-01 00:00:00' ]; $data[] = [ 'title' => 'Tin 2', 'link' => 'http://xuanthulab.net/link2', 'content' => 'Noi dung 2', 'date_created' => '2017-02-02 00:00:00', 'date_created' => '2017-02-02 00:00:00' ]; foreach($data as $row) { //create entry... $entry = $feed->createEntry(); $entry->setTitle($row['title']); $entry->setLink($row['link']); $entry->setDescription($row['content']); $entry->setDateModified(strtotime($row['date_created'])); $entry->setDateCreated(strtotime($row['date_created'])); $feed->addEntry($entry); } $view = new FeedModel(); $view->setFeed($feed); return $view; } //....
Chạy http://localhost/zf3/application/feed để xem kết quả RSS trả về