Lớp mysqli_driver không tìm thấy

Tài liệu Lập trình web nâng cao - Bài 1. Tổng quan Zend Framework 2 (ZF2). TRUNG TÂM TÍN HỌC ĐẠI HỌC KHOA HỌC TỰ NHIÊN-TP. HCM LẬP TRÌNH PHP NÂNG CAO ZEND FRAMEWORK 2 1 TRUNG TÂM TÍN HỌC ĐẠI HỌC KHOA HỌC TỰ NHIÊN-TP. HCM Bài 1. Tổng quan Zend Framework 2 (ZF2) 1. Giới thiệu ZF 2. Lý do chọn ZF 3. Giới thiệu ZF2 4. Zend MVC 5 Cài đặt và cấu hình ZF2. 2 bài 1. Tổng quan ZF2 1 Giới thiệu ZF. u  Zend Framework là một PHP Framework bên cạnh lập trình bằng ngôn ngữ PHP và dựa trên mô hình MVC, giúp tách các thành phần xử lý ra một cách rõ ràng cho trang web của bạn, giúp mã dễ dàng quản lý, chỉnh sửa . – Sử dụng PHP 5 – Viết huớng đối tượng – Cung cấp mô hình tiên tiến MVC – Là 1 phần mềm nguồn mở có sự hỗ trợ cộng đồng – Cung cấp 1 loạt ứng dụng API của các nhà cung cấp hàng đầu như Google, . 3 bài 1. Tổng quan ZF2 Sử dụng ZF để tạo ứng dụng web theo mô hình MVC tiêu chuẩn– – Url tiêu chuẩn, thu gọn lỗ ề– H hỗ trợ phân quyền tới từng Hành động – Có các thành phần thư viện hỗ trợ API của các nhà cung cấp . Tổng quan ZF2 2 Lý d h ZF. o c ọn – Có rất nhiều thư viện được hỗ trợ sẵn – Là một PHP Framework được chính công ty phát triển ngôn ngữ PHP phát triển (www. thiên thần. com). – được xây dựng trên nền tảng lập trình hướng đối tượng nên có thể kế thừa, nâng cấp các ứng dụng một cách dễ dàng. – Những thành viên phát triển Zend Framework là những chuyên gia nổi tiếng về mã nguồn mở và PHP trên thế giới. ẩ– Mô hình MVC hoặc không theo chu kỳ MVC trong Zend Framework rất linh hoạt giúp chúng ta có thể tùy biến cấu hình ứng dụng theo ý muốn. 5 Bài 1. Tổng quan ZF2 2 Lý d h ZF. o c ọn – Tích hợp các thư viện thành phần khác nhau một cách linh hoạt và nhanh chóng. – Có tài liệu để tham khảo – Cộng đồng người sử dụng Zend Framework lớn. – Những ứng dụng lớn hiện nay đã tăng dần chuyển đổi qua sử dụng Zend Framework làm nền tảng. – Nhu cầu tuyển dụng lập trình viên biết Zend Framework lớn – Bảo mật các ứng dụng rất tốt nên tránh được các lỗi thường gặp trong các ứng dụng viết bằng PHP thông thường. 6 Bài 1. Tổng quan ZF2 3 Giới thiệu ZF2. u Zend Framework 2 là một framwork mã– nguồn mở được sử dụng để phát triển các ứng dụng web sử dụng PHP 5 3 x zend. . . Framework được xây dựng hoàn toàn theo hướng đối tượng OOP và sử dụng hầu hết các đặc điểm mới của PHP 5. 3 như không gian tên muộn liên kết tĩnh phương thức, , lambda và bao đóng. Z d F k 2 hát t iể m từ Z d– en ramewor p r n en Framework 1, một framework PHP rất thành ô ới h 15 t iệ t tải ềc ng v cảm ơn r u ượ v. 7 Bài 1. Tổng quan ZF2 Đặc điểm ZF2c m  Cấu hình cấu trúc mới. – Theo mô hình MVC, sử dụng Di, Events, Service, Module  Cải tiến về chức năng  Sử dụng PHP 5 3 3. .  Tuân thủ PSR – 2 (hỗ trợ pyrus, nhà soạn nhạc)  Hệ thống đóng gói  ZF được viết theo kiểu OOP nên nó thừa hưởng các thế mạnh của kiểu viết này. Các lớp của ZF là BA (Phân tích nghiệp vụ) rất chuẩn và khi cần mở rộng ta có thể sử dụng tính chất kế thừa của OOP. Nói chung là ta không được chỉnh sửa core of ZF. 8 bài 1. Tổng quan ZF2 Đặc điểm ZF2c m  Hầu như các phiên bản mới của ZF không có nhiều thay đổi trong core nên ta có thể dễ dàng cập nhật.  ZF được phân tích gần giống như tất cả các thư viện PHP và các CMS khác để sử dụng. VD. Smarty - Pear - FCKEditor - Drupal  Cách viết của ZF rất thân thiện và đơn giản. Tích hợp những cái mới nhất của trình duyệt web như. JSON - Tìm kiếm - S di ti W b S iyn ca on - e erv ces.  ZF được sử dụng trong các dự án lớn và có kế hoạch phát triển dài hạn 9 Bài 1. Tổng quan ZF2 4 Z d MVC. vi  Kiến trúc MVC của ZF2 10 Bài 1. Tổng quan ZF2 4 Z d MVC. vi  Zend\Mvc là một nhánh thực thi MVC mới được thiết kế cho ZF2, tập trung vào hiệu suất và tính linh hoạt.  Lớp MVC được xây dựng ở phía trên của các thàn h p n sau. – Zend\ServiceManager – ZF2 cung cấp một bộ định nghĩa dịch vụ mặc định được thiết lập ở dịch vụ ư Zend\Mvc\Service. ServiceManager tạo và cấu hình phiên bản và quy trình làm việc trong ứng dụng. 11 Bài 1. Tổng quan ZF2 4 Z d MVC. vi – Zend\EventManager – MVC là hướng sự kiện. Các thành phần này được sử dụng ở mọi nơi kể từ khi khởi động lệnh cấm đầu tiên của ứng dụng, thông qua cuộc gọi trả về phản hồi và yêu cầu, để thiết lập và tiếp nhận các định tuyến và các định tuyến phù hợp (ứng dụng), cũng như h d á . – Zend\Http – đặc biệt là các đối tượng yêu cầu và phản hồi được sử dụng trong. , – Zend\Stdlib\DispatchableInterface. Tất cả các "bộ điều khiển" đơn giản là các đối tượng có thể gửi được. 12 Bài 1. Tổng quan ZF2 4 Z d MVC. vi  Trong lớp MVC có một số thành phần con , được giới thiệu. Zend\Mvc\Router chứa các lớp liên quan đến định tuyến– một yêu cầu. Nói cách khác, nó kết nối các yêu cầu tới các bộ điều khiển tương ứng của nó (hoặc có thể gửi đi). – Zend\Http\PhpEnvironment cung cấp một bộ trang trí cho các đối tượng HTTP Request và Response với mục đích đảm bảo rằng các yêu cầu được đưa ra ôi t ờ hiệ t i (b ồ á v ô m rư ng n à ao g m c c c query tham số, tham số POST, . ) 13 Bài 1. Tổng quan ZF2 4 Z d MVC. vi – Zend\Mvc\Controller một bộ các lớp “bộ điều khiển” chồng, đối tượng với các nhiệm vụ cơ bản như hệ thống các sự kiện, hành động gửi đi – Zend\Mvc\Service cung cấp một bộ yếu tố và định nghĩa các quy trình làm việc của ServiceManager. . – Zend\Mvc\View cung cấp các thông số mặc định cho d l ti độ h iải i t đă ký tên erer se ec on, p n g v ew scr p , ng helper; . 14 Bài 1. Tổng quan ZF2 4 Z d MVC. vi  Gateway của MVC là đối tượng Zend\Mvc\Application (gọi tắt là “Application”). Nhiệ hí hử “A li ti” là khởi động á m vụ c n c a pp ca trên tạo c c tài nguyên, định tuyến yêu cầu, nhận và gửi t ll hù h t á á t ì h đ ị hcon ro er p ợp rong c c qu . Sau khi hoàn thành, nó sẽ render view, h à thà h á t ả ề à ửio n n c c reques , r v v g đáp ứng. 15 Bài 1. Tổng quan ZF2 4 Z d MVC. vi  Cấu hình ứng dụng cơ bản. 16 Bài 1. Tổng quan ZF2 4 Z d MVC. vi  Cấu hình ứng dụng cơ bản. – File public/index. php. bao gồm tất cả các yêu cầu (request) của người dùng đến trang web nhận một , mảng cấu hình được đặt tại tệp config/application. cấu hình. php, khi trả về nó được gọi là phương thức run() của “Ứng dụng”, xử lý yêu cầu và gửi lại phản hồi cho người dùng. ấ– Thư mục cấu hình chứa cấu hình được sử dụng bởi Zend\ModuleManager để tải mô-đun và cấu hình hợp nhất. 17 Bài 1. Tổng quan ZF2 4 Z d MVC. vi – Thư mục nhà cung cấp. Chứa các mô-đun hoặc thư viện của tổ chức thứ ba mà ứng dụng cần sử dụng để truy cập. Nó có thể bao gồm cả ZF hoặc các thư viện từ các dự án khác, không nên sửa đổi trạng thái ban đầu của các thư viện và mô-đun đặt trong nhà cung cấp thư mục của chúng. ề– Module thư mục. Chứa một hoặc nhiều mô-đun cung cấp các chức năng của ứng dụng 18 Bài 1. Tổng quan ZF2 4 Z d MVC. vi  Cấu hình module cơ bản. – In a module could contain. mã PHP, bao gồm cả chức năng thư viện mã MVC xem tập lệnh và tài liệu , , nguyên chung như. hình ảnh, CSS, JavaScript. Yêu cầu duy nhất – có thể là tùy chọn là một mô-đun hoạt động như một không gian tên PHP và nó chứa Mô-đun lớp. không gian tên php bên dưới. This class was Z d\M d l M ử d to the hiệ ộ ố o u e anager s ử dụng n m s nhiệm vụ. 19 Bài 1. Tổng quan ZF2 4 Z d MVC. vi 20 Bài 1. Tổng quan ZF2 4 Z d MVC. vi – Khi một mô-đun hoạt động như một không gian tên thư , mục mô-đun cũng phải có tên là tên của không gian tên. Không gian tên này cũng có thể bao gồm tiền tố của nhà cung cấp. • Ví dụ. Mô-đun liên quan đến “Người dùng” có chức năng được cung cấp bởi Z d, ó thể đặt tên là “Z dU” c p en c n ser. – Module File. php will be in directory – this namespace. không gian tên ZendUser; . Tổng quan ZF2 4 Z d MVC. vi  Có ba tập tin autoload * php không bắt buộc _. , but resumption should have, that is. tự động tải bản đồ lớp php. return an classmap of– _. cặp tên lớp/tên tệp (với tên tệp được thông báo qua hằng số DIR ). __ __ – autoload_function. php. Return to a callback PHP which can information through spl autoload register(). Thông thường _ _ this callback nên sử dụng ánh xạ được trả về bởi autoload_classmap. php. – autoload_register. php. should register a PHP callback (thường được trả về bởi autoload function php with spl autoload register())_. _ _. 22 Bài 1. Tổng quan ZF2 4 Z d MVC. vi  Đặc điểm của tệp ba này là cung cấp các cơ chế mặc định phù hợp để tự động tải các lớp trong mô-đun do đó cung cấp cách thức dễ dàng để thực hiện mô-đun thi mà không cần Zend\ModuleManager 23 Bài 1. Tổng quan ZF2 4 Z d MVC. vi  Thư mục cấu hình. nên chứa các module cấu hình cụ thể. This file has an fixed format is being support of Zend\Config Config Config configuration should be. “mô-đun. format”, và cấu hình dựa trên PHP nên là “module config php”. . .  Thư mục src. thù thủ cấu trúc thư mục chứa d u d l Nê ó ít hất ột thsource co e c a mo u e. n c n m ư mục con trong không gian tên thư mục. 24 Bài 1. Tổng quan ZF2 4 Z d MVC. vi  Thư mục xem. Chứa các tập lệnh xem có liên quan đến các bộ điều khiển. Th t hứ á it t t uất d ư mục. c a c c un es c a ng dụng. Thông thường sử dụng PHPUnit, và chứa các thành phần liê đế ấ hì h ủ ó ( í d hy u n quan n c u n c a n v ụ n ư phpunit. xml, khởi động. php)  Thư mục public. Chứa các thứ chung cho ứng dụng, có thể là thư mục hình ảnh, CSS, JavaScript 25 Bài 1. Tổng quan ZF2 4 Z d MVC. vi  Khởi tạo mô-đun trong ứng dụng – Để khởi tạo mô-đun trong ứng dụng, ta thông qua Zend\ModuleManager\ModuleManager. – Thành phần này cho phép ta chỉ đến nơi mô-đun tồn tại Sau đó nó sẽ xác định vị trí mô-đun và khởi động. tạo. Các lớp mô-đun có thể gắn vào các trình nghe khác nhau trên ModuleManager để cung cấp thông tin, dịch vụ, trình nghe cho ứng dụng. 26 Bài 1. Tổng quan ZF2 4 Z d MVC. vi – Trình quản lý cấu hình module • Cấu hình trình quản lý module. Đơn giản chỉ cần thông báo cho trình quản lý mô-đun biết mô-đun nào để tải và có khả năng cung cấp khả năng mơ ước p c u hình cho trình nghe mô-đun. • In file application. cấu hình. php, ta cung cấp thông tin cấu hình. // cấu hình/ứng dụng. cấu hình. php return array( Khi thêm module vào hệ thống 'modules' => array( /*. */ ), ' d l li t ti ' ( system, ta will add this item into arraymo u e_ s ener_op ons => array 'module_paths' => array( '. /module', ' / endor' “mô-đun”. 27. v , ),),); . Tổng quan ZF2 4 Z d MVC. vi  Mỗi lớp “Mô-đun” có cấu hình mà nó muốn “Ứng dụng” biết sẽ được khai báo trong phương thức getConfig(). Phương thức này sẽ trả về một mảng hoặc một đối tượng Traversable như Zend\Config\Config. không gian tên ZendUser; . '/config/mô-đun. cấu hình. php' } }  Ngoài ra còn có nhiều phương thức khác có thể định nghĩa để cung cấp autoloader thông tin, dịch vụ cho ServiceManager  28 Bài 1. Tổng quan ZF2 5 Cài đặt à ấ hì h ZF2. v c u n  Các bước thực hiện – Tải về và cài đặt Wamp Server 2. 1 (WampServer2. 1e-x32. exe) – Truy cập mô-đun Apache trong máy chủ wamp => bật mô-đun rewrite_module – Tải xuống freamwork zend 2. x tại – Tải xuống ứng dụng mẫu (Skeleton Application) của zend framework 2. x at https. //github com/zendframework/ZendSkelet. onApplication 29 Bài 1. Tổng quan ZF2 5 Cài đặt à ấ hì h ZF2. c ụ Giải nén mẫu ứng dụng vào thư mục lưu trữ– web Cấ t ú â th ứ d ẫ n– u r c c y u mục tiêu sử dụng. 30 Bài 1. Tổng quan ZF2 5 Cài đặt à ấ hì h ZF2. v c u n Trong đó. – 31 Bài 1. Tổng quan ZF2 5 Cài đặt à ấ hì h ZF2. v c u n Tạo thư mục thư viện trong ứng dụng này sau– đó gói zend framework 2. x giải nén tại đây 32 Bài 1. Tổng quan ZF2 5 Cài đặt à ấ hì h ZF2. v c u n  Chú ý. Nếu muốn sử dụng một thư viện Zend cho tất cả các ứng dụng, thì cần phải tạo ra một biến toàn cục như sau. – Vào Computer => Properties => Advanced => E i t V i bl > N > T Biếnv ronmen ar a es = ew = ạo n mới => OK 33 Ví dụ. ZF2_PATH = H. \wamp\www\\ZendSkeletonApplication01112012\library Bài 1. Tổng quan ZF2 5 Cài đặt à ấ hì h ZF2. v c u n  Chú ý (tt) – Nếu muốn sử dụng riêng cho từng website thì ỗ i kh i website ta c n ph i có thư mục Library\Zend trong Thư viện chứa các thư viện h c a Zend Framwork 2. x set at. h. \wamp\www\PHP_NC\zend_app vendor\ZF2 34 Bài 1. Tổng quan ZF2 5 Cài đặt à ấ hì h ZF2. v c u n  Kết quả sau khi cài đặt và cấu hình thành công. 35 Bài 1. Tổng quan ZF2 36 TRUNG TÂM TÍN HỌC ĐẠI HỌC KHOA HỌC TỰ NHIÊN-TP. HCM 1 LẬP TRÌNH PHP NÂNG CAO ZEND FRAMEWORK 2 TRUNG TÂM TÍN HỌC ĐẠI HỌC KHOA HỌC TỰ NHIÊN-TP. HCM 2 Bài 2. Mô-đun Zend 1. Mô-đun Zend 2. Build module for application 3. Trình quản lý mô-đun Zend 4. Trình tải tự động mô-đun Zend 5. Configure for module 6. Thông báo về việc làm có mô-đun mới Bài 2. Mô-đun Zend 3 1. Mô-đun Zend Khái niệm.  Mô-đun là một nhóm trong đó có chứa các thành phần của trang web phục vụ cho chức năng hoàn chỉnh bất kỳ chức năng nào.  ZF2 giới thiệu một cách tiếp cận mới và rất mạnh mẽ cho các mô-đun.  Hệ thống mới này được thiết kế mềm dẻo, linh hoạt, đơn giản và dễ dàng tái sử dụng.  Mô-đun có thể chứa. mã PHP - theo mô hình MVC, mã thư viện, xem tập lệnh và các tài nguyên sử dụng chung như hình ảnh, CSS và JavaScript. bài 2. Mô-đun Zend 1. Mô-đun Zend  Trong ZF2 tất cả đều được tối ưu hóa thành mô-đun. Người dùng có thể tự xây dựng mô-đun cho mình hoặc có thể sao chép mô-đun của người khác về ứng dụng để phục vụ cho công việc của mình.  Module hệ thống được tạo thành như sau. – Module Autoloader – Module Manager – ModuleManager Listeners 4 Bài 2. Mô-đun Zend 1. Zend Module  Trong đó. – Trình tải tự động mô-đun. Đây là phần đặc biệt giúp xử lý các không gian tên, ánh xạ và giữ các trường hợp khi cần xử lý. – Trình quản lý mô-đun. Thành phần này có chức năng quản lý mô-đun, quản lý và hợp nhất cấu hình của các mô-đun, điều khiển bộ tải. – Trình xử lý mô-đun – Trình xử lý sự kiện có thể được gắn với các sự kiện khác nhau của trình quản lý mô-đun. Những người nghe có thể thực hiện mọi công việc từ việc giải quyết và tải các mô-đun để thực hiện khởi động các nhiệm vụ phức tạp. 5 bài 2. Mô-đun Zend 2. Xây dựng mô-đun cho ứng dụng  Zend framework sử dụng mô-đun hệ thống và ta sẽ tổ chức các nội dung chính của ứng dụng trong các mô-đun.  Trong gói mẫu đã cài đặt có Ứng dụng mô-đun, được cung cấp bởi Skeleton, nó cung cấp các định nghĩa và cấu hình tiêu chuẩn mà một mô-đun cần phải có (bootstrapping, lỗi và cấu hình định tuyến), đồng thời cung cấp các điều khiển. . 6 bài 2. Mô-đun Zend 2. Xây dựng mô-đun cho ứng dụng  Tuy nhiên, ta sẽ chỉ tham khảo mô-đun này để tạo và làm riêng một mô-đun và thực hiện các chức năng cần thiết trong mô-đun riêng.  Ta sẽ đặt tất cả các code cần thiết vào module của chúng ta, nơi chứa các controller, model, form và view kèm theo các cấu hình (configuration).  Ta cũng sẽ tinh chỉnh module Application khi được yêu cầu. 7 Bài 2. Mô-đun Zend 2. Xây dựng module cho ứng dụng  Ví dụ. Xây dựng ứng dụng đầu tiên với Zend Framework có kết nối đến cơ sở dữ liệu –Ứng dụng sẽ xây dựng là một cửa hàng bán tranh. Trang chính sẽ liệt kê các bảng tranh mà cửa hàng có bán. Cửa hàng có thể hiển thị, thêm, xóa và cập nhật Tranh khi cần. 8 bài 2. Mô-đun Zend 2. Xây dựng module cho ứng dụng  Theo yêu cầu trên, sẽ có 4 trang trong ứng dụng. – Danh mục tranh, kèm theo liên kết để người dùng có thể xem chi tiết; . form used to more new – Cập nhật tranh. form used to update – Clear tranh. dùng form to delete 9 Bài 2. Mô-đun Zend 2. Xây dựng mô-đun cho ứng dụng  Cần phải lưu trữ dữ liệu vào cơ sở dữ liệu đơn giản như sau. Bảng Sản phẩm (để lưu tranh) – ProductID. code number tranh – ProductName. tên tranh – Mô tả. mô tả – Giá. giá – Số tiền. number 10 Bài 2. Mô-đun Zend 2. Xây dựng module cho ứng dụng  Thực hiện module – Bước 1. Build the directory after for application 11 Zend_app/ /module /Product /config /src /Product /Controller /Form /Model /view /product /product Module Product có các thư mục con với các loại tệp khác nhau. Các tệp PHP chứa các lớp trong không gian tên Sản phẩm được đặt trong thư mục src/Sản phẩm. Có thể có nhiều không gian tên khác nhau trong thư mục này. Thư mục chế độ xem cũng có một thư mục gọi là sản phẩm chứa các chế độ xem cho mô-đun. bài 2. Mô-đun Zend 3. Zend Module Manager  Để tải và cấu hình một mô-đun, ZF2 có ModuleManager.  Mô-đun này có thể xem như mô-đun tệp. php set in the root directory of module. – Ví dụ. mô-đun/Sản phẩm và có một lớp được gọi là Sản phẩm/Mô-đun bên trong nó.  Các lớp trong cùng một mô-đun sẽ có không gian tên có tên là tên của mô-đun (tên thư mục cũng là tên của mô-đun) 12 Bài 2. Mô-đun Zend 3. Zend Module Manager  Thực hiện module (tt) – Bước 2. Xây dựng mô-đun. php nằm trong module Product 13 namespace Product; . '/autoload_classmap. php‘, ), 'Zend\Loader\StandardAutoloader' => mảng( 'không gian tên' => mảng( __NAMESPACE__ => __DIR__. '/src/'. __NAMESPACE__, ), ),); . '/config/mô-đun. cấu hình. php'; . Mô-đun Zend 4. Zend Module Autoloader  Phương thức getAutoloaderConfig() trả về một mảng tương thích với AutoloaderFactory. Cần phải cấu hình để có thể thêm tệp bản đồ lớp vào ClassmapAutoloader và đồng thời thêm không gian tên của mô-đun này vào StandardAutoloader.  Autoloader yêu cầu tiêu chuẩn phải có một namespace và một đường dẫn để có thể tìm thấy các file của namespace này. Đó là lệnh thủ theo PSR-0 và để các lớp bản đồ trực tiếp đến các tệp theo quy tắc của PSR-0.  Khi triển khai ứng dụng, ta không cần phải tải các tệp thông qua sơ đồ lớp, vì thế ta chỉ cần cung cấp một mảng trống cho trình tải tự động sơ đồ lớp. 14 Bài 2. Mô-đun Zend 4. Zend Module Autoloader  Thực hiện module (tt) – Bước 3. Tạo tệp autoload_classmap. php has an after. – With an array as empty on thì bất cứ khi nào autoloader tìm lớp tìm kiếm trong Product namespace, it will self-call ngược lại StandardAutoloader. 15 // mô-đun/Sản phẩm/autoload_classmap. php. trả về mảng(); . Mô-đun Zend 4. Zend Module Autoloader  Chú ý. – Ta đang sử dụng Trình soạn thảo, như một sự thay thế, ta không triển khai (triển khai) getAutoloaderConfig() và thay vào đó ta thêm "Ứng dụng". "module/Application/src" vào phím psr-0 trong trình soạn nhạc. json. – Nếu ta chọn cách này thì ta phải chạy php composer. cập nhật php để cập nhật các tệp tự động tải của trình soạn thảo. 16 Bài 2. Mô-đun Zend 5. Configure for module  Sau khi đăng ký autoloader, ta xem xét phương thức getConfig() trong Product\Module.  This method used to load file config/module. cấu hình. php 17 Bài 2. Mô-đun Zend 5. Cấu hình cho module  Thực hiện module (tt) – Bước 4. Tạo file cấu hình trong module Product 18 // module/Product/config/module. cấu hình. php. trả về mảng ( 'bộ điều khiển' => mảng ( 'invokables' => mảng ( 'Product\Controller\Product' => 'Product\Controller\ProductController', ), ), 'view_manager' => mảng ('template_path_stack' => . '/. /lượt xem', ), ), ); . Mô-đun Zend 6. Thông báo về việc có mô-đun mới  Ta cần phải thông báo với ModuleManager là có một mô-đun mới vừa được xây dựng.  Công việc này được thực hiện ở file config/application. cấu hình. php của ứng dụng, nơi cung cấp khung của ứng dụng. 19 Bài 2. Mô-đun Zend 6. Thông báo về việc có module mới  Thực hiện module (tt) – Bước 4. Cập nhật file config/application. cấu hình. php to “modules” có chứa module Sản phẩm. 20 // cấu hình/ứng dụng. cấu hình. php của ứng dụng trả về array( 'modules' => array( 'Application', 'Product', // array( 'config_glob_paths' => array( 'config/autoload/{,*. }{toàn cầu,địa phương}. php‘, ), 'module_paths' => mảng( '. /mô-đun', '. /người bán', ), ), ); . Zend Module 21 TRUNG TÂM TÍN HỌC ĐẠI HỌC KHOA HỌC TỰ NHIÊN-TP. HCM 1 LẬP TRÌNH PHP NÂNG CAO ZEND FRAMEWORK 2 TRUNG TÂM TÍN HỌC ĐẠI HỌC KHOA HỌC TỰ NHIÊN-TP. HCM 2 Bài 3. Định tuyến và Bộ điều khiển 1. định tuyến 2. Bộ điều khiển 3. Xem bài 3. Định tuyến và Bộ điều khiển 3 1. Định tuyến  ZF2 có một URL máy xạ hình rất mạnh mẽ. Bộ máy này cung cấp phương pháp rất linh hoạt trong việc ánh xạ URL sang cho Bộ điều khiển.  Ta có thể dễ dàng xác định các quy luật ánh xạ, cài đặt để ZF2 dựa trên các quy luật ánh xạ đó, xác định xem phải thực thi hành động nào.  ZF2 còn khả năng phân tích URL, chuyển các tham số trong URL thành các tham số trong phần gọi hàm của Bộ điều khiển. bài 3. Định tuyến và Bộ điều khiển 1. Định tuyến  Cách thức làm việc của trang theo ZF2. – Mỗi trang trong ứng dụng được xem như một hành động và các hành động này được nhóm vào các bộ điều khiển trong các mô-đun. – Vì vậy, ta cần phải nhóm các hành động có liên quan vào cùng một bộ điều khiển. – Một bộ điều khiển có thể có các hành động. hiện tại, lưu trữ, xem 4 Bài 3. Định tuyến và Bộ điều khiển 1. Định tuyến  Thực hiện (tt) – Bước 6. with ví dụ đã nêu ở bài Module, ta có 4 trang. hiển thị, bổ sung, cập nhật và xóa; . lập chỉ mục, thêm, chỉnh sửa, xóa – Việc lập bản đồ của một URL để một công cụ hành động có thể được thực hiện bằng cách sử dụng các định tuyến (tuyến đường) được định nghĩa trong mô-đun tệp. cấu hình. php của module. Ta sẽ bổ sung thêm lộ trình cho các hành động của Sản phẩm tại tệp cấu hình mô-đun này. 5 bài 3. Định tuyến và Bộ điều khiển 6 // module/Product/config/module. cấu hình. php 'bộ định tuyến' => mảng ( 'tuyến đường' => mảng ( 'sản phẩm' => mảng ( 'loại' => 'phân đoạn', 'tùy chọn' => mảng ( 'tuyến đường' => '/sản phẩm [/. hoạt động][/. id]', 'các ràng buộc' => mảng ( 'hành động' => '[a-zA-Z][a-zA-Z0-9_-]*', 'id' => '[0-9]+' . Phân đoạn cho phép ta chỉ định vị trí trong mẫu URL (tuyến đường) sẽ được ánh xạ tới các tham số được đặt tên. bài 3. Định tuyến và Bộ điều khiển 1. Định tuyến  Ví dụ. Trong trường hợp này, tuyến đường là ``/product[/. hoạt động][/. id]`` sẽ dẫn đến nơi có URL bắt đầu bằng /product.  Segment next to will map to id option.  Trong công thức trên, với các phân đoạn được đặt trong dấu ngoặc nhọn được hiểu là các tùy chọn phân đoạn.  Các phiên ràng buộc giúp đảm bảo các ký tự bên trong phân đoạn như mong muốn, và ta có một số lượng giới hạn các hành động bắt đầu bằng ký tự, sau đó là chữ số, gạch dưới hoặc gạch nối. Ta cũng giới hạn id cho một số. 7 bài 3. Định tuyến và Bộ điều khiển 1. Định tuyến  Ví dụ. Định tuyến cho ta những URL bên dưới đây. 8 URL Page Action /product Trang chủ (Danh sách các sản phẩm tranh) index /product/add Thêm sản phẩm tranh mới add /product/edit/2 Cập nhật sản phẩm tranh có id là 2 edit /product/delete/4 . Định tuyến và Bộ điều khiển 2. Bộ điều khiển  Trong ZF2, bộ điều khiển là một lớp có tên gọi cú pháp như sau. {Tên bộ điều khiển}Bộ điều khiển. With. – {Tên bộ điều khiển}. bắt đầu bằng chữ cái viết hoa – Lớp này nằm trong tệp có tên là {Tên trình điều khiển}Trình điều khiển. php set in the module Controller directory. Ví dụ. Trong trường hợp này thì lớp điều khiển sẽ đặt tại module/Product/src/Product/Controller. – Mỗi hành động là một phương thức toàn cục của bộ điều khiển lớp và có cú pháp tên gọi {tên hành động}Hành động, với {tên hành động} bắt đầu bằng chữ cái viết thường. 9 Bài 3. Định tuyến và Bộ điều khiển 2. Bộ điều khiển  Chú ý. Theo quy ước, ZF2 không cung cấp quá nhiều ràng buộc trên bộ điều khiển, mà họ phải thực hiện (triển khai) giao diện Zend\Stdlib\Dispatchable.  ZF2 cung cấp hai lớp hiển thị để thực hiện công việc này cho ta là Zend\Mvc\Controller\AbstractActionController và Zend\Mvc\Controller\AbstractRestfulController.  Ta sẽ sử dụng AbstractActionController theo tiêu chuẩn, nhưng nếu dự định sẽ viết RESTful web service thì có thể sử dụng AbstractRestfulController. 10 Bài 3. Định tuyến và Bộ điều khiển 2. Bộ điều khiển  Thực hiện (tt) – Bước 7. Build controller của Product 11 // module/Product/src/Product/Controller/ProductController. không gian tên php Sản phẩm\Bộ điều khiển; . Ta đã thông báo về bộ điều khiển này trong phần 'bộ điều khiển' tại config/module. cấu hình. php ở phía trên. bài 3. Định tuyến và Bộ điều khiển 3. Tạo chế độ xem  Tiếp tục theo yêu cầu phải thiết lập các hành động mà chúng ta muốn sử dụng bằng cách xây dựng các chế độ xem.  Khởi tạo các lượt xem – Để kết nối các lượt xem với ứng dụng, ta cần phải tạo các tập lệnh xem. Những tệp này sẽ được thực thi bởi DefaultViewStrategy và các biến hoặc mô hình chế độ xem sẽ được chuyển sang từ phương thức của bộ điều khiển. – Những tập lệnh xem này được lưu trữ trong thư mục xem của mô-đun. 12 Bài 3. Định tuyến và Bộ điều khiển 3. Create view  Thực hiện (tt) – Ví dụ. Chuẩn bị các tệp cho các tập lệnh xem như sau. • mô-đun/Sản phẩm/chế độ xem/sản phẩm/sản phẩm/chỉ mục. phtml • mô-đun/Sản phẩm/chế độ xem/sản phẩm/sản phẩm/thêm. phtml • mô-đun/Sản phẩm/chế độ xem/sản phẩm/sản phẩm/chỉnh sửa. phtml • mô-đun/Sản phẩm/xem/sản phẩm/sản phẩm/xóa. phtml – Chú ý. Nội dung của các tệp này sẽ được điền sau, sau khi đã kết nối với cơ sở dữ liệu và viết nội dung cho mô hình. 13 Bài 3. Routing and Controller 14 TRUNG TÂM TÍN HỌC ĐẠI HỌC KHOA HỌC TỰ NHIÊN-TP. HCM 1 LẬP TRÌNH PHP NÂNG CAO ZEND FRAMEWORK 2 TRUNG TÂM TÍN HỌC ĐẠI HỌC KHOA HỌC TỰ NHIÊN-TP. HCM 2 Bài 4. Database và Model ZendDbAdapter Bài 4. Cơ sở dữ liệu và Mô hình 3 1. ZendDbAdapter Giới thiệu.  Bộ điều hợp đối tượng là một thành phần (thành phần phụ) quan trọng nhất của Zend\Db. Nó chịu trách nhiệm thích ứng các mã được viết trong Zend\Db tới các phần mở rộng PHP đích và cơ sở dữ liệu từ nhà cung cấp.  Để thực hiện công việc này, nó tạo ra một lớp đối tượng cho các thành phần mở rộng PHP, được gọi là "Trình điều khiển" của bộ điều hợp Zend\Db. Nó tạo ra một lớp đối tượng, được gọi là "Nền tảng" của bộ điều hợp, cho các nguồn khác nhau mà mỗi nhà cung cấp nền tảng cụ thể cũng có thể có trong quá trình thực hiện SQL / RDBMS. bài 4. Cơ sở dữ liệu và Mô hình 1. ZendDbAdapter – tạo bộ điều hợp  Tạo bộ điều hợp đơn giản bằng cách sử dụng lớp Zend\Db\Adapter\Adapter. Trường hợp biến phổ biến nhất là thông qua một cấu hình cấu hình cho Bộ điều hợp.  This Array is a Object with the tham số yêu cầu ở mức độ mở rộng. 4 $adapter = new Zend\Db\Adapter\Adapter($configArray); . Cơ sở dữ liệu và Mô hình 1. Zend Db Adapter – tạo Adapter  Bảng dưới đây là các giá trị nên có trong mảng cấu hình. 5 Từ khóa Yêu cầu/không yêu cầu phải có? . Cơ sở dữ liệu và Mô hình 1. ZendDbAdapter – tạo Adapter  Ví dụ. Connect to MySQL using ext/mysqli. 6 $adapter = new Zend\Db\Adapter\Adapter(array( 'driver' => 'Mysqli', 'database' => 'zend_db_example', 'username' => 'developer', 'password' => 'developer- . •Mysqli. trình điều khiển ext/mysqli •PGsql. trình điều khiển ext/pgsql •Sqlsrv. trình điều khiển ext/sqlsrv (của Microsoft) •Pdo_Mysql. MySQL thông qua mở rộng PDO •Pdo_Sqlite. SQLite thông qua mở rộng PDO •Pdo_Pgsql. PostgreSQL thông qua mở rộng PDO Bài 4. Cơ sở dữ liệu và Mô hình 1. ZendDbAdapter – tạo Adapter  Chú ý. – Sử dụng cách này để tạo bộ điều hợp, Bộ điều hợp lớp sẽ cố gắng tạo ra bất kỳ thuộc tính phụ thuộc nào cho dù không được nêu rõ ràng. – Trình điều khiển một đối tượng sẽ được tạo ra từ mảng cấu hình được cung cấp trong hàm tạo. Một nền tảng đối tượng sẽ được tạo ra dựa trên kiểu khởi tạo của lớp. – Một đối tượng mặc định ResultSet được tạo ra và sử dụng. Các đối tượng khác cũng có thể được thêm vào. 7 bài 4. Cơ sở dữ liệu và Mô hình 2. Chuẩn bị/thực hiện câu lệnh truy vấn  Chuẩn bị câu lệnh truy vấn thông qua Zend\Db\Adapter\Adapter. query() – Mặc dù vậy, query() là thứ mà ta chuẩn bị sẵn và được xem như một phương tiện tiện lợi để xử lý các câu lệnh SQL. Ta sẽ cung cấp một câu lệnh SQL với các giá trị được thay thế bằng các trình giữ chỗ, các tham số. – Ví dụ về quy trình làm việc với Zend\Db\Adapter\Adapter this is. 8 $adapter->query('CHỌN * TỪ `nghệ sĩ` WHERE `id` = ?', mảng(5)); . Cơ sở dữ liệu và Mô hình 2. Chuẩn bị/thực hiện câu lệnh truy vấn  Ví dụ này được thực hiện thông qua các bước sau. – Tạo ra một Object Statement mới – Chuẩn bị một mảng để truyền vào ParameterContainer nếu cần – Xếp ParameterContainer vào đối tượng Statement – ​​Thực thi câu lệnh đối tượng, tạo ra một kết quả đối tượng Kết quả – Kiểm tra đối tượng Kết quả để kiểm tra . – Nếu kết quả là một bộ câu lệnh truy vấn được tạo ra thì sao chép Nguyên mẫu ResultSet, đưa Kết quả vào làm nguồn dữ liệu, trả về (trường hợp bổ sung, cập nhật hoặc xóa dữ liệu) – Ngược lại, trả về Kết quả ( . Cơ sở dữ liệu và Mô hình 2. Chuẩn bị/thực thi câu lệnh truy vấn  Thực hiện câu lệnh truy vấn thông qua Zend\Db\Adapter\Adapter. query() – Trong một vài trường hợp ta cần phải thi ngay các câu lệnh. – Mục đích chính của công việc thực thi ngay câu lệnh truy vấn thay vì phải chuẩn bị sẵn sàng rồi mới thực thi là vì có thể chúng ta đang cố gắng thực thi một câu lệnh DDL (trong hầu hết các tiện ích mở rộng và nền tảng của nhà cung cấp, mà không cần chuẩn bị . 10 Bài 4. Cơ sở dữ liệu và Mô hình Ví dụ 1  Xóa khách hàng có MaKH=27 Bộ điều khiển. thử { $adapter = new \Zend\Db\Adapter\Adapter(array( 'driver' => 'Mysqli', 'database' => 'fashion', 'username' => 'root', 'password' => ' . QUERY_MODE_EXECUTE); . Database và Model  View if($results->getAffectedRows()>0) { echo 'xoa thanh cong'; . Cơ sở dữ liệu và Mô hình Ví dụ 2. Listing list user  Controller try { $adapter = new \Zend\Db\Adapter\Adapter(array( 'driver' => 'Mysqli', 'database' => 'fashion', 'username' => 'root' . QUERY_MODE_EXECUTE); . Cơ sở dữ liệu và Model 14 Ví dụ 2. Liệt kê danh sách User  View count()>0) { foreach ($results as $row) { echo $row->id. '. '; . ''; . Cơ sở dữ liệu và Mô hình Ví dụ 3  Xóa hàng khách có MaKH=27 File controller public function indexAction() { $auth = new AuthenticationService(); . Database và Model  File model LienheTable public function delete($adapter) { return $adapter->query( 'delete FROM Khachhang where MaKH=?', array(27), $adapter. QUERY_MODE_EXECUTE); . Cơ sở dữ liệu và Mô hình 2. Chuẩn bị/thực thi câu lệnh truy vấn – Ví dụ. – Một khác biệt duy nhất cần chú ý là ta phải cung cấp Adapter. QUERY_MODE_EXECUTE (execute) is a second tham số. 17 $adapter->query('ALTER TABLE ADD INDEX(`foo_index`) ON (`foo_column`)', Adapter. QUERY_MODE_EXECUTE); . Cơ sở dữ liệu và Mô hình 3. Tạo Tuyên bố  Trong khi truy vấn() rất hữu ích khi thực hiện truy vấn nhanh một lần tới CSDL thông qua Adapter, thường có ý nghĩa hơn khi tạo ra một tuyên bố và tương tác trực tiếp để ta có thể kiểm tra tốt hơn với .  Để thực hiện công việc này, Adapter cung cấp một phương thức gọi là createStatement() cho phép ta tạo ra một Driver Statement cụ thể để sử dụng giúp ta có thể quản lý công việc cần chuẩn bị và thực hiện theo luồng (chuẩn bị . Cơ sở dữ liệu và Mô hình 3. Tạo câu lệnh  Cú pháp. 19 $statement = $adapter->createStatement($sql, $optionParameters); . Cơ sở dữ liệu và Mô hình Ví dụ. Liệt kê danh sách khách hàng  File model LienheTable public function listAll($adapter) { $sql='select * FROM Khachhang'; . Cơ sở dữ liệu và Mô hình  Hàm điều khiển tệp công khai indexAction() { $auth = new AuthenticationService(); . ''; . Database and Model 22 TRUNG TÂM TÍN HỌC ĐẠI HỌC KHOA HỌC TỰ NHIÊN-TP. HCM 1 LẬP TRÌNH PHP NÂNG CAO ZEND FRAMEWORK 2 TRUNG TÂM TÍN HỌC ĐẠI HỌC KHOA HỌC TỰ NHIÊN-TP. HCM 2 Bài 4. Cơ sở dữ liệu và Mô hình 1. ZendDbAdapter 2. Chuẩn bị/thực thi câu lệnh truy vấn 3. Tạo câu lệnh 4. ZendDbSql 5. Cổng ZendDbTable 6. ZendDb RowGateway 7. Cơ sở dữ liệu 8. Mẫu 9. Build method in Controller 10. Tạo view Bài 4. Cơ sở dữ liệu và Mô hình 3 1. ZendDbAdapter Giới thiệu.  Bộ điều hợp đối tượng là một thành phần (thành phần phụ) quan trọng nhất của Zend\Db. Nó chịu trách nhiệm thích ứng các mã được viết trong Zend\Db tới các phần mở rộng PHP đích và cơ sở dữ liệu từ nhà cung cấp.  Để thực hiện công việc này, nó tạo ra một lớp đối tượng cho các thành phần mở rộng PHP, được gọi là "Trình điều khiển" của bộ điều hợp Zend\Db. Nó tạo ra một lớp đối tượng, được gọi là "Nền tảng" của bộ điều hợp, cho các nguồn khác nhau mà mỗi nhà cung cấp nền tảng cụ thể cũng có thể có trong quá trình thực hiện SQL / RDBMS. bài 4. Cơ sở dữ liệu và Mô hình 1. ZendDbAdapter – tạo bộ điều hợp  Tạo bộ điều hợp đơn giản bằng cách sử dụng lớp Zend\Db\Adapter\Adapter. Trường hợp biến phổ biến nhất là thông qua một cấu hình cấu hình cho Bộ điều hợp.  This Array is a Object with the tham số yêu cầu ở mức độ mở rộng. 4 $adapter = new Zend\Db\Adapter\Adapter($configArray); . Cơ sở dữ liệu và Mô hình 1. Zend Db Adapter – tạo Adapter  Bảng dưới đây là các giá trị nên có trong mảng cấu hình. 5 Từ khóa Yêu cầu/không yêu cầu phải có? . Cơ sở dữ liệu và Mô hình 1. ZendDbAdapter – tạo Adapter  Ví dụ. Connect to MySQL using ext/mysqli. 6 $adapter = new Zend\Db\Adapter\Adapter(array( 'driver' => 'Mysqli', 'database' => 'zend_db_example', 'username' => 'developer', 'password' => 'developer- . •Mysqli. trình điều khiển ext/mysqli •PGsql. trình điều khiển ext/pgsql •Sqlsrv. trình điều khiển ext/sqlsrv (của Microsoft) •Pdo_Mysql. MySQL thông qua mở rộng PDO •Pdo_Sqlite. SQLite thông qua mở rộng PDO •Pdo_Pgsql. PostgreSQL thông qua mở rộng PDO Bài 4. Cơ sở dữ liệu và Mô hình 1. ZendDbAdapter – tạo Adapter  Chú ý. – Sử dụng cách này để tạo bộ điều hợp, Bộ điều hợp lớp sẽ cố gắng tạo ra bất kỳ thuộc tính phụ thuộc nào cho dù không được nêu rõ ràng. – Trình điều khiển một đối tượng sẽ được tạo ra từ mảng cấu hình được cung cấp trong hàm tạo. Một nền tảng đối tượng sẽ được tạo ra dựa trên kiểu khởi tạo của lớp. – Một đối tượng mặc định ResultSet được tạo ra và sử dụng. Các đối tượng khác cũng có thể được thêm vào. 7 bài 4. Cơ sở dữ liệu và Mô hình 2. Chuẩn bị/thực hiện câu lệnh truy vấn  Chuẩn bị câu lệnh truy vấn thông qua Zend\Db\Adapter\Adapter. query() – Mặc dù vậy, query() là thứ mà ta chuẩn bị sẵn và được xem như một phương tiện tiện lợi để xử lý các câu lệnh SQL. Ta sẽ cung cấp một câu lệnh SQL với các giá trị được thay thế bằng các trình giữ chỗ, các tham số. – Ví dụ về quy trình làm việc với Zend\Db\Adapter\Adapter this is. 8 $adapter->query('CHỌN * TỪ `nghệ sĩ` WHERE `id` = ?', mảng(5)); . Cơ sở dữ liệu và Mô hình 2. Chuẩn bị/thực hiện câu lệnh truy vấn  Ví dụ này được thực hiện thông qua các bước sau. – Tạo ra một Object Statement mới – Chuẩn bị một mảng để truyền vào ParameterContainer nếu cần – Xếp ParameterContainer vào đối tượng Statement – ​​Thực thi câu lệnh đối tượng, tạo ra một kết quả đối tượng Kết quả – Kiểm tra đối tượng Kết quả để kiểm tra . – Nếu kết quả là một bộ câu lệnh truy vấn được tạo ra thì sao chép Nguyên mẫu ResultSet, đưa Kết quả vào như nguồn dữ liệu, trả về (trường hợp bổ sung, cập nhật hoặc xóa dữ liệu) – Ngược lại, trả về Kết quả ( . Cơ sở dữ liệu và Mô hình 2. Chuẩn bị/thực thi câu lệnh truy vấn  Thực hiện câu lệnh truy vấn thông qua Zend\Db\Adapter\Adapter. query() – Trong một vài trường hợp ta cần phải thi ngay các câu lệnh. – Mục đích chính của công việc thực thi ngay câu lệnh truy vấn thay vì phải chuẩn bị sẵn sàng rồi mới thực thi là vì có thể chúng ta đang cố gắng thực thi một câu lệnh DDL (trong hầu hết các tiện ích mở rộng và nền tảng của nhà cung cấp, mà không cần chuẩn bị . 10 Bài 4. Cơ sở dữ liệu và Mô hình 2. Chuẩn bị/thực thi câu lệnh truy vấn – Ví dụ. – Một khác biệt duy nhất cần chú ý là ta phải cung cấp Adapter. QUERY_MODE_EXECUTE (execute) is a second tham số. 11 $adapter->query('ALTER TABLE ADD INDEX(`foo_index`) ON (`foo_column`)', Adapter. QUERY_MODE_EXECUTE); . Cơ sở dữ liệu và Mô hình 3. Tạo Tuyên bố  Trong khi truy vấn() rất hữu ích khi thực hiện truy vấn nhanh một lần tới CSDL thông qua Adapter, thường có ý nghĩa hơn khi tạo ra một tuyên bố và tương tác trực tiếp để ta có thể kiểm tra tốt hơn với .  Để thực hiện công việc này, Adapter cung cấp một phương thức gọi là createStatement() cho phép ta tạo ra một Driver Statement cụ thể để sử dụng giúp ta có thể quản lý công việc cần chuẩn bị và thực hiện theo luồng (chuẩn bị . Cơ sở dữ liệu và Mô hình 3. Tạo câu lệnh  Cú pháp. 13 $statement = $adapter->createStatement($sql, $optionParameters); . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql là một biểu tượng SQL lớp được sử dụng để xây dựng nền tảng truy vấn SQL trên nền tảng, công cụ có thể thông qua API hướng đối tượng.  Kết quả cuối cùng của đối tượng Zend\Db\Sql sẽ vừa tạo ra một Tuyên bố và vùng chứa tham số đại diện cho truy vấn đích hoặc là một chuỗi đầy đủ có thể thực thi trực tiếp trên nền của cơ sở dữ liệu.  Thực hiện công việc này, Để Zend\Db\Sql các đối tượng cung cấp một đối tượng Zend\Db\Adapter\Adapter (đã giới thiệu ở phần trên) để tạo ra những kết quả mong muốn. 14 Bài 4. Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Sql – Có một số công việc chính cần phải tương tác với cơ sở dữ liệu (từ DML - Ngôn ngữ thao tác dữ liệu). truy vấn lọc dữ liệu, thêm dữ liệu, cập nhật và xóa dữ liệu. – Như vậy có bốn đối tượng chính mà nhà phát triển cần tương tác hoặc xây dựng các câu lệnh truy vấn. Zend\Db\Sql\Select, Insert, Update và Delete. – Tuy nhiên, bốn công việc này có liên quan khá mật thiết với nhau và thường kết hợp giống nhau trong cùng một ứng dụng, các đối tượng Zend\Db\Sql\Sql giúp chúng tôi tạo ra chúng và tạo ra kết quả mà chúng tôi . 15 Bài 4. Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Sql  Bây giờ nhà phát triển có thể tương tác với những đối tượng này. 16 sử dụng Zend\Db\Sql\Sql; . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Sql – Sử dụng đối tượng Select – Chuẩn bị câu lệnh truy vấn Ví dụ. 17 sử dụng Zend\Db\Sql\Sql; . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Sql – Sử dụng đối tượng Select – Thực thi câu lệnh truy vấn Ví dụ. 18 sử dụng Zend\Db\Sql\Sql; . QUERY_MODE_EXECUTE); . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Sql – Các đối tượng Zend\Db\Sql\Sql cũng có thể bị ràng buộc đối với một bảng cụ thể, do đó việc thực hiện các đối tượng chọn, chèn, cập nhật, hoặc xóa, tất cả . – Ví dụ 19 sử dụng Zend\Db\Sql\Sql; . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Sql. Chọn, Chèn, Cập nhật và Xóa – Mỗi đối tượng đều được khai thác từ giao diện (2) dưới đây. – Có nhiều phương thức ta có thể gọi để tạo ra (a) một tuyên bố đã được chuẩn bị sẵn, hoặc (b) một chuỗi để thực thi. 20 giao diện PreparableSqlInterface { chức năng công cộng chuẩn bịStatement(Adapter $adapter, StatementInterface $statement); . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Sql. Select – Zend\Db\Sql\Select là một đối tượng có chức năng chính là để giới thiệu một hệ thống API tốt nhất cho việc xây dựng nền tảng cho các truy vấn SQL SELECT cụ thể. This class may be quick done that don't need Zend\Db\Sql\Sql. – Nếu một bảng được cấp cho một đối tượng Chọn, thì phương thức from() không thể được gọi sau này để thay đổi tên của bảng. 21 sử dụng Zend\Db\Sql\Select; . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Khi ta có một đối tượng Chọn hợp lệ, API có thể được sử dụng để tiếp tục xác định các phần khác nhau của câu lệnh chọn. - Từ. $select->from(‘$table'); . $select->columns(mảng $columns, $prefixColumnsWithTable = true); . $select->tham gia($name, $on, $columns = self. SQL_STAR, $type = tự. THAM GIA_INNER); . Cơ sở dữ liệu và Mô hình 4. ZendDbSql – Ở đâu/có. $select->where($predicate, $combination = Predicate\PredicateSet. OP_AND); . $select->group($group); . $select->having($predicate, $combination = Predicate\PredicateSet. OP_AND); . $select->order($order); . $select->limit($limit); . $select->offset($offset); . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Sql. Select - from 24 // as a string. $select->from('foo'); . // tạo ra SELECT "t". * TỪ "bảng" NHƯ "t" $select->from(mảng('t' => 'bảng')); . // giống như đầu ra ở trên như trên $select->from(new TableIdentifier(array('t' => 'table'))); . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Sql. Select - column() 25 // as an array cột $select->columns(array('foo', 'bar')); . // tạo ra ‘bar' AS 'foo', 'bax' AS 'baz' $select->columns(array('foo' => 'bar', 'baz' => 'bax')); . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Sql. Select - join() 26 $select->join( 'foo' // tên bảng, 'id = bar. id', // điều kiện kết nối, mảng('bar', 'baz'), // (tùy chọn) liệt kê các cột tương ứng với các cột biểu thức() phía trước $select. JOIN_OUTER // (option), kết nối bên trong, bên ngoài, bên trái, bên phải ); . foo_id = b. foo_id'); . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Sql. Chọn - where() 27 // CHỌN "foo". * TỪ "foo" WHERE x = 5 $select->from('foo')->where('x = 5'); . * TỪ "foo" WHERE x = 5 AND y = z $select->from('foo')->where(array('x = 5', 'y = z')); . * TỪ "foo" Ở ĐÂU "c1" LÀ NULL VÀ "c2" TRONG (?, ?, ?) VÀ "c3" KHÔNG PHẢI LÀ NULL $select->from('foo')->where(array( 'c1' = . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Sql. Chọn - đặt hàng() 28 $select = new Select; . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Sql. Select - limit() and offset() 29 $select = new Select; . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Insert. Lớp API 30 Chèn triển khai SqlInterface, PreparableSqlInterface { const VALUES_MERGE = 'merge'; . VALUES_SET); . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Insert. cột() 31 $insert->columns(array('foo', 'bar')); . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Insert. values() 32 // hành vi mặc định của các giá trị là thiết lập các giá trị // các lệnh gọi kế tiếp sẽ không giữ nguyên các giá trị từ các lệnh gọi trước $insert->values(array( 'col_1' => 'value1', 'col_2' => 'value2 . GIÁ TRỊ); . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Update. Cập nhật lớp 33 { const VALUES_MERGE = 'hợp nhất'; . VALUES_SET); . OP_AND); . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Update – set() 34 $update->set(array('foo' => 'bar', 'baz' => 'bax')); . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Delete 35 lớp Xóa { public $where; . OP_AND); . Cơ sở dữ liệu và Mô hình 5. Cổng ZendDbTable  Cổng bảng đối tượng được sử dụng để cung cấp một đại diện đối tượng cho một bảng trong và các phương thức của đối tượng CSDL này ánh xạ tới các thao tác tương tự như trong bảng của CSDL. Giao diện của đối tượng này có nội dung như sau. 36 giao diện Zend\Db\TableGateway\TableGatewayInterface { public function getTable(); . Cơ sở dữ liệu và Mô hình 5. ZendDbTable Gateway  Có hai triển khai chính của TableGatewayInterface hiệu quả nhất là. AbstractTableGateway và TableGateway.  AbstractTableGateway là một triển khai cơ sở hiển thị cung cấp các chức năng như select(), insert(), update(), delete() thư hiện các công việc tương tự như các đối tượng SQL object, và các phương thức selectWith( . Cơ sở dữ liệu và Mô hình 5. ZendDbTable Gateway  Hơn nữa, AbstractTableGateway cũng thực hiện như một API “Tính năng”, cho phép mở rộng các hành vi – hành vi của cơ sở triển khai TableGateway mà không cần phải mở rộng Lớp với các tính năng mới.  TableGateway cụ thể đơn giản chỉ cần thêm một hàm tạo hợp lý cho lớp AbstractTableGateway, TableGateway không cần mở rộng để thu nhận và sử dụng để phát huy tối đa. 38 Bài 4. Cơ sở dữ liệu và Mô hình 5. ZendDbTable Gateway  Sử dụng. Nhanh chóng để có thể sử dụng Zend\Db\TableGateway là cấu hình và sử dụng công cụ impelemtation của TableGateway. API của một TableGateway cụ thể là. 39 Bài 4. Cơ sở dữ liệu và Model 40 class TableGateway extends AbstractTableGateway { public $lastInsertValue; . Cơ sở dữ liệu và Mô hình 5. ZendDbTable Gateway  Sử dụng. – Đối tượng TableGateway cụ có thể được khởi động trong quá trình tạo hàm. Tên bảng và thể hiện của một Bộ điều hợp cần thiết để thiết lập một đối tượng làm việc TableGateway. – Khi phương thức select() được thực thi, một đối tượng ResultSet đơn giản với Kết quả của bộ điều hợp sẽ được trả về và sẵn sàng cho việc sử dụng. 41 Bài 4. Cơ sở dữ liệu và Mô hình 5. ZendDbTable Gateway  Sử dụng. – Ví dụ. 42 sử dụng Zend\Db\TableGateway\TableGateway; . '; . PHP_EOL; . $artistTable = new TableGateway('artist', $adapter); . Cơ sở dữ liệu và Mô hình 5. ZendDbTable Gateway  Sử dụng. – Phương thức select() có các lập luận tương tự như Zend\Db\Sql\Select. where() with the bổ sung cũng được chấp nhận, sẽ thông qua các đối tượng Chọn được sử dụng để xây dựng truy vấn CHỌN. 43 sử dụng Zend\Db\TableGateway\TableGateway; . Cơ sở dữ liệu và Mô hình 5. ZendDbTable Gateway  Đặc điểm của Table Gateway – API tính năng cho phép mở rộng chức năng của đối tượng TableGateway cơ sở mà không cần thiết phải mở rộng lớp cơ sở. – Với đối tượng TableGateway, các đặc tính cần phải được đưa vào thông qua constructor. – Constructor can get features in ba format other nhau. đối tượng tính năng đơn, đối tượng Bộ tính năng hoặc mảng đối tượng Tính năng. 44 Bài 4. Cơ sở dữ liệu và Mô hình 5. Cổng ZendDbTable – Dưới đây là một số tính năng được tích hợp sẵn và được cung cấp cùng với Zend\Db. • Tính năng GlobalAdapter. khả năng sử dụng bộ điều hợp toàn cầu/tĩnh mà không cần phải đưa nó vào một phiên bản TableGateway. Nó rất hữu ích khi ta mở rộng việc sử dụng AbstractTableGateway. 45 lớp MyTableGateway mở rộng AbstractTableGateway { public function __construct() { $this->table = 'my_table'; . setStaticAdapter($adapter); . Cơ sở dữ liệu và Mô hình 5. Cổng ZendDbTable – Dưới đây là một số tính năng được tích hợp sẵn và được cung cấp cùng với Zend\Db. • Tính năng MasterSlave. khả năng sử dụng bộ điều hợp chính để chèn(), cập nhật() và xóa() khi sử dụng bộ điều hợp phụ cho tất cả thao tác chọn() (toán tử/hoạt động). 46 $table = new TableGateway('artist', $adapter, new Feature\MasterSlaveFeature($slaveAdapter)); . Cơ sở dữ liệu và Mô hình 5. Cổng ZendDbTable – Dưới đây là một số tính năng được tích hợp sẵn và được cung cấp cùng với Zend\Db. • Tính năng siêu dữ liệu. khả năng điền vào TableGateway với thông tin của cột lấy từ siêu dữ liệu đối tượng. Nó cũng sẽ lưu trữ thông tin khóa chính trong trường hợp RowGatewayFeature cần sử dụng thông tin này. 47 $table = new TableGateway('artist', $adapter, new Feature\MeatdataFeature()); . Cơ sở dữ liệu và Mô hình 5. Cổng ZendDbTable – Dưới đây là một số tính năng được tích hợp sẵn và được cung cấp cùng với Zend\Db. • Tính năng sự kiện. khả năng sử dụng các đối tượng TableGateway với Zend\EventManager và để có thể đăng ký vào các sự kiện khác nhau trong một vòng đời của TableGateway. 48 $table = new TableGateway('artist', $adapter, new Feature\EventFeature($eventManagerInstance)); . Cơ sở dữ liệu và Mô hình 5. Cổng ZendDbTable – Dưới đây là một số tính năng được tích hợp sẵn và được cung cấp cùng với Zend\Db. • Tính năng RowGateway. khả năng select() return đối tượng ResultSet object lặp lại khi cần. 49 $table = new TableGateway('artist', $adapter, new Feature\RowGatewayFeature('id')); . Cơ sở dữ liệu và Mô hình 6. ZendDb RowGateway  Zend\Db\RowGateway là một thành phần con của Zend\Db thực hiện mẫu Row Gateway từ PoEAA.  Các đối tượng Row Gateway có mẫu là một hàng trong CSDL và có các phương thức như lưu() và xóa() giúp duy trì dòng này như một đối tượng trong CSDL.  Tương tự, sau khi một dòng CSDL từ được lấy ra, thao tác và lưu () trở lại đúng vị trí cũ, hoặc nó cũng có thể bị xóa khỏi bảng. 50 Bài 4. Cơ sở dữ liệu và Mô hình 6. ZendDb RowGateway  Giao diện cho một đối tượng Row Gateway đơn giản chỉ cần thêm vào phương thức lưu () và xóa và đây là một giao diện cần được giả định khi một thành phần có dự án phụ thuộc sẽ là một thể hiện của đối tượng RowGateway. 51 giao diện RowGatewayInterface { public function save(); . Cơ sở dữ liệu và Mô hình 6. ZendDb RowGateway  Sử dụng. – Hầu hết thời gian, RowGateway được sử dụng kết hợp với các đối tượng Zend\Db\ResultSet khác, cũng có thể sử dụng độc lập của chúng. – Và để sử dụng chúng theo một cách độc lập đơn giản ta chỉ cần một Bộ điều hợp và một bộ dữ liệu đi cùng. 52 Bài 4. Cơ sở dữ liệu và Mô hình 6. ZendDb RowGateway  Sử dụng. – Zend\Db\RowGateway\RowGateway trình bày ở dạng đơn giản của nó. 53 sử dụng Zend\Db\RowGateway\RowGateway; . $rowGateway->delete(); . Cơ sở dữ liệu và Mô hình 6. Zend Db Row Gateway – Luồng công việc được mô tả phía trên rất đơn giản khi RowGateway được sử dụng kết hợp với tính năng TableGateway. Kết quả đạt được là một Cổng bảng đối tượng khi sử dụng select() từ một bảng, nó sẽ tạo ra một Bộ kết quả mà sau đó có khả năng tạo ra một Cổng hàng đối tượng hợp lệ. 54 sử dụng Zend\Db\TableGateway\Feature\RowGatewayFeature; . Cơ sở dữ liệu và Model 7. Cơ sở dữ liệu  Sau khi đã thiết lập các phương thức cần thiết cho bộ điều khiển của mô-đun Sản phẩm và tạo các tập lệnh xem chưa có nội dung, chúng ta cần phải xây dựng mô hình cho ứng dụng.  Mô hình là thành phần quan trọng của ứng dụng, nó liên quan đến cơ sở dữ liệu. Trong ZF2, chúng ta sử dụng lớp Zend\Db\TableGateway\TableGateway để tìm kiếm, bổ sung, cập nhật và xóa các dòng ra khỏi cơ sở dữ liệu.  Sử dụng MySQL, thông qua trình điều khiển PDO của PHP, để tạo cơ sở dữ liệu cho ứng dụng. 55 Bài 4. Cơ sở dữ liệu và Model 7. Cơ sở dữ liệu  Thực hiện – Ví dụ. tạo cơ sở dữ liệu có tên là “zend_app” có cấu trúc như sau. – Sau đó thêm vào một số dòng dữ liệu cần thiết. 56 Bài 4. Cơ sở dữ liệu và Model 8. Mô hình  Zend Framework không cung cấp sẵn thành phần Zend\Model như mô hình trong logic nghiệp vụ, nó phụ thuộc vào quyết định của chúng ta muốn nó thực hiện công việc gì. Có nhiều thành phần khá chúng ta có thể sử dụng khi cần thiết.  Một cách tiếp cận là chúng ta có các mô hình lớp tương ứng với các khả năng thực thi của ứng dụng, sau đó sử dụng các đối tượng ánh xạ để tải và lưu các cơ sở dữ liệu thực tế.  Một cách tiếp cận khác là sử dụng ORM như Doctrine hay Propel. 57 Bài 4. Cơ sở dữ liệu và Model 8. Các mô hình  Trong bài này chúng ta tạo ra một mô hình đơn giản bằng cách tạo ra lớp ProductTable sử dụng lớp Zend\Db\TableGateway\TableGateway, trong đó một đối tượng Sản phẩm là một đối tượng Sản phẩm (được hiểu như là một thực thể - entity) .  Model này là một hiện thực của mẫu thiết kế Table Data Gateway, nó cho phép tương tác với dữ liệu trong bảng 58 Bài 4. Cơ sở dữ liệu và Model 8. Models  Thực hiện – Bước 1. Xây dựng lớp thực hiện Sản phẩm trong thư mục Mô hình. 59 // mô-đun/Sản phẩm/src/Sản phẩm/Mẫu/Sản phẩm. php. không gian tên Sản phẩm\Mô hình; . vô giá trị; . vô giá trị; . vô giá trị; . vô giá trị; . Cơ sở dữ liệu và Model 8. Mô hình  Thực hiện – Đối tượng thực thể Sản phẩm là một lớp PHP đơn giản. Để có thể làm việc với lớp TableGateway của Zend\Db, chúng ta cần phải triển khai phương thức exchangeArray(). – Phương thức này sẽ sao chép dữ liệu từ mảng tới các thuộc tính có thể thực hiện được. 60 Bài 4. Cơ sở dữ liệu và Model 8. Models  Thực hiện – Bước 2. Tiếp theo, cần phải tạo Table Class trong thư mục Model of module – ProductTable. ProductTable sẽ có các phương thức cần thiết để thực hiện các hành động khai báo trong bộ điều khiển phía trên. • Đặt tên biến được bảo vệ là $tableGateway được gán giá trị truyền vào từ bộ điều khiển trong phương thức khởi tạo cùng với hàm tạo. Chúng ta sẽ sử dụng nó để thực hiện các chức năng trong bảng dữ liệu tới Sản phẩm • Chúng ta sẽ tạo ra các phương thức mà ứng dụng sẽ sử dụng để giao diện với cổng bảng. 61 Bài 4. Cơ sở dữ liệu và Model 8. Models – Phương thức fetchAll() nhận tất cả các dòng của bảng Products từ CSDL và xem như là một ResultSet – Phương thức getProduct() nhận một dòng, là một đối tượng Product – Phương thức saveProduct() vừa tạo một dòng mới vào . 62 Bài 4. Cơ sở dữ liệu và Model 8. Models  Thực hiện 63 namespace Product\Model; . Database và Model 64 // continue public function getProduct($id) { $id = (int) $id; . $row) { throw new \Exception("Không tìm thấy hàng $id"); . Database và Model 65 // continue public function saveProduct(Product $product) { $data = array( 'name' => $product->name, 'price' => $product->price, 'image' => $product . Cơ sở dữ liệu và Model 8. Models  Thực hiện – Bước 3. Sử dụng ServiceManager để cấu hình cổng bảng được đưa vào ProductTable • Để thường xuyên sử dụng cùng một phiên bản của ProductTable, chúng ta sẽ sử dụng ServiceManager để định nghĩa cách tạo ra nó. • Công việc này được thực hiện trong Mô-đun lớp, nơi chúng ta tạo ra phương thức ServiceConfig(), nó được gọi tự động bằng ModuleManager và áp dụng cho ServiceManager. • Chúng ta có thể nhận nó trong bộ điều khiển khi chúng ta cần đến. 66 Bài 4. Cơ sở dữ liệu và Model 8. Models  Thực hiện – Bước 3. Sử dụng ServiceManager để cấu hình cổng bảng được đưa vào ProductTable • Để cấu hình ServiceManager, chúng ta cung cấp tên của lớp (để được khởi tạo hoặc một nhà máy (đóng hoặc gọi lại) để khởi tạo đối tượng) khi ServiceManager. • Chúng ta thực hiện phương thức getServiceConfig() để cung cấp cho một nhà máy tạo ra ProductTable. Add this method to end Module class. 67 Bài 4. Database và Model 68 // module/Product/Module. php. không gian tên Sản phẩm; . chức năng công khai getServiceConfig() { trả về mảng('factories' => mảng( 'Product\Model\ProductTable' => function($sm) { $tableGateway = $sm->get('ProductTableGateway'); $table = new ProductTable . Cơ sở dữ liệu và Model 8. Models  Thực hiện – Bước 3. • Phương thức này trả về một mảng các nhà máy được kết hợp với nhau bởi ModuleManager trước khi chuyển đến ServiceManager. • Factory dành cho Product\Model\ProductTable sử dụng ServiceManager để tạo ProductTableGateway nhằm chuyển tới ProductTable. • Chúng ta cũng cho ServiceManager biết rằng ProductTableGateway được tạo ra bằng cách lấy một Zend\Db\Adapter\Adapter (cũng từ ServiceManager) và sử dụng nó để tạo ra một đối tượng TableGateway. • TableGateway sử dụng đối tượng Sản phẩm khi nó tạo ra một dòng kết quả mới. Các lớp TableGateway sử dụng mẫu nguyên mẫu để tạo ra kết quả và thực thi. 69 Bài 4. Cơ sở dữ liệu và Model 8. Models  Thực hiện – Bước 4. Cuối cùng, cần phải cấu hình ServiceManager • Để ServiceManager biết cách lấy Zend\Db\Adapter\Adapter bằng cách sử dụng một tên là Zend\Db\Adapter\AdapterServiceFactory mà chúng ta có thể cấu hình trong cấu hình hệ thống kết hợp. • Trình quản lý mô-đun của ZF2 tổng hợp các cấu hình từ mỗi mô-đun tệp. cấu hình. php của mô-đun sau đó được đưa vào các tệp trong thư mục config/autoload (*. toàn cầu. php and *. địa phương. php). • Chúng ta sẽ bổ sung thông tin cấu hình CSDL vào file global. php. Ta also can used local. php (bên ngoài VCS) để lưu trữ thông tin cho cơ sở dữ liệu nếu chúng ta muốn. 70 Bài 4. Cơ sở dữ liệu  Mô hình  toàn cục. php 71 trả về mảng ('db' => mảng ('driver' => 'Pdo', 'dsn' => 'mysql. dbname=zend_app;host=localhost', 'driver_options' => mảng (PDO. MYSQL_ATTR_INIT_COMMAND => 'ĐẶT TÊN \'UTF8\'' ), ), 'service_manager' => mảng( 'factories' => mảng( 'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory' . Cơ sở dữ liệu  Mô hình  cục bộ. php 72 // cấu hình/tự động tải/cục bộ. php. trả về mảng( 'db' => mảng( 'tên người dùng' => 'TÊN NGƯỜI DÙNG CỦA BẠN TẠI ĐÂY', 'mật khẩu' => 'MẬT KHẨU CỦA BẠN TẠI ĐÂY', ), ); . Cơ sở dữ liệu và Model 9. Xây dựng phương thức trong Controller  Sau khi xây dựng các phương thức cần thiết trong Model cho Product, ta quay lại Controller để xây dựng hành động cho Product 73 Bài 4. Cơ sở dữ liệu và Model 9. Xây dựng phương thức trong Bộ điều khiển  Thực hiện  Ta thêm vào biến được bảo vệ sau đây ở dòng đầu của lớp. 74 // mô-đun/Sản phẩm/src/Sản phẩm/Bộ điều khiển/Bộ điều khiển Sản phẩm. php. hàm công khai getProductTable() { if (. $this->productTable) { $sm = $this->getServiceLocator(); . Cơ sở dữ liệu và Model 9. Xây dựng phương thức trong Controller  Thực hiện – Bây giờ chúng ta có thể gọi phương thức getProductTable() trong Controller ở nơi mà chúng ta muốn tương tác với model. – kiểm tra chúng ta có thể thêm một bài kiểm tra vào lớp ProductControllerTest. – Nếu vị trí của dịch vụ được cấu hình chính xác trong mô-đun tệp. php thí nghiệm chúng ta sẽ có một thể hiện của Product\Model\ProductTable khi gọi phương thức getProductTable() 75 public function testGetProductTableReturnsAnInstanceOfProductTable() { $this->assertInstanceOf('Product\Model\ProductTable', $this->controller->getProductTable . Cơ sở dữ liệu và Model 9. Build method in Controller  Thực hiện. – Ví dụ. Lấy danh mục sản phẩm tranh • Để hiển thị, chúng ta cần phải lấy danh mục sản phẩm tranh từ mô hình sau đó chuyển nó sang chế độ xem bằng cách hoàn thành phương thức indexAction() đã được tạo ra trên lớp ProductController bằng cách loại bỏ . 76 // mô-đun/Sản phẩm/src/Sản phẩm/Bộ điều khiển/Bộ điều khiển Sản phẩm. php. chức năng công khai indexAction() { return new ViewModel(array( 'products' => $this->getProductTable()->fetchAll(), )); . Cơ sở dữ liệu và Model 10. Create View  Sau khi đã có model và controller, công việc cuối cùng là tạo view để hiển thị. – Thực hiện. show list product product • Trong ZF2, to may set cac biến in view, ta must return a ViewModel instance with the first number display of constructor is a array chứa dữ liệu cần hiển thị. • This data array will be auto convert to view. • Đối tượng ViewModel cũng cho phép chúng tôi thay đổi chế độ xem Tập lệnh cần sử dụng, nhưng mặc định chúng tôi sử dụng {tên bộ điều khiển}/{tên hành động}. 77 Bài 4. Cơ sở dữ liệu và Model 10. Create View  Sau khi đã có model và controller, công việc cuối cùng là tạo view để hiển thị. – Thực hiện. show list product product • Trong ZF2, to may set cac biến in view, ta must return a ViewModel instance with the first number display of constructor is a array chứa dữ liệu cần hiển thị. • This data array will be auto convert to view. • Đối tượng ViewModel cũng cho phép chúng tôi thay đổi chế độ xem Tập lệnh cần sử dụng, nhưng mặc định chúng tôi sử dụng {tên bộ điều khiển}/{tên hành động}. 78 Bài 4. Database and Model 79 TRUNG TÂM TÍN HỌC ĐẠI HỌC KHOA HỌC TỰ NHIÊN-TP. HCM 1 LẬP TRÌNH PHP NÂNG CAO ZEND FRAMEWORK 2 TRUNG TÂM TÍN HỌC ĐẠI HỌC KHOA HỌC TỰ NHIÊN-TP. HCM 2 Bài 4. Database and Model Phần SQL Bài 4. Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql là một biểu tượng SQL lớp được sử dụng để xây dựng nền tảng truy vấn SQL trên nền tảng, công cụ có thể thông qua API hướng đối tượng.  Kết quả cuối cùng của đối tượng Zend\Db\Sql sẽ vừa tạo ra một Tuyên bố và vùng chứa tham số đại diện cho truy vấn đích hoặc là một chuỗi đầy đủ có thể thực thi trực tiếp trên nền của cơ sở dữ liệu.  Thực hiện công việc này, Để Zend\Db\Sql các đối tượng cung cấp cho một đối tượng Zend\Db\Adapter\Adapter (đã giới thiệu ở phần trên) để tạo ra những kết quả mong muốn. 3 bài 4. Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Sql – Có một số công việc chính cần phải tương tác với cơ sở dữ liệu (từ DML - Ngôn ngữ thao tác dữ liệu). truy vấn lọc dữ liệu, thêm dữ liệu, cập nhật và xóa dữ liệu. – Như vậy có bốn đối tượng chính mà nhà phát triển cần tương tác hoặc xây dựng các câu lệnh truy vấn. Zend\Db\Sql\Select, Insert, Update và Delete. – Tuy nhiên, bốn công việc này có liên quan khá mật thiết với nhau và thường kết hợp giống nhau trong cùng một ứng dụng, các đối tượng Zend\Db\Sql\Sql giúp chúng tôi tạo ra chúng và tạo ra kết quả mà chúng tôi . 4 bài 4. Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Sql  Bây giờ nhà phát triển có thể tương tác với những đối tượng này. 5 sử dụng Zend\Db\Sql\Sql; . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Sql – Sử dụng đối tượng Select – Chuẩn bị câu lệnh truy vấn Ví dụ. 6 sử dụng Zend\Db\Sql\Sql; . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Sql – Sử dụng đối tượng Select – Thực thi câu lệnh truy vấn Ví dụ. 7 sử dụng Zend\Db\Sql\Sql; . QUERY_MODE_EXECUTE); . Cơ sở dữ liệu và Mô hình 4. ZendDbSql Ví dụ. Liệt kê danh sách bài viết File controller BaivietController public function indexAction() { $this->layout()->setTemplate('layout/layout_admin'); . Cơ sở dữ liệu và Mô hình 4. ZendDbSql File model BaivietTable public function fetchAll($dbadapter) { $sql = new Sql($dbadapter); . Cơ sở dữ liệu và Mô hình 4. ZendDbSql File view Mã bài viếtTiêu đềNội dung tóm tắt  'edit','id'=>$row['ma_bai_viet'])). '">'. $row['tieu_de']. ''; . $row['noi_dung_tom_tat']. 'Xóa'; . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Kết quả 11 Bài 4. Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Sql – Các đối tượng Zend\Db\Sql\Sql cũng có thể bị ràng buộc đối với một bảng cụ thể, do đó việc thực hiện các đối tượng chọn, chèn, cập nhật, hoặc xóa, tất cả . – Ví dụ 12 sử dụng Zend\Db\Sql\Sql; . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Sql. Chọn, Chèn, Cập nhật và Xóa – Mỗi đối tượng đều được khai thác từ giao diện (2) dưới đây. – Có nhiều phương thức ta có thể gọi để tạo ra (a) một tuyên bố đã được chuẩn bị sẵn, hoặc (b) một chuỗi để thực thi. 13 giao diện PreparableSqlInterface { chức năng công cộng chuẩn bịStatement(Adapter $adapter, StatementInterface $statement); . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Sql. Select – Zend\Db\Sql\Select là một đối tượng có chức năng chính là để giới thiệu một hệ thống API tốt nhất cho việc xây dựng nền tảng cho các truy vấn SQL SELECT cụ thể. This class may be quick done that don't need Zend\Db\Sql\Sql. – Nếu một bảng được cấp cho một đối tượng Chọn, thì phương thức from() không thể được gọi sau này để thay đổi tên của bảng. 14 sử dụng Zend\Db\Sql\Select; . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Khi ta có một đối tượng Chọn hợp lệ, API có thể được sử dụng để tiếp tục xác định các phần khác nhau của câu lệnh chọn. - Từ. $select->from(‘$table'); . $select->columns(mảng $columns, $prefixColumnsWithTable = true); . $select->tham gia($name, $on, $columns = self. SQL_STAR, $type = tự. THAM GIA_INNER); . ma_nguoi_dung ‘, array('fullname'), $select. THAM GIA_INNER); . Cơ sở dữ liệu và Mô hình 4. ZendDbSql – Ở đâu/có. $select->where($predicate, $combination = Predicate\PredicateSet. OP_AND); . $select->group($group); . $select->having($predicate, $combination = Predicate\PredicateSet. OP_AND); . $select->order($order); . $select->limit($limit); . $select->offset($offset); . Cơ sở dữ liệu và Mô hình 4. Không gian tên ZendDbSql 17 Sản phẩm\Mẫu; . QUERY_MODE_EXECUTE); . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Sql. Select - from 18 // as a string. $select->from('foo'); . // tạo ra SELECT "t". * TỪ "bảng" NHƯ "t" $select->from(mảng('t' => 'bảng')); . // giống như đầu ra ở trên như trên $select->from(new TableIdentifier(array('t' => 'table'))); . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Sql. Select - column() 19 // as an array cột $select->columns(array('foo', 'bar')); . // tạo ra ‘bar' AS 'foo', 'bax' AS 'baz' $select->columns(array('foo' => 'bar', 'baz' => 'bax')); . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Sql. Select - join() 20 $select->join( 'foo' // tên bảng, 'id = bar. id', // điều kiện kết nối, mảng('bar', 'baz'), // (tùy chọn) liệt kê các cột tương ứng với các cột biểu thức() phía trước $select. JOIN_OUTER // (option), kết nối bên trong, bên ngoài, bên trái, bên phải ); . foo_id = b. foo_id'); . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Sql. Chọn - where() 21 // CHỌN "foo". * TỪ "foo" WHERE x = 5 $select->from('foo')->where('x = 5'); . * TỪ "foo" WHERE x = 5 AND y = z $select->from('foo')->where(array('x = 5', 'y = z')); . * TỪ "foo" Ở ĐÂU "c1" LÀ NULL VÀ "c2" TRONG (?, ?, ?) VÀ "c3" KHÔNG PHẢI LÀ NULL $select->from('foo')->where(array( 'c1' = . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Sql. Chọn - đặt hàng() 22 $select = new Select; . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Sql. Select - limit() and offset() 23 $select = new Select; . Cơ sở dữ liệu và Mô hình 4. ZendDbSql Ví dụ. Lấy thông tin một bài viết File controller  public function editAction()  {  $this->layout()->setTemplate('layout/layout_admin'); . Cơ sở dữ liệu và Mô hình 4. Tệp ZendDbSql BaivietModel  public function getBaiviet($dbadapter,$id)  {  $sql = new Sql($dbadapter); . ma_nguoi_dung',  array('fullname'),$select. THAM GIA_INNER); . ma_bai_viet'=>$id)); . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Insert. Lớp API 26 Chèn triển khai SqlInterface, PreparableSqlInterface { const VALUES_MERGE = 'merge'; . VALUES_SET); . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Insert. cột() 27 $insert->columns(array('foo', 'bar')); . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Insert. values() 28 // hành vi mặc định của các giá trị là thiết lập các giá trị // các lần gọi kế tiếp sẽ không giữ lại các giá trị từ các lần gọi trước $insert->values(array( 'col_1' => 'value1', 'col_2' => 'value2 . GIÁ TRỊ); . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Update. Cập nhật lớp 29 { const VALUES_MERGE = 'merge'; . VALUES_SET); . OP_AND); . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Update – set() 30 $update->set(array('foo' => 'bar', 'baz' => 'bax')); . Cơ sở dữ liệu và Mô hình 4. ZendDbSql  Zend\Db\Sql\Delete 31 lớp Xóa { public $where; . OP_AND); . Database and Model 32 TRUNG TÂM TÍN HỌC ĐẠI HỌC KHOA HỌC TỰ NHIÊN-TP. HCM LẬP TRÌNH PHP NÂNG CAO ZEND FRAMEWORK 2 1 TRUNG TÂM TÍN HỌC ĐẠI HỌC KHOA HỌC TỰ NHIÊN-TP. HCM Bài 4. Cơ sở dữ liệu và Mô hình 1. ZendDbAdapter 2. Chuẩn bị/thực thi câu lệnh truy vấn 3. Tạo câu lệnh 4. ZendDbSql 5. Cổng ZendDbTable 6. ZendDb RowGateway 7 D t b. một a ase 8. Model 9 Xây dựng phương thức trong Controller 2. 10. Tạo view Bài 4. Cơ sở dữ liệu và Cổng ZendDbTable Model 5.  Cổng đối tượng Table được sử dụng để cung cấp một đối tượng đ i diệ h ột dữ liệu c ơ sở dữ liệu à á ượng ạ n c o m ng rong , v c c phương thức của đối tượng này ánh xạ tới các thao tác tương tự như trong bảng của CSDL. Giao diện của đối tượng này có nội dung như sau. giao diện Zend\Db\TableGateway\TableGatewayInterface { public function getTable(); . Cơ sở dữ liệu và Cổng ZendDbTable Model 5.  Có hai triển khai chính của TableGateway Interface hiệu suất cao nhất là Ab t tT bl G t àu qu n. s rac a e a eway v TableGateway.  AbstractTableGateway là một triển khai cơ sở hiển thị cung cấp các chức năng như select(), insert(), update(), delete() thư hiện các công việc tương tự như các đối tượng SQL object và các phương thức , selectWith( . Cơ sở dữ liệu và Cổng ZendDbTable Model 5.  Hơn nữa, AbstractTableGateway cũng thực hiện như một API “F t ” h hé lộ ở mức á h i b h i ure , c ủ a p m r ng c c n v – e av hoặc của cơ sở triển khai TableGateway mà không cần phải mở rộng Lớp với các tính năng mới.  TableGateway cụ thể đơn giản chỉ cần thêm một hàm tạo hợp lý cho lớp AbstractTableGateway, TableGateway không cần mở rộng để thu nhận và sử dụng để phát huy tối đa. 5 bài 4. Cơ sở dữ liệu và Cổng ZendDbTable Model 5.  Use. Cách nhanh chóng để có thể sử dụng Z d\Db\T bl G t là hi hi à sử dụng den a e a eway c u n v s dụng cụ impelemtation của TableGateway. API của một TableGateway cụ thể là. 6 bài 4. Cơ sở dữ liệu và Model class TableGateway extends AbstractTableGateway { public $lastInsertValue; . Cơ sở dữ liệu và Cổng ZendDbTable Model 5.  Use. – Đối tượng TableGateway cụ có thể được khởi động trong quá trình tạo hàm. Tên bảng và thể hiện của một Bộ điều hợp cần thiết để thiết lập một đối tượng làm việc TableGateway. – Khi phương thức select() được thực thi, một đối tượng ResultSet đơn giản với Kết quả của bộ điều hợp sẽ được trả về và sẵn sàng cho việc sử dụng. 8 bài 4. Cơ sở dữ liệu và Cổng ZendDbTable Model 5.  Use. – Ví dụ. sử dụng Zend\Db\TableGateway\TableGateway; . '; . PHP_EOL; . , $artistTable = new TableGateway('artist', $adapter); . Cơ sở dữ liệu và Cổng ZendDbTable Model 5.  Use. – Phương thức select() có các lập luận tương tự như Zend\Db\Sql\Select. where() với việc bổ sung cũng được chấp nhận sẽ thông qua đối tượng Select , được sử dụng để xây dựng truy vấn CHỌN. sử dụng Zend\Db\TableGateway\TableGateway; . Cơ sở dữ liệu và Cổng ZendDbTable Model 5.  Đặc điểm của Table Gateway – API tính năng cho phép mở rộng chức năng của đối tượng TableGateway cơ sở mà không cần phải mở rộng lớp cơ sở. – Với đối tượng TableGateway, các đặc tính cần phải được đưa vào thông qua constructor. – Constructor can get features in ba format other nhau. đối tượng tính năng đơn, đối tượng Bộ tính năng hoặc mảng đối tượng Tính năng. 11 Bài 4. Cơ sở dữ liệu và Cổng ZendDbTable Model 5. – Dưới đây là một số tính năng được tích hợp sẵn và vận chuyển với Zend\Db. • Tính năng GlobalAdapter. khả năng sử dụng bộ điều hợp toàn cầu/tĩnh mà không cần thiết phải đưa nó vào ví dụ TableGateway ấm áp. Nó không hữu ích khi ta mở rộng việc sử dụng AbstractTableGateway. lớp MyTableGateway mở rộng AbstractTableGateway { public function __construct() { $this->table = 'my_table'; . setStaticAdapter($adapter); . Cơ sở dữ liệu và Cổng ZendDbTable Model 5. – Dưới đây là một số tính năng được tích hợp sẵn và vận chuyển với Z d\Dben. • Tính năng MasterSlave. khả năng sử dụng bộ điều hợp chính để chèn(), cập nhật() và xóa() khi sử dụng bộ điều hợp phụ cho tất cả thao tác chọn() (toán tử/hoạt động). $table = new TableGateway('artist', $adapter, new Feature\MasterSlaveFeature($slaveAdapter)); . Cơ sở dữ liệu và Cổng ZendDbTable Model 5. – Dưới đây là một số tính năng được tích hợp sẵn và vận chuyển với Z d\Dben. • Tính năng siêu dữ liệu. khả năng điền vào TableGateway với thông tin của cột lấy từ siêu dữ liệu đối tượng. Nó cũng sẽ lưu trữ thông tin khóa chính trong trường hợp RowGatewayFeature cần sử dụng thông tin này. $table = new TableGateway('artist', $adapter, new Feature\MatadataFeature()); . Cơ sở dữ liệu và Cổng ZendDbTable Model 5. – Dưới đây là một số tính năng được tích hợp sẵn và vận chuyển với Z d\Dben. • Tính năng sự kiện. khả năng sử dụng các đối tượng TableGateway với Zend\EventManager và để có thể đăng ký vào các sự kiện khác nhau trong một vòng đời của TableGateway. $table = new TableGateway('artist', $adapter, new Feature\EventFeature($eventManagerInstance)); . Cơ sở dữ liệu và Cổng ZendDbTable Model 5. – Dưới đây là một số tính năng được tích hợp sẵn và vận chuyển với Z d\Dben. • Tính năng RowGateway. khả năng select() return đối tượng ResultSet object lặp lại khi cần. $table = new TableGateway('artist', $adapter, new Feature\RowGatewayFeature('id')); . Cơ sở dữ liệu và Mô hình 6 ZendDb RowGateway.  Zend\Db\RowGateway là một thành phần con ẫ của Zend\Db thực hiện m u Row Gateway từ PoEAA. number ẫ Các đ i thượng Row Gateway có m u là một hàng trong CSDL và có các phương thức như save() và delete() giúp duy trì dòng này như một đối tượng trong CSDL.  Tương tự như vậy khi một dòng từ CSDL được lấy , ra, thao tác và lưu() trở lại CSDL ở đúng vị trí cũ, hoặc nó cũng có thể bị xóa khỏi bảng. 17 Bài 4. Cơ sở dữ liệu và Mô hình 6 ZendDb RowGateway.  Giao diện cho một đối tượng Row Gateway đơn giản chỉ cần thêm vào phương thức lưu () và xóa và đây là giao diện cần được giả định khi một thành phần có dự kiến ​​phụ thuộc sẽ là khả năng hiển thị của đối tượng RowGateway. giao diện RowGatewayInterface { public function save(); . Cơ sở dữ liệu và Mô hình 6 ZendDb RowGateway.  Use. – Hầu hết thời gian, RowGateway được sử dụng kết hợp với các đối tượng Zend\Db\ResultSet khác, cũng có thể sử dụng độc lập của chúng. – Và để sử dụng chúng theo một cách độc lập đơn giản ta chỉ cần một Bộ điều hợp và một bộ dữ liệu đi cùng. 19 Bài 4. Cơ sở dữ liệu và Mô hình 6 ZendDb RowGateway.  Use. – Zend\Db\RowGateway\RowGateway trình bày ở dạng đơn giản của nó. Z d\Db\R G t \R G tuuse en ow a eway ow a eway; . $rowGateway->delete(); . Cơ sở dữ liệu và Mô hình 6 ZendDb RowGateway. – Luồng công việc được mô tả phía trên rất đơn giản khi RowGateway được sử dụng kết hợp với tính năng TableGateway. Kết quả đạt được là một Table Gateway đối tượng khi sử dụng select() từ một bảng, nó sẽ t ột R ltS t à đó khả năng ăn s ạo ra m esu e sau c n ng tạo ra một Row Gateway hợp lệ đối tượng. sử dụng Zend\Db\TableGateway\Feature\RowGatewayFeature; . Cơ sở dữ liệu và Cơ sở dữ liệu Model 7.  Sau khi đã thiết lập các phương thức cần thiết cho bộ điều khiển của mô-đun Sản phẩm và tạo các tập lệnh xem chưa có nội dung, chúng ta cần phải xây dựng mô hình cho ứng dụng.  Model là thành phần quan trọng của ứng dụng, nó liên quan đến CSDL Trong ZF2 chúng ta sử dụng. , sử dụng lớp Zend\Db\TableGateway\TableGateway để tìm kiếm, bổ sung, cập nhật và xóa các dòng ra khỏi cơ sở dữ liệu.  Sử dụng MySQL, thông qua trình điều khiển PDO của PHP, để tạo cơ sở dữ liệu cho ứng dụng. 22 Bài 4. Cơ sở dữ liệu và Cơ sở dữ liệu Model 7.  Thực hiện – Ví dụ. tạo cơ sở dữ liệu có tên là “zend_app” có cấu trúc như sau. – Sau đó thêm vào một số dòng dữ liệu cần thiết. 23 Bài 4. Cơ sở dữ liệu và Mô hình 8 Mô hình.  Zend Framework không cung cấp sẵn thành phần Zend\Model như mô hình trong logic nghiệp vụ, nó phụ thuộc vào quyết định của chúng ta muốn nó thực hiện công việc gì Có khá nhiều thành phần. chúng ta có thể sử dụng khi cần thiết.  Một cách tiếp cận là chúng ta có các lớp mô hình tương ứng với các khả năng thực thi của ứng dụng, sau đó sử dụng các đối tượng ánh xạ để tải và lưu các ứng dụng thực tế vào cơ sở dữ liệu.  Một cách tiếp cận khác là sử dụng một ORM như D t i h P loc r ne ay rope. 24 Bài 4. Cơ sở dữ liệu và Mô hình 8 Mô hình.  Trong bài này chúng ta tạo ra một mô hình đơn giản bằng cách tạo ra lớp ProductTable sử dụng lớp Zend\Db\TableGateway\TableGateway trong đó môi đối tượng Sản phẩm là một, Đối tượng sản phẩm (được hiểu là một thực thể - entity) .  Model này là một hiện thực của mẫu thiết kế Table Data Gateway, nó cho phép tương tác với dữ liệu trong bảng 25 Bài 4. Cơ sở dữ liệu và Mô hình 8 Mô hình.  Thực hiện B ớ 1 Xâ d lớ th ể P d ự t th– ư c. y khoa p ực ro uc rong u muc Model. // mô-đun/Sản phẩm/src/Sản phẩm/Mô hình/Sản phẩm php. . không gian tên Sản phẩm\Mô hình; . vô giá trị; . vô giá trị; . vô giá trị; . không ; . Cơ sở dữ liệu và Mô hình 8 Mô hình.  Thực hiện Đối tượng có thể P d t là một ột l PHP đ– ực lượng ro uc m c ass đơn giản. Để có thể làm việc với lớp TableGateway của Zend\Db, chúng ta cần phải triển khai phương thức exchangeArray(). – Phương thức này sẽ sao chép dữ liệu từ mảng tới các thuộc tính của khả năng thực thi. 27 Bài 4. Cơ sở dữ liệu và Mô hình 8 Mô hình.  Thực hiện B ớ 2 Ti ế t hải t bl Cl t th– ư c. p eo, c n p ạo a e ass rong ư mục Model of module – ProductTable. ProductTable sẽ có các phương thức cần thiết để thực hiện các hành động khai báo trong bộ điều khiển phía trên. • Đặt tên biến được bảo vệ là $tableGateway được gán giá trị truyền vào từ bộ điều khiển trong phương thức khởi tạo của hàm tạo. Chúng ta sẽ sử dụng nó để thực hiện các chức năng trong bảng dữ liệu tới Sản phẩm • Chúng ta sẽ tạo ra các phương thức mà ứng dụng sẽ sử dụng để giao diện với cổng bảng. 28 Bài 4. Cơ sở dữ liệu và Mô hình 8 Mô hình. – Phương thức fetchAll() nhận tất cả các dòng của bảng Products từ CSDL và xem như là một ResultSet – Phương thức getProduct() nhận một dòng, là một đối tượng Product Ph thứ P d t() từ t ột– bù c save . 29 Bài 4. Cơ sở dữ liệu và Mô hình 8 Mô hình.  Thực hiện namespace Product\Model; . Database và Model // continue public function getProduct($id) { $id (i t) $id = n ; . $row) { throw new \Exception("Không tìm thấy hàng $id"); . Database and Model // continue public function saveProduct(Product $product) { $data = array( 'name' => $product->name, 'price' => $product->price, 'image' => $product- . Cơ sở dữ liệu và Mô hình 8 Mô hình.  Thực hiện B ớ 3 Sử d S i M để tạo hi h t bl– ư c. erv ce anager c u n a e gateway đưa vào ProductTable • Để thường xuyên sử dụng cùng một instance của ProductTable, chúng ta sẽ sử dụng ServiceManager để định nghĩa cách tạo ra nó. Việ à đ th hiệ t lớ M d l i • c n ược ực n rong p o u e, nơ chúng ta tạo ra phương thức ServiceConfig(), nó được gọi tự động bằng ModuleManager và áp dụng cho ServiceManager. • Chúng ta có thể nhận nó trong bộ điều khiển khi chúng ta cần đến. 33 Bài 4. Cơ sở dữ liệu và Mô hình 8 Mô hình.  Thực hiện B ớ 3 Sử d S i M để tạo hi h t bl– ư c. erv ce anager cu n a e gateway đưa vào ProductTable • Để cấu hình ServiceManager, chúng ta cung cấp tên của lớp (để được khởi tạo hoặc một nhà máy (đóng hoặc gọi lại) để khởi tạo đối tượng) khi ServiceManager. • Chúng ta thực hiện phương thức getServiceConfig() để cung cấp cho một nhà máy tạo ra ProductTable. Add this method to end Module class. 34 Bài 4. Database và Model // module/Product/Module. php. không gian tên Sản phẩm; . bli f ti tS i C fi ()pu c unc on ge erv ce on g { return array('factories' => array( 'Product\Model\ProductTable' => function($sm) { $tableGateway = $sm- . Cơ sở dữ liệu và Mô hình 8 Mô hình.  Thực hiện – Bước 3. • Phương thức này trả về một mảng các nhà máy được kết hợp với nhau bởi ModuleManager trước khi chuyển đến ServiceManager. • Factory dành cho Product\Model\ProductTable sử dụng ServiceManager để tạo ProductTableGateway nhằm chuyển tới ProductTable. • Chúng ta cũng cho ServiceManager biết rằng ProductTableGateway được tạo ra bằng cách lấy một Zend\Db\Adapter\Adapter (cũng từ ServiceManager) và sử dụng nó để tạo ra một đối tượng TableGateway. • TableGateway sử dụng đối tượng Sản phẩm khi nó tạo ra một dòng kết quả mới. Các lớp TableGateway sử dụng mẫu nguyên mẫu để tạo ra kết quả và thực thi. 36 Bài 4. Cơ sở dữ liệu và Mô hình 8 Mô hình.  Thực hiện ô đầu– Bước 4. Cuối cùng, c n phải c u hình ServiceManager • Để ServiceManager biết cách truy xuất Zend\Db\Adapter\Adapter bằng cách sử dụng một tên là Zend\Db\Adapter\AdapterServiceFactory mà chúng ta có thể cấu hình trong cấu hình hệ thống kết hợp. • Trình quản lý mô-đun của ZF2 tổng hợp các cấu hình từ mỗi mô-đun tệp. cấu hình. php của mô-đun sau đó được đưa vào các tệp trong thư mục config/autoload (*. toàn cầu. php and *. địa phương. php). • Chúng ta sẽ bổ sung thông tin cấu hình CSDL vào file global. php. Ta also can used local. php (bên ngoài VCS