Pages

  • Twitter
  • Facebook
  • Google+
  • RSS Feed

2013年2月18日 星期一

第一支MVC Web App

沒有留言:
 


初觸MVC架構:

什麼是MVC?
http://zh.wikipedia.org/wiki/MVC

資訊業 如果走網路這條路 走Web App
一定遲早會碰到的觀念
很多套件或是Framework會標榜這個名詞
但是他卻不是一個程式 而是一種design pattern
是一種的"架構"觀

Joomla也是採用這種設計模式

打得比方:
一般網頁PHP也好 JSP也罷
初學者都容易把html css js php都寫在一個
file.php頁面
裏頭還可能包含了
直接對MySQL等DB下SQL語法操作的動作
例如:

<?php
include("linkmysql.php");
$sql = "update member set passwordhash = '$hash' where account = '$account'";
$row = mysql_query($sql);
?>

<html>
<head>
....

等等
在MVC的架構裡面 這種寫法是最要不得的
1.程式耦合性高:
改一點地方 可能其他檔案都要改
專案一大起來 會搞砸的

2.程式重用性低:
可能1.php 2.php 3.php中全部都要跟MySQL溝通
就要寫三次建立連線的語法

3.基於以上兩點,不易維護


4.不夠安全
頁面直接與後端DB溝通,有被攻擊的疑慮

實作一個PHP Web App
來比較跟傳統硬幹的Web App有哪裡不一樣

第一支Apache PHP Web App程式
使用codeigniter framework

可以到我的github下載
https://github.com/BenjaminLu/CodeIgniter_FirstMVC

下載完畢丟進Apache www資料夾下
(之前有專案建議新開資料夾丟入)
瀏覽器網址輸入
Localhost/沒有新開資料夾丟入則網址沒有此段/Hello
效果應該會等同於
http://myimagewall.no-ip.org/Hello


內部包含了









 




application資料夾下包含了程式
MVC三個模組
分別是

controllers
models
views
三個資料夾

這隻範例新增在整個

CodeIgniter 框架中的檔案只有
controllers資料夾中的Hello.php

views資料夾下的hello_world.php

以及根目錄下的

.gitattributes

.gitignore

README.md

 以上三個是github網站的說明檔 你可以無視他

.htaccess 裡面透過rewrite隱藏與伺服器的接口index.php
這樣在網址列就不需要輸入index.php

其他全部都是屬於最新版CodeIgniter framework的預設檔案

如你所見 此專案沒有使用到Model層的DB操作

重點在Control層與View層間的運作

 








 

在system\libraries裏頭framework已經幫你放置了常用的功能函示庫
包含E-mail 加解密 上傳 Session Log Ftp等等 包成類別
也提供使用類別中Method的方法 各類別請參閱官方文件

其他更清楚的說明可以觀看
延伸閱讀:
http://blog.wu-boy.com/2012/02/intrduction-to-codeigniter-model-view-controller/


data flow的運行如下:
你從網址輸入

http://YourDomain/Hello


Enter的同時會發送Get訊息給根目錄下的index.php

不過index.php被.htaccess檔案所隱藏了 所以你並不需要在網址列輸入

http://YourDomain/index.php/Hello
不過意思是一樣的

index.php接收到網址傳過來的參數
一般格式為

http://YourDomain/index.php/Class/

表示index.php接受到資訊知道要移交request給Hello控制層
並且在此例中 不夾帶方法和參數


於是程式就執行到了Hello.php
如果你的控制層副檔名不是.php 那麼在網址中就不能省略最後副檔名


回到重點打開controllers底下的Hello.php可以看到這樣一段程式碼

 <?php
class Hello extends CI_Controller {
    public function __construct()
    {
        parent::__construct();
    }
    public function index()
    {
        $data['title'] = "Hello, World!";
        $data['heading'] = "My First MVC Web App";
        $data['hellostring'] = "Hello, MVC!";
        $this->load->view('hello_world',$data);
    }   
}
?>


目前index.php已經移交request給Controller 那麼我們的Hello.php便是控制層的檔案
他做的事情就是控制 並把參數設置好 移交給View層

是不是就是你學過的物件導向的觀念呢?

來看看Controller是怎麼做到控制的

class Hello extends CI_Controller
表示Hello類別 繼承了CI_Contriller的類別

因此他也會繼承CI_Controller中的方法


  public function __construct() {
        parent::__construct();
  }


表示他的建構元與父類別CI_Controller相同


public function index() {
        $data['title'] = "Hello, World!";
        $data['heading'] = "My First MVC Web App";
        $data['hellostring'] = "Hello, MVC!";
        $this->load->view('hello_world',$data);

} 

function index通常是預設載入
也就是你沒有在網誌列輸入

http://YourDomain/index.php/Class/Method
的Method 他麼他預設就會執行index() function
若是在class Hello中 新增一個method
public function comments() {
        echo 'Look at this!';

}
那麼要呼叫這個method 網址就要輸入
http://YourDomain/index.php/Hello/comments

是不是對控制層稍微有一點了解了呢?
 那麼他是怎麼與View層溝通將頁面透過瀏覽器 吐給使用者呢?

重點就是index() function中的此行
$this->load->view('hello_world',$data);
表示載入一個view層物件"hello_world"並且傳送參數$data陣列給view層

而$data陣列中陸續放了三個字串
$title = "Hello, World!";
$heading = "My First MVC Web App";
$hellostring = "Hello, MVC!";

分別在$data[0] ,$data[1] ,$data[2]的意思

控制層結束以後來看看View層是怎麼處理接收到的資料並且顯示在瀏覽器上的

打開views資料夾底下的hello_world.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="zh-TW">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />   
    <title><?php echo $title;?></title>
</head>
<body>
<h1><?php echo $heading;?></h1>
<p><?php echo $hellostring;?></p>
</body>
</html>


就是一個很簡單的html表單
但是中間加入了三段PHP語法 分別在

<title><?php echo $title;?></title>

<h1><?php echo $heading;?></h1>

<p><?php echo $hellostring;?></p>


這表示在title的標籤中(瀏覽器的分頁標籤名稱)
透過php輸出接收到的$title變數 (Contriller傳遞過來的參數 此例為: Hello, World!) 
$heading
$hellostring 皆同上原理

如此以來這樣的設計 能對程式設計師 帶來什麼樣的好處呢?

1.可維護性
若是今天我想要更改顯示的資料
我只需要在Control層更改傳遞的變數值即可 

2.耦合性低
各層間沒有相依性,不會因為改變一個檔案而要去修改很多相關的檔案

3.重用性高
若是另外一個View檔案也需要相同的參數,我們只需要在Control層中也傳遞參數給
另一個View檔案



4.安全性高
利用framework操作代替直接與後端以及DB溝通,過濾了SQL Injeciton

透過framework需要編寫的程式碼也少了非常多
就能做到一樣的效果 只要架構建構好
之後開發速度都會比以往一個功能一個頁面寫來的快很多


在台灣老闆和客戶喜歡改來改去吃到飽的環境下
一個專案的可維護性相當重要 有了好的維護性 自然功能擴充性也不會太差

架構好是非常重要的 
我想這也是為什麼SCEA會是最高證照
而SCJP是初階證照的原因

沒有留言:

張貼留言

Related Posts Plugin for WordPress, Blogger...
 
© 2012. Design by Main-Blogger - Blogger Template and Blogging Stuff