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ện renderZend\View\Renderer\PhpRenderer, đây là cơ chế đăng ký mặc định. Nó sẽ can thiệp vào phần body của Response để 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ủa Response 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ề

Đăng ký theo dõi ủng hộ kênh