作者 主題: Symfony 第1篇--初始化您的專案  (閱讀 15490 次)

0 會員 與 1 訪客 正在閱讀本文。

ricky

  • 實習板主
  • 鑽研的研究生
  • *****
  • 文章數: 669
    • 檢視個人資料
    • Ricky 碎碎唸
Symfony 第1篇--初始化您的專案
« 於: 2007-10-23 18:26 »
symfony安裝完成後
所有的命令列工具都是靠一個symfony這隻程式來完成
我們就以Darkhero兄所舉的範例會員系統作為這個段落的學習目標吧

先初始一個專案吧
假設我們的專案根目錄為 /var/www/member
1.先建立一個目錄
代碼: [選擇]
$mkdir -p /var/www/member
2.切換到專案目錄底下,執行
代碼: [選擇]
$cd /var/www/member
$symfony init-project member

member就是我們專案的名稱嘍
如果沒有意外
symfony會自動幫您建立好您相關的檔案
整個目錄結構就會像這樣
代碼: [選擇]
   apps/
    batch/
    cache/
    config/
    data/
      sql/
    doc/
    lib/
      model/
    log/
    plugins/
    test/
    web/
      css/
      images/
      js

此時記得在apache中的設定檔中加上
代碼: [選擇]
<VirtualHost *:80>
  ServerName member.example.com
  DocumentRoot "/var/www/member/web"
  DirectoryIndex index.php
  <Directory "/var/www/member/web">
   AllowOverride All
  </Directory>
</VirtualHost>

最後記得在/var/www/member/web 建立一個softlink
代碼: [選擇]
ln -sf /usr/lib/php/data/symfony/web/sf sf
如果一切順利
打開瀏覽器,連結到http://member.example.com/ (請依實際狀況,本連結不保證一定work)就可以看到symfony的預設歡迎畫面了
我的symfony作品:YOMOpets 寵物誌
有興趣可以一起來討論symfony喔
我的部落格:http://ricky.ez2.us/

ricky

  • 實習板主
  • 鑽研的研究生
  • *****
  • 文章數: 669
    • 檢視個人資料
    • Ricky 碎碎唸
Symfony 第1篇--初始化您的專案
« 回覆 #1 於: 2007-10-23 18:49 »
建立好基本的專案
再來就是設定資料庫的連結參數嘍
Symfony的基本設定檔都是擺在 config 目錄底下
跟資料庫相關的設定檔有兩個
databases.yml 以及 propel.ini
同時得維護這兩個檔案有點令人討厭,既然你要使用symfony
就乖乖的照辦吧
yaml是一個在MVC框架中很常見設定檔格,式存取速度比xml快,結構簡單
所以深受大家的喜愛(只有開發團隊愛吧),所以你不能不認識他
如果你不知道什麼是yaml,請參閱
YAML 說明
首先我們看一下
databases.yml
代碼: [選擇]
all:
  propel:
    class:          sfPropelDatabase
    param:
      dsn:          pgsql://account:password@localhost/database_name

這裡的dsn就是資料庫連結的參數
我習慣使用postgresql 所以就是pgsql://
喜歡使用mysql就自己改成mysql://
後面的參數不多說自己看著改吧

再來就是
propel.ini
這又是symfony討厭的地方(設定檔格式除了yml還有ini)
其中比較重要的兩行
代碼: [選擇]
propel.database.createUrl  = pgsql://account:password@localhost/database_name
propel.database.url        = pgsql://account:password@localhost/database_name

請依照自己的實際環境做修改吧
到這邊
如果沒意外,symfony就能順利連上資料庫嘍

下一篇我們再來繼續data model的建構吧
我的symfony作品:YOMOpets 寵物誌
有興趣可以一起來討論symfony喔
我的部落格:http://ricky.ez2.us/

ricky

  • 實習板主
  • 鑽研的研究生
  • *****
  • 文章數: 669
    • 檢視個人資料
    • Ricky 碎碎唸
Symfony 第1篇--初始化您的專案
« 回覆 #2 於: 2007-10-24 12:08 »
symfony的data model建立都是根據一個schema.yml的設定檔來建立的
今天我們就來介紹一下如何建構symfony的data model
會員資料表一般會有以下幾個欄位
代碼: [選擇]
1.會員的ID (這是一個序列號碼,也就是主鍵嘍)
2.帳號  (這是一個唯一的名稱,不能重複)
3.密碼
4.email
5.最後登入的IP
6.最後登入時間
7.帳號建立時間

我們就開始schema.yml的定義吧
config/schema.yml
代碼: [選擇]
propel:
 member:
  _attributes: { phpName: Member }
  id:
   type:                integer
   required:            true
   primaryKey:          true
   autoIncrement:       true
  account:
   type:                varchar(20)
   required:            true
   unique:              true
  password:
   type:                varchar(50)
   required:            true
  email:
   type:                varchar(150)
   required:            true
  last_login_ip:
   type:                varchar(20)
  last_login_time:
   type:                timestamp
  create_at:
   type:                timestamp

這邊有幾個要注意的地方
yml格式階層的概念是很重要的,是使用每行開頭的"空白"字元做區隔,所以別數錯嘍
member: 表示我們的表格名稱
_attributes: { phpName: Member } 表示在php裡面用Member這個物件名稱來稱呼他
required: 表示這個欄位的值不可以是空值(null)
unique: 表示這個欄位的值是唯一存在不可重複的
created_at:這邊我們先留個伏筆,以後就知道他的用處了

好嘍再來要進入symfony的重頭戲了
回到/var/www/member這曾目錄底下
首先建立我們的model
代碼: [選擇]
$./symfony propel-build-model
接著就會看到一大串的文字輸出
如果沒有出現紅字,那就表示成功嘍
代碼: [選擇]
$ ls lib/model/*.php
MemberPeer.php  Member.php

這時我們就會發現多了兩個php,這兩個php就是以後我們用來描述member這個資料表的物件敘述嘍

接著產生sql敘述
代碼: [選擇]
$./symfony propel-build-sql
執行成功後
就會多出data/sql/lib.model.schema.sql這個sql檔
我們檢視一下這個sql
代碼: [選擇]
DROP TABLE IF EXISTS `member`;


CREATE TABLE `member`
(
        `id` INTEGER  NOT NULL AUTO_INCREMENT,
        `account` VARCHAR(20)  NOT NULL,
        `password` VARCHAR(50)  NOT NULL,
        `email` VARCHAR(150)  NOT NULL,
        `last_login_ip` VARCHAR(20),
        `last_login_time` DATETIME,
        `created_at` DATETIME,
        PRIMARY KEY (`id`)
)Type=MyISAM;

看看跟你先前定義的schema.yml欄位是否一致
如果沒問題,就準備將sql寫入資料庫嘍
寫入資料庫您可以採取手動將這個sql匯入
或者
代碼: [選擇]
$./symfony propel-insert-sql
這樣symfony就會自動幫您寫入資料庫裡

下篇我們開始進入symfony的view以及action的世界嘍
我的symfony作品:YOMOpets 寵物誌
有興趣可以一起來討論symfony喔
我的部落格:http://ricky.ez2.us/

ricky

  • 實習板主
  • 鑽研的研究生
  • *****
  • 文章數: 669
    • 檢視個人資料
    • Ricky 碎碎唸
Symfony 第1篇--初始化您的專案
« 回覆 #3 於: 2007-10-25 15:25 »
今天我們來學習如何建立一個application以及基本的view和action嘍
接續上一篇
完成了資料表的建立後
我們就可以真正進入symfony的世界嘍
首先我們得起始一個Application
作為預設的Application
首先回到/var/www/member底下
代碼: [選擇]
$./symfony app member
建立我們的預設的Application 名字叫做member
這時我們可以看到apps/這個目錄底下多了一個member的目錄
接下來我們就可以開始建立view以及一系列的action動作了
我們建立一個新的crud(渣滓;污垢??我也不知為啥要取這個名字)
引用
$./symfony propel-generate-crud member member Member

member application 的名稱
member crud的名稱
Member 使用的資料模型名稱(就是我們在schema.yml 中定義的_attributes: { phpName: Member } )

完成後我們就可以打開瀏覽器觀看一下剛剛建立的crud嘍
網址就是http://xxxx/member
member 就是您剛剛建立的crud名稱

現在就已經可以支援基本的新增編輯刪除

下一篇我們來介紹如何自訂action以及view嘍
我的symfony作品:YOMOpets 寵物誌
有興趣可以一起來討論symfony喔
我的部落格:http://ricky.ez2.us/

jaceju

  • 憂鬱的高中生
  • ***
  • 文章數: 106
    • 檢視個人資料
Symfony 第1篇--初始化您的專案
« 回覆 #4 於: 2007-10-25 16:53 »
CRUD 就是 Create 、 Read 、 Update 和 Delete 呀。

http://en.wikipedia.org/wiki/Create,_read,_update_and_delete

ricky

  • 實習板主
  • 鑽研的研究生
  • *****
  • 文章數: 669
    • 檢視個人資料
    • Ricky 碎碎唸
Symfony 第1篇--初始化您的專案
« 回覆 #5 於: 2007-10-26 13:19 »
引述: "jaceju"
CRUD 就是 Create 、 Read 、 Update 和 Delete 呀。

http://en.wikipedia.org/wiki/Create,_read,_update_and_delete

哈原來如此,受教了

只是用CRUD還真的不太好聽,
從字面上來看,Yahoo的字典
代碼: [選擇]
  1.      渣滓;污垢
   2.      無用的人
   3.      不明原因的病


curd "凝乳狀食品" 不好多了嗎 :D
我的symfony作品:YOMOpets 寵物誌
有興趣可以一起來討論symfony喔
我的部落格:http://ricky.ez2.us/

jaceju

  • 憂鬱的高中生
  • ***
  • 文章數: 106
    • 檢視個人資料
Symfony 第1篇--初始化您的專案
« 回覆 #6 於: 2007-10-26 15:27 »
我一開始也搞不清楚 CRUD 是什麼,只覺得外國人老是喜歡用縮寫...

現在我的生活已經被一堆 IT 縮寫給淹沒了...如果不去 Wikipedia 找的話,還真的不知道那些縮寫代表的意思。

ricky

  • 實習板主
  • 鑽研的研究生
  • *****
  • 文章數: 669
    • 檢視個人資料
    • Ricky 碎碎唸
Symfony 第1篇--初始化您的專案
« 回覆 #7 於: 2007-10-31 14:52 »
今天我們來介紹
如何建立一個基本輸入頁面以及欄位驗證
這邊我們將會學習到如何建立action,validation,以及對應的success and error view
首先我們編輯member模組的action
apps/member/modules/member/actions/actions.class.php
找到 public function executeCreate() 負責處理create action的函數
代碼: [選擇]
 public function executeCreate()
  {
   if($this->getRequestParameter('docreate'))
   {
    /*檢查client的hidden欄位是否有docreate這個值,用來判別client是檢視create這個頁面,還是送出表單的動作*/
    $Member=new Member();
    $Member->setAccount($this->getRequestParameter('account'));
    $Member->setPassword(md5(md5($this->getRequestParameter('password'))));
    $Member->setEmail($this->getRequestParameter('email'));
    $Member->save();
    return $this->redirect('member/show?id='.$Member->getId());
   }
  }


再來我們就得指定我們的view嘍
apps/member/modules/member/templates/createSuccess.php
apps/member/modules/member/templates/createError.php

createSuccess.php就是檢視頁面的樣板
createError.php就是發生錯誤時的頁面樣板

createSuccess.php
代碼: [選擇]
<?use_helper('Validation')?>
<?=form_tag('member/create')?>
<?=input_hidden_tag('docreate','1')?>
<table>
<tbody>
<tr>
  <th>帳號:</th>
  <td><?=input_tag('account','', array('size' => 20))?></td>
</tr>
<tr>
  <th>密碼:</th>
  <td><?=input_password_tag('password','',array('size' => 50)) ?></td>
</tr>
<tr>
  <th>再次輸入:</th>
  <td><?=input_password_tag('password_again','',array ('size' => 50)) ?></td>
</tr>
<tr>
  <th>Email:</th>
  <td><?=input_tag('email','',array ('size' => 80)) ?></td>
</tr>
</tbody>
</table>
<hr />
<?=submit_tag('新增') ?>
</form>


createError.php
代碼: [選擇]
<?use_helper('Validation')?>
<?=form_tag('member/create')?>
<?=input_hidden_tag('docreate','1')?>
<table>
<tbody>
<tr>
  <th>帳號:</th>
  <td>
   <?=form_error('account',array('style'=>'font-size:12px;color:red;'))?><br/>
   <?=input_tag('account',$sf_params->get('account'), array('size' => 20))?>
  </td>
</tr>
<tr>
  <th>密碼:</th>
  <td>
   <?=form_error('password_again',array('style'=>'font-size:12px;color:red;'))?
   <?=input_password_tag('password','',array('size' => 50)) ?></td>
</tr>
<tr>
  <th>再次輸入:</th>
  <td><?=input_password_tag('password_again','',array ('size' => 50)) ?></td>
</tr>
<tr>
  <th>Email:</th>
  <td>
  <?=form_error('email',array('style'=>'font-size:12px;color:red;'))?><br/>
  <?=input_tag('email',$sf_params->get('email'),array ('size' => 80)) ?></td>
</tr>
</tbody>
</table>
<hr />
<?=submit_tag('新增') ?>
</form>


在樣板檔中
幾個特殊引用的東西
<?use_helper('Validation')?>  表示我們要引用自動欄位驗證的模組
<?=form_tag('member/create')?> 這裡指定我們提交表單時的頁面
<?=input_hidden_tag('docreate','1')?> 這裡我們添加了一個hidden欄位
<?=form_error('account',array('style'=>'font-size:12px;color:red;'))?>這個就是當提交的表單有發生錯誤時,顯示錯誤的訊息

再來我們就要增加欄位驗證嘍
首先我們得建立一個validate的目錄
apps/member/modules/member/validate
首先得定義create這個action的驗證規則
apps/member/modules/member/validate/create.yml

代碼: [選擇]
fields:
 account:
  required:
   msg:         帳號必須介於4~20個字元,[a-z,A-Z,0-9,_]這些字元。
  sfPropelUniqueValidator:
   class:       Member
   column:      account
   unique_error:        帳號已經重複嘍
  sfRegexValidator:
   match:       Yes
   match_error: 帳號必須介於4~20個字元,[a-z,A-Z,0-9,_]這些字元。
   pattern:     /^[a-zA-Z0-9_]{4,20}$/
 password:
  group:           password_group
 password_again:
  required:
   msg:         密碼不可留空白
  sfStringValidator:
   min:       5
   min_error: 密碼長度太短 (5~20)
   max:       20
   max_error: 密碼長度太長 (5~20)
  group:           password_group
  sfCompareValidator:
   check:               password
   compare_error:       兩次輸入的密碼不同喔
 email:
  required:
   msg:         請輸入email
  sfEmailValidator:
   email_error: email格式錯誤

required: 表示這個欄位不得為空值
msg: 錯誤訊息,會顯示在form_error中
sfPropelUniqueValidator: 用來檢驗這個欄位值跟資料庫中是否有重複資料
sfRegexValidator:  regular expression 的驗證模組
sfCompareValidator: 用來比對兩個input欄位的值
sfEmailValidator: 用來比對欄位的值是否符合email格式的規範

設好後
我們就可以用ie看一下成果嘍

http://your.site.com/member/create


欄位送出驗證錯誤時


資料驗證成功,寫入db嘍


各位還記得我們在config/schema.yml
created_at留的伏筆嗎
現在答案揭曉嘍
沒錯當schema.yml中定義的欄位名稱為created_at時,symfony會自動將他辨識為
內建的特殊欄位,作用是當先建資料時symfony會自動將建立時間給補上。
同理update_at就是當資料有更新時,就自動補上最後更新時間嘍。

下篇我們就來介紹一下symfony的session驗證,以及如何實做一個user login。
我的symfony作品:YOMOpets 寵物誌
有興趣可以一起來討論symfony喔
我的部落格:http://ricky.ez2.us/

ricky

  • 實習板主
  • 鑽研的研究生
  • *****
  • 文章數: 669
    • 檢視個人資料
    • Ricky 碎碎唸
回覆: Symfony 第1篇--初始化您的專案
« 回覆 #8 於: 2008-01-15 14:49 »
今天我們就來介紹symfony如何提供一個身份的驗證
首先得在member模組的action中新增一個login的action
apps/member/modules/member/actions/actions.class.php
代碼: [選擇]
  public function executeLogin()
  {
   if($this->getRequestParameter('account')!='')
    return $this->VerifyLogin();
  }
  private function VerifyLogin()
  {
   if($this->getRequest()->getMethod() != sfRequest::POST)  //檢查client是否使用POST的方式送出參數
    return $this->redirect('member/login');
   //新增一個搜尋的篩選條件
   $Criteria=new Criteria();
   $Criteria->add(BaseMemberPeer::ACCOUNT,$this->getRequestParameter('account');
   $Member = MemberPeer::doSelectOne($Criteria);
   if(!$Member)
    return $this->redirect('member/login');
   //如果有找到符合的account,並且驗證密碼
   if($Member->getPassword()!=md5(md5($this->getRequestParameter('password'))))
    return $this->redirect('member/login');
   $this->getUser()->signIn($Member);   //執行註冊session的動作,這邊是我們自己定義的一個function後面會說明
   $this->redirect('member/show?id='.$Member->getId());
  }
接著我們得新增一個login的view
apps/member/modules/member/templates/loginSuccess.php
代碼: [選擇]
<?=form_tag('member/login')?>
<table>
<tbody>
<tr>
  <th>帳號:</th>
  <td><?=input_tag('account','', array('size' => 20))?></td>
</tr>
<tr>
  <th>密碼:</th>
  <td><?=input_password_tag('password','',array('size' => 50)) ?></td>
</tr>
</tbody>
</table>
<hr />
<?=submit_tag('登入') ?>
</form>

還記得上面程式碼提到的$this->getUser()->signIn($Member);
我們得在MyUser的類別中新增一個自訂的signIn以及signOut函數,用來處理session
apps/member/lib/myUser.class.php
代碼: [選擇]
public function signIn($Member)
 {
  //註冊一個user_id的session,並且將屬性設為已通過驗證
  $this->setAttribute('subscriber_id', $Member->getId(), 'subscriber');
  $this->setAuthenticated(true);
  //設定一個通行證
  $this->addCredential('subscriber');
  $this->setAttribute('LoginAccount', $Member->getAccount(), 'subscriber');
 }
 public function signOut()
 {
  //撤銷通行證
  $this->getAttributeHolder()->removeNamespace('subscriber');
  //將認證的屬性設為false
  $this->setAuthenticated(false);
  $this->clearCredentials();
 }
快到最後一步了
我們得修改
apps/member/config/settings.yml
找到
代碼: [選擇]
all:
  .actions:
    login_module:          member  #當一個未通過身份認證的user存取限制的頁面要去呼叫哪個模組
    login_action:           login      #觸發的action

再來就是我們要對哪些action做出限制存取的動作
apps/member/modules/member/config/security.yml
代碼: [選擇]
create:    #呼叫create這個action時,我們不做安全控管
 is_secure:     off
all:                   #剩下所有的動作,我們都得需要取的"subscriber",這個通行證才允許進入
 is_secure:     on
 credentials:   subscriber

好嘍我們可以來看結果了
記得修改過程式後一定要先清除快取,不然會看到非預期的結果喔
在程式的跟目錄底下執行
代碼: [選擇]
$./symfony cc就可以了

我的symfony作品:YOMOpets 寵物誌
有興趣可以一起來討論symfony喔
我的部落格:http://ricky.ez2.us/