Presentation Logic với PHP

Presentation Logic hiểu nôm na là những phần của hệ thống “chăm lo” công việc hiển thị thông tin, giao tiếp với người dùng… Trong ứng dụng web, presentation chính là trang HTML.

Trong các ứng dụng PHP đời đầu, mã PHP được trộn lẫn vào HTML,các ứng dụng trở nên cực kỳ rối rắm và chắc chắn là tính khả mở không cao, khả năng kế thừa và mở rộng thấp. Một trong những tiêu chí hàng đầu cho một ứng dụng PHP hiện đại ngày nay là phải tách biệt rõ ràng business logic và presentation logic. Kiến trúc MVC (Model – View – Controller) làm rất tốt công việc đó, và trong MVC, V là presentation.

Trong ứng dụng web theo kiến trúc MVC, View thường chia thành 2 phần: transform view và template view! Và transform view là phần thực hiện presentation logic.

1. Template engine

Phong cách truyền thống của PHP là các template engines, có rất nhiều template engine có quá trình phát triển lâu dài và được tin tưởng.

Phải nhắc đến đầu tiên là Smarty. Smarty gần như đã trở thành template engine chính thống trong PHP. Người ta nói rằng, lịch sử PHP đã sang trang mới kể từ khi Smarty xuất hiện. Smarty được tin tưởng và sử dụng trong rất nhiều dự án PHP từ rất nhỏ đến rất lớn như Flickr.com chẳng hạn.

Smarty không tách biệt mã HTML khỏi PHP, quá trình process của Smarty:

– Lập trình viên/designer diễn tả logic trong template bằng mã template của Smarty. Mã này cũng có các structure như if, foreach vvv. Các biến và object được assign từ bên ngoài vào.

– Smarty compiler sẽ dịch mã template sang mã PHP trộn lẫn với HTML, sau đó ghi kết quả ra file.

– Include file vừa tạo ra vào trong code.

Xong xuôi!😉

Smarty, thật sự là một lựa chọn tốt, vì mã template của nó đa dạng, mạnh nhưng không phức tạp như PHP. Cho nên trong các dự án sử dụng PHP có sự phân công công việc rõ ràng giữa developer và designer, người ta không cần phải lo lằng về việc các designer không biết lập trình nữa.

Tuy nhiên một điểm yếu của Smarty là nó phải thông qua một quá trình compile, mặc dù nó làm việc này rất tốt nhưng vẫn có rất nhiều ý kiến cho rằng nó chậm. Cũng phải thôi, xét cho cùng, PHP là text processing, và không nên process thêm một tầng nữa. Để có được performance cao hơn, các PHP framework thường sử dụng thẳng PHP vào trong template. Mã PHP ở đây được viết theo kiểu rút gọn. Ví dụ:

if ($babe == 'Mai Phuong Thuy'):
// do something with her
endif;

Như vậy, rõ ràng là sẽ hiệu quả hơn về mặt tốc độ, tuy nhiên nó sẽ không có được những điểm mạnh mà Smarty có. Cho nên một số developer khi làm việc với Cake, Symfony, hay Zend Framework vẫn thích dùng Smarty thay thế cho object View sẵn có của các framework này.

Anyways, nếu bạn cần tìm một template engine như thế, hãy lựa chọn Savant, có 2 phiên bản dành cho PHP4 và PHP5: http://phpsavant.com. Savant có API giống Smarty, cho nên bạn có thể switch sang nó từ Smarty mà chỉ cần thay đổi các file template/

Tôi vừa nhắc đến 2 template engine phổ biến và mạnh nhất, chúng trở thành một phần không thể thiếu của rất nhiều ứng dụng PHP. Nó giúp developers phân công rõ ràng những gì designers có thể “chạm”, tách biệt presentation logic khỏi business logic. Một số framework còn thêm cả các helper để trợ giúp việc tạo mã ajax vào trong template engine của họ!

2. XSLT (eXtensible Stylesheet Language Transformations)

Tuy nhiên, lại tuy nhiên;), template engine chưa phải là sự lựa chọn duy nhất.

Đầu tiên là nó chưa chuẩn hóa! Có thể khi tuyển designer, bạn lại phải huấn luyện họ sử dụng Smarty vì từ trước đến giờ họ chỉ làm việc với các developer .NET! Tiếp theo đó, presentation logic của bạn là PHP, về performance, nó không tốt hơn so với khi process ở một tầng thấp hơn.

Vậy, đâu là sự lựa chọn tiếp theo? Đó là XSLT(http://www.w3.org/TR/xslt). Trong trường hợp bạn chưa hiểu lắm, thì XSLT là một nhánh của XML được tạo ra để transform tài liệu XML từ dạng này sang dạng khác, từ XML sang XML, xHTML; hay sang bất cứ loại tài liệu gì! Với một nguồn dữ liệu duy nhất là XML, bạn có thể xuất ra trang web, RSS và nhiều nhiều nữa… Ứng dụng PHP của bạn có thể dụng chung nguồn dữ liệu của một ứng dụng Java, .NET, miễn là cả 2 đều chọn XSLT.

‘Với XSLT, presentation logic của bạn không còn là PHP nữa, nó là XSLT, hay là XML, nó được thực thi bằng một XSLT procesor được viết bằng C. Trong PHP5, bạn có thể thực thi XSLT bằng đối tượng XSLTProcessor. Bạn có thể xem các tutorial về đối tượng này bằng cách vào http://google.com, ở đó bạn sẽ thấy một text box duy nhất, gõ vào đó “XSLT PHP” và bấm enter. Hoặc nếu ngớ ngẩn một chút thì chờ tôi viết😉.

Tuy nhiên XSLT quá phức tạp cho các ứng dụng con con. Bởi lẽ bạn phải làm cách nào đó để chuyển đổi dữ liệu trong database sang XML, làm nảy sinh ra vấn đề back-end caching… buộc bạn phải có một thiết kế rất tốt. Cho nên, XSLT thường chỉ được ưa chuộng trong các dự án lớn, nơi đòi hỏi sự chuẩn hóa cao độ.

Bạn có thể tham khảo bitflux CMS, một ứng dụng PHP5 khai thác XML và XSLT.

Chúc bạn may mắn với sự lựa chọn của mình!


About this entry