Zend Framework 簡介

Report
1101345105 吳順發
1101345107 施凱中
1101345113 馮侃郁
1101345128 黃子瑋
簡介與架構
 ACL


Template

DB
EventManager
 ServiceManager

MVC
 DEMO

2
Zend Framework (ZF) 是開放原始碼, 物件導
向的Web應用程式開發框架,在PHP5下運行並使用
MVC軟體架構。
4


Zend Framework是由開發PHP4、5的解析引擎
Zend Engine的Zend公司所開發。
Zend Framework技術合作夥伴則包括IBM,
Google, Microsoft, Adobe Systems等。
5



Zend Framework 1.0由2007年7月1日發布
Zend Framework 2.0由2012年9月5日發布
Zend Framework 2.1.5目前最新版本為由2013年
4月17日推出
6



所有物件均物件導向
物件幾乎不依賴其他元件
模組化能簡單使用其他應用
◦ Ex:Zend提供連結Google,Yahoo,Amazon Services的模組
7
全域設定
模組設定
模組
模組設置
mvc
模組進入點
程式進入點
8

Index.php
9

application.config.php
10

Module.php
11

module.config.php
12
13

module.config.php
14


Role
Resource
16


可以繼承或多重繼承
當多重繼承時依照繼承順序來分權限
17
18


是樹狀結構
不能多重繼承
19
20
22
23
25

PHP連接各種資料庫後,由於sql語法的差異,不同資料
庫各有相異的一些用法,如果轉換資料庫,就必須修改
所有相異的所在,且不同資料庫的不同寫法也造成學習
的負擔,而PDO可以解決這些問題。

PDO是PHP Data Object的首字母縮寫,是在PHP原有
的各種資料庫API上再建構一層輕量級的資料庫存取
介面,只要使用PDO就可以使用相同的方法存取支援
PDO的各種資料庫。
26
27

TableGateway提供使用者透過新增、修改、刪除、
查詢表格內容,更改資料庫之資料。
28
29
30


傳統的程式設計中,程式碼都是順序執行
的,所以很難將一些功能獨立為一個元件
或模組。
事件驅動的設計可以達到這個效果,應用
了事件驅動之後,程式經由“註冊事件”
=> “觸發事件”的運作過程,可以在不影
響原有程式碼前提下,在任意位置加入新
的業務邏輯,讓程式維護及新增的彈性增
強。



其原理使用了Observer pattern(觀察者模式)
一個被觀察者(FB粉絲團)擁有許多觀察者(粉絲) ,當
被觀察者改變時,就會去根據觀察者名單去通知觀察
者,去做更新。
這可以使程式功能間不會因為相依而導致簽一髮動全
身的狀況。



EventManager聚集了許多個觀察者,而這些觀察者是
用來觀察追蹤一個或多個目標物件(被觀察者)的;它
也可以觸發(trigger)事件。
Listener(觀察者)可以被添加(attach)到目標物件(被觀察
者)上,並且須說明若事件觸發需要做什麼事來反應
(可以是任何PHP函式)。
Event(一個事件)指的是可以被EventManager觸發的一
個動作。
初始化設定EventManager
設定每一個事件的識別符號
呼叫SetEventManager的
類別名稱,在這裡為Foo
若有另一類別繼承Foo(例如abc)
並呼叫SetEventManager,則為abc
,若無人繼承則為Foo
使用設定好的EventManager
事件名稱(什麼事情發生了);
物件對象(發生在誰身上);
觸發參數(為什麼會發生)
監聽foo物件是否執行bar動作,當事件觸發
時,就執行一匿名函數function($e)
foo物件執行bar動作了! 所以之
前添加上去的listener會被觸發
此為輸出結果

ServiceManager 的 概 念 來 自 於 “ 服 務 定 位 模 式
(Service locator pattern)”的設計模式。這種模
式是將程式中的每一個獨立功能提取出來作為一
個”服務”,每一個服務都是獨立可喚醒的,只有
服務被調用時,服務相關的程序才會啟動
38
39
40
41
42



Models
Views
Controllers
44




能夠使用不同的View來顯示一樣的資料。(如一
樣的資料可以提供HTML格式、XML格式、
JSON格式...等)
能輕易的改變邏輯控制
幫助程式設計師使用重複的程式碼
幫助不同類型的設計師一起工作(如美工與程式設
計師能針對各自專長的領域,針對同一專案分別
開發)
45



Module下的架構觀念中包含了
MVC。
在專案Album中,src與view下皆
有一個Album,目的在於大型專
案中,在同一個專案中可以分開
不同的Module,使其更為彈性。
由Module Manager管理,一般位
於Module(Album的上一層)根目錄
或Album中,名為Module.php。
46

啟動MVC
◦ Bootstrap引導階段(開啟ServiceManager、註冊所有MVC事件-ZF2、事件
傾聽列表)
◦ Route(路由)
◦ Dispatch(分發)
◦ Render(渲染) 與Finish(結束)
47

Zend\View的構成
◦ View\View(視圖) 主要接管MVC事件
◦ View\Strategy(策略器) 統籌安排視圖的主要容器Placeholders,同時
會將視圖的最終結果放入容器,拼合為最後呈現給用戶的內容
◦ View\Resolver(決策器) 定義模板命名與實際路徑的映射關係,同時
決定模板最終對應的實際文件
◦ View\Renderer(渲染器) 在決策器的輔助下,將ViewModel轉換為文
本輸出。一個渲染器必須對應一個決策器才能工作
◦ View\Model(視圖模型) 包括了視圖中可能用到的所有變量。自身為
樹形結構,一個視圖模型可以包含若干子模型
◦ View\Helper(視圖助手) 輔助生成HTML標籤
48


Zend\View 在Bootstrap的初始化階段
Bootstrap觸發後,視圖做了一些準備工作,包括:
◦ 指定策略器Zend\Mvc\View\DefaultRenderingStrategy定
義Layout,並MvcEvent::EVENT_RENDER事件
◦ Zend\Mvc\View\InjectTemplateListener最主要是透過
Controller和Action來生成默認視圖名
◦ Zend\Mvc\View\InjectViewModelListener(注入視圖模型
監聽)
49

MVC啟動階段
ZendSkeletonApplication/public/index.php中

對應的事件有
◦ Route(路由)
◦ Dispatch(分發)
50

Route(路由)啟動
◦ 以樹型結構排佈
◦ 可設置優先順序
◦ 適合大規模應用的佈署
51

Dispatch(分發)過程
◦ Zend\Mvc\Application中,匹配的RouteMatch透過參數定
位到特定的Controller
◦ Zend\Mvc\Controller將Request/Response注入,以運行對
應的Action
52

發送最終響應並結束MVC

分發結束後,如果正確則從controller獲得響應,
會繼續運行。
53

觸發最後的MVC事件
◦ Render(渲染)
◦ Finish(結束)

Render事件會將Zend\View的各部分整合,最終組
裝成一個Zend\Http\PhpEnvironment\Response,發
送給用戶。
54

Zend/View Helper
◦
◦
◦
◦
◦
Aciton Helper
Partial Helper
Placeholder Helper
Doctype Helper
自定義
55

Action Helper
◦ 產生可重用的內容(例如在頁面中產生一個特定功能的
小面板)
◦ 假設一個CommentController,要輸出
評論列表,帶一個可被調用的listAction()
方法:
56

Partial Helper
◦ Render(解析)可重複的template(面板)片段
◦ 不會有名稱的衝突
Partial.phtml
呈現結果
輸出檔
57

Placeholder Helper
◦ 解決版面上大量且重複的文字充斥於程式碼的困擾
58

Doctype Helper
◦ 指定文檔類型(Doctype 如右)
◦ 在bootstrap中指定(如下)
◦ 輸出
XHTML11
XHTML1_STRICT
XHTML1_TRANSITIONAL
XHTML1_FRAMESET
XHTML_BASIC1
HTML4_STRICT
HTML4_LOOSE
HTML4_FRAMESET
59
全域設定

自訂義
◦ 客製化
◦ 於module.config.php中進行
註冊(如下)
模組設定
模組
模組設置
mvc
模組進入點
在欲輸出的地方(如下)
程式進入點
60


建立名叫”Album”的模組
整個模組結構的目錄如圖:
68



使用MoudleManager
MoudleManager會尋module/Album的路徑找出檔
案Module.php,再從檔案中找出叫Album的
namespace中,名叫Module的class
在zf2-tutorial/module/Album中創建Module.php
69
這兩個方法是負責自動
讀取和設定
70

在zf2-tutorial/module/Album中建立檔案
autoload_classmap.php

autoloader會將從Album這個namespace中所找到的
class,傳回這個空陣列。
71


getConfig()方法會尋著路徑config/module.config.php
載入此檔
在zf2-tutorial/module/Album/config中建立檔案
module.config.php
72
將controller和view
初始化
73

要跟ModuleManager 告知有新模組的存在,必須尋
config/application.config.php路徑去更新此檔案
74


會列出所有收藏,可以新增、修改、刪除它們
每個動作視為一個action,四個動作整合為一個
controller(在這裡是AlbumController),隸屬於
module之下
75





Page
Home
Add new album
Edit album
Delete album
Controller
Action
AlbumController index
AlbumController add
AlbumController edit
AlbumController delete
76

尋zf2-tutorial\module\Album\config\
module.config.php修改此檔案
77


ZF2中controller是一個class,名稱通常叫做
{Controller name}Controller,Controller name 第一
個字母大寫,在這裡就是AlbumController
在zf2-tutorials/module/Album/src/Album/
Controller中建立檔案AlbumController.php
78
把列出、新增、修改、
刪除四個動作加進來
79

在view目錄中建立輸出檔案

module/Album/view/album/album/index.phtml
module/Album/view/album/album/add.phtml
module/Album/view/album/album/edit.phtml
module/Album/view/album/album/delete.phtml



80


建一個叫zf2tutorial的資料庫
以SQL指令建立album資料表並產生資料
81

在zf2-tutorial\module\Album\src\Album\
Model中建立檔案Album.php
82

在module/Album/src/Album/Model中建立檔案
AlbumTable.php
83
抓出所有資料
抓出單筆資料
在資料庫中建立新一列
資料,或直接更新原本
已存在的一列資料
刪除單筆資料
84


先設定ModuleManager
尋zf2-tutorial\module\Album\Moudle.php路徑修改
此檔案
85
getServiceConfig()方法使用一個
factory建立AlbumTable物件
在這裡才產生資料表物件
服務名稱1
服務名稱2
用來存放資料操作後
所得到的資料集合
86


尋\zf2-tutorial\config\autoload\global.php路徑修改此
檔案
設定DB和ServiceManager
設定DB
設定ServiceManager
87

尋\zf2-tutorial\config\autoload\global.php路徑修改此
檔案
帳號
密碼
88


加入getAlbumTable() 方法,可以抓到從
ServiceManager 來的AlbumTable
在AlbumController類別中加入getAlbumTable()方
法(尋zf2-tutorial
/module/Album/src/Album/Controller/
AlbumController.php修改此檔案 )
89
加入這個方法
去ServiceLocator裡抓出名稱為
Album\Model\AlbumTable 的服務
在class最上方加上這個變數
90

尋zf2-tutorial
/module/Album/src/Album/Controller/
AlbumController.php修改此檔案
修改這個方法
91

尋zf2-tutorial/module/Album/view/album/
album/index.phtml路徑修改此檔案
92


讓使用者可以從表單中填入資訊
尋zf2-tutorial/module/Album/
src/Album/Form/路徑建立AlbumForm.php
93
94

尋zf2-tutorial/module/Album/
src/Album/Model/Album.php修改此檔案
95
96

尋zf2-tutorial/module/Album/src/Album/
Controller/AlbumController.php修改此檔案
修改這個方法
97

尋zf2-tutorial/module/Album/view/album/
album/add.phtml路徑修改此檔案
98

尋zf2-tutorial/module/Album/src/Album/
Controller/AlbumController.php修改此檔案
修改這個方法
99

尋zf2-tutorial/module/Album/view/album/
album/edit.phtml路徑修改此檔案
10
0

尋zf2-tutorial/module/Album/src/Album/
Controller/AlbumController.php修改此檔案
修改這個方法
10
1

尋zf2-tutorial/module/Album/view/album/
album/delete.phtml路徑修改此檔案
10
2

優點
◦ 文件架構遵守結構化的設計,適合大型專案分工
◦ 本身功能強大,且相當常更新,想的到的幾乎都有
◦ 有許多大公司的支援,能使用許多的公司提供的工具

缺點
◦ 文件架構複雜較不適合初學者,以及小型開發
◦ 太常更新,且版本大更動時,新舊會不相容
10
3
THE END

similar documents