Liên hệ
zend framework

PhpRender trong Zend Framework

Tìm hiểu PhpRenderer gói cơ sở để xây dựng lên khái niệm View, ViewModel trong ZF dùng để render HTML, template HTML

ZF PhpRender cơ bản

Ở đây tìm hiểu độc lâp PhpRender, chưa đề cập đến toàn bộ View trong bộ khung ZF. PhpRender thuộc gói View, nên để cài đặt vào dự án dùng lệnh Composer sau:

$ composer require zendframework/zend-view

Zend\View\Renderer\PhpRenderer  dùng để dựng mã HTML từ Script viết trong PHP. PhpRender là một hệ thống dựng template không định hướng, trong Script bạn có thể sử dụng ngôn ngữ PHP. Thông thường bạn tạo các file template HTML có đuôi .phtml để lưu script.

Tạo đối tượng PhpRender:

use Zend\View\Renderer\PhpRenderer;

$renderer = new PhpRenderer();

Trong zend-view có một số loại resolver, mà PhpRender có thể sử dụng đến là:

  • Zend\View\Resolver\TemplateMapResolver: ánh xạ trực tiếp tên template đến script.
  • Zend\View\Resolver\TemplatePathStack: lưu trữ thư mục các script theo cấu trúc LIFO, nơi mà PhpRender tìm đến file script theo tên.
  • Zend\View\Resolver\RelativeFallbackResolver
  • Zend\View\Resolver\AggregateResolver : Cho phép gắn hàng đợi dạng FIFO để tìm script. 

Resolver : là cơ chế để PhpRender tìm đến các file script HTML, từ đó load file script này và dựng lại HTML cùng với tham số truyền đến. PhpRender bắt buộc phải được thiết lập Resolver để làm việc. Trong zend framework skeleton đã khởi tạo sẵn một TemplateMapResolver toàn cục, với key trong ServiceManager là: ViewTemplateMapResolver. Để lấy bằng cách gọi $sm->get('ViewTemplateMapResolver')

Ở đây sử dụng AggregateResolver là cách dùng phổ biến. Nếu sau khi tạo được đối tương PhpRender và cấu hình Resolver thích hợp lúc đó để render một script nào dùng lệnh sau để render HTML.

render($nameOrModel, $values = null)

Trong đó:

  • $nameOrModel: là tên template (tên này phải được cấu hình để chỉ đến file script trong Resovler) hoặc là ViewModel.
  • $values: là mảng dữ liệu chuyển đển đến file script view.

Để thực hành tạo file và thư mục trong dự vừa cài đặt zend_view của bản các thư mục và các file như sau:

|   index.php
|
+---view
|   |   hello1.phtml
|   |
|   \---index
|           hello2.phtml
|
\---viewfolder
    |   hello3.phtml
    |
    \---folderother
            hello4.phtml

Trong đó các file hello1.phtml, hello2.phtml, hello2.phtml, hello2.phtml là các file template script, các file mà PhpRender nạp và render HTML. Để đơn giản nội dung tất cả các file đó đều là:

<?
    echo 'Render from script : ', __FILE__;
?>
<h1>PhpRender</h1>
<ul>
    <li>
        HO TEN : <?=$this->name;?>                
    </li>    
    
    <li>
        TUOI : <?=$age?>
    </li>
    
    <li>
        LOP : <?=$age?>
    </li>
</ul>
<hr>

Giờ bạn cập nhật nội dung file index.php, trong đó là cách sử dụng PhpRender và các Resolver

<?php
use Zend\View\Renderer\PhpRenderer;
use Zend\View\Resolver;


include "vendor/autoload.php"; 

//Tạo và cấu hình resolver
$resolver = new Resolver\AggregateResolver();
$map = new Resolver\TemplateMapResolver([
    'hello1'      => __DIR__ . '/view/hello1.phtml',
    'hello2' => __DIR__ . '/view/index/hello2.phtml',
]);

$stack = new Resolver\TemplatePathStack([
    'script_paths' => [
        __DIR__ . '/viewfolder',
        __DIR__ . '/viewother',
    ],
]);


// Gom lại các Resolver
$resolver
    ->attach($map)    // PhpRenderer tìm các file từ map này trước, tìm thấy sẽ không tìm cái khác
    ->attach($stack)  // Cho phép tìm theo cấu trúc thư mục, bắt đầu với các thư mục khai báo tại script_paths
    ->attach(new Resolver\RelativeFallbackResolver($map)) //Cài đặt để tìm tên ngắn
    ->attach(new Resolver\RelativeFallbackResolver($stack));
    
     
$renderer = new PhpRenderer();
//Đưa resolver vào PhpRender
$renderer->setResolver($resolver);

//Mẫu mảng dữ liệu chuyển đến HTML Scritp
$data = [
    'name' => 'NGUYEN VAN A',
    'age'  => '20',
    'class' => '40A'
];

//Render HTML
echo $renderer->render('hello1',$data);  //Tìm thấy hello1 từ $map, sẽ render script này
echo $renderer->render('hello2',$data);  //Tìm thấy hello2 từ $map, sẽ render script này
echo $renderer->render('hello3',$data);  //Không tìm thấy hello3 từ map, bắt đầu quét trong thư mục từ script_paths của $stack, thấy hello3.phtml trong viewfolder, sẽ nạp và render file này.
echo $renderer->render('folderother/hello4',$data);  //Tương tự hello3

Chạy code trên và xem kết quả!

Tải các code của ví dụ này: https://github.com/ichte/zf_phprenderleaning

Vui lòng đăng ký ủng hộ kênh