CakePHP 2.x CookBook 中文版 第三章 入門(一)

入門

CakePHP 框架爲應用程序提供了堅實的基礎。它控制着全部方面,從用戶的初始請求直到 web 頁面的最終渲染。因爲本框架遵循 MVC 原則,使得自定義和擴展應用程序變得更容易。 php

本框架還提供了一個基本的原始結構,從文件名到數據庫表名,保持了應用程序的一致性和邏輯性。這個概念簡單而強勁。遵循規則,就會知道東西都在哪兒,都是怎樣組織的。 mysql

體驗和學習 CakePHP 的最好辦法是坐下來作點什麼。咱們將開始構建一個簡單的博客系統。 git

博客課程

歡迎來到 CakePHP。你也許瀏覽這個課程由於你想了解 CakePHP 如何工做的更多信息。咱們旨在提升生產力,使編程更愉悅:咱們但願你深刻代碼,以瞭解這一點。 github

本課程將引領你建立一個簡單的博客應用程序。咱們獲取和安裝 CakePHP,創建和配置數據庫,而且創建列表、新建、編輯和刪除博客貼子的邏輯。 web

如下是咱們須要的東西: sql

  1. 一個運行中的 web 服務器。假定使用的是 Apache,不過使用其它 web 服務器的說明也是相似的。咱們可能要作一點服務器配置,可是大多數人徹底不須要任何配置就能夠運行 Cake。 請確認你擁有 PHP 5.2.8 或更高版本。
  2. 一個數據庫服務器。在本課程中咱們將使用 MySQL 服務器。你須要瞭解足夠的創建數據庫的 SQL 信息:Cake 將從那獲得控制權。若是咱們使用 MySQL,還要確認 PHP 已經啓用了 pdo_mysql 。
  3. 基本的 PHP 知識。最好還懂面向對象編程:可是若是你只是個編程愛好者,也沒必要擔憂。
  4. 最後,須要有一點 MVC 編程模式的基本知識。在 理解 模型 - 視圖 - 控制器 一節能找到一個快速預覽。不用擔憂,大約只有半頁左右。

讓咱們開始吧! 數據庫

得到 Cake

首先讓咱們取得一份新鮮的 Cake 代碼的拷貝。 編程

要獲得新鮮的下載,訪問 Github 上的 CakePHP 項目: http://github.com/cakephp/cakephp/downloads 而且下載 2.0 的最新版本。 數組

也可使用 git 克隆代碼倉庫: git瀏覽器

1 git clone git://github.com/cakephp/cakephp.git

不論是怎樣下載的,都把代碼放進 DocumentRoot 以內。一旦完成,目錄內的東西看起來應該像下面這樣:

/path_to_document_root /app /lib /plugins /vendors .htaccess index.php README

如今也許是多學一點兒關於 CakePHP 目錄結構如何工做的好時候:瀏覽 CakePHP 的文件夾結構 一節。

創建博客數據庫

接着,設置博客的基本數據庫。若是你還未曾這麼作,創建一個爲本教程所用的空數據庫,名稱任選。如今,創建一個單表用來存儲博客貼子。咱們也拋出幾個貼子用於測試。在數據庫上執行以下語句:

 1 /* First, create our posts table: */  2 CREATE TABLE posts (  3 id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,  4 title VARCHAR(50),  5 body TEXT,  6 created DATETIME DEFAULT NULL,  7 modified DATETIME DEFAULT NULL  8 );  9 10 /* Then insert some posts for testing: */ 11 INSERT INTO posts (title,body,created) 12 VALUES ('The title', 'This is the post body.', NOW()); 13 INSERT INTO posts (title,body,created) 14 VALUES ('A title once again', 'And the post body follows.', NOW()); 15 INSERT INTO posts (title,body,created) 16 VALUES ('Title strikes back', 'This is really exciting! Not.', NOW());

表名和列名並不是隨意指定的。若是遵循 Cake 的數據庫命名規則和 Cake 類命名規則(二者的要點都在 CakePHP 約定 一節),可以獲得額外的好處:附送的功能而且無需配置。Cake 足夠靈活以適應糟糕的遺留數據庫結構,可是遵循規則會節省不少時間。

更多的信息參見 CakePHP 約定 一節,簡單點說,只要把表命名爲「posts「就能自動與 Post 模塊掛靠在一塊兒,而 modified 和 created 列則會被 Cake 自動管理。

Cake 數據庫配置

步步高昇:讓咱們告訴 Cake 數據庫在哪兒以及如何鏈接它。對於多數狀況,這是惟一的配置。

/app/Config/database.php.default 是 CakePHP 數據庫配置文件的一個副本,在同一目錄中複製這個文件,命名爲database.php 。

這個配置文件很是簡單:只要用實際的值替換數組 $default 的值。下面是一個完整的配置數組的示例:

 1 public $default = array(  2 'datasource' => 'Database/Mysql',  3 'persistent' => false,  4 'host' => 'localhost',  5 'port' => '',  6 'login' => 'cakeBlog',  7 'password' => 'c4k3-rUl3Z',  8 'database' => 'cake_blog_tutorial',  9 'schema' => '', 10 'prefix' => '', 11 'encoding' => '' 12 );

保存了新的 database.php 文件以後,打開瀏覽器瀏覽 Cake 歡迎頁面。上面將會顯示數據庫鏈接文件被找到,而且已能正確地鏈接到數據庫。

註解

記得你須要 PDO,而且 php.ini 文件中 pdo_mysql 必須可用(enabled)。

可選的配置

另外還有三項配置。許多開發人員完成了長長的列表項,可是它們不包含在本教程中。一是定義一個自定義字符串(salt)用於安全哈希。二是定義一個自定義數字(seed)用於加密。三是容許 CakePHP 寫入它的 tmp 文件夾。

安全 salt 用來生成哈希值。編輯 /app/Config/core.php 文件的 187 行修改默認的 salt 值。什麼樣的值不會有麻煩呢?長到不容易被猜到的值。

1 /** 2  * A random string used in security hashing methods. 3 */ 4 Configure::write('Security.salt', 'pl345e-P45s_7h3*S@l7!');

密碼種子用於加/解密字符串。編輯 /app/Config/core.php 的 192 行修改默認的 seed 值。什麼樣的值不會有麻煩呢?長到不容易被猜到的值。

1 /** 2  * A random numeric string (digits only) used to encrypt/decrypt strings. 3 */ 4 Configure::write('Security.cipherSeed', '7485712659625147843639846751');

最後一項任務是使 app/tmp 目錄容許 web 寫入。最好的辦法是先用(<?php echo `whoami`; ?>)找出運行 web 服務器的用戶,而後將 app/tmp 的全部者指向該用戶。在 *nix 系統中運行相似下面的命令:

1 $ chown -R www-data app/tmp

若是囿於某些條件而不能寫入這個文件夾,你會收到一個不能使用產品模式的警告。

mod_rewrite 說明

偶爾有用戶會遇到 mod_rewrite 方面的問題,因此咱們在這作個簡要說明。若是 CakePHP 歡迎頁面有點兒好笑(沒有圖片或 CSS 樣式),意味着系統中缺乏 mod_rewrite 功能。有一些對正確運行有幫助的提示: :

肯定 .htaccess 覆蓋是被容許的:在 httpd.conf 中每一個目錄有一個節定義這條規則。確認是在正確的目錄中把AllowOverride 設置 All。出於安全和執行方面的緣由,不要 在 <Directory /> 中把 AllowOverride 設置爲All。替代方案是尋找指向所用 web 站點目錄的 <Directory> 塊。

  1. 肯定 .htaccess 覆蓋是被容許的:在 httpd.conf 中每一個目錄有一個節定義這條規則。確認是在正確的目錄中把AllowOverride 設置 All。出於安全和執行方面的緣由,不要在 <Directory /> 中把 AllowOverride 設置爲All。替代方案是尋找指向所用 web 站點目錄的 <Directory> 塊。

  2. 確認編輯了正確的 httpd.conf,而不是某個用戶或特別站點的 httpd.conf。

  3. 有些狀況下,可能拿到的是一個不帶 .htaccess 文件的 CakePHP 副本。出現這種狀況的緣由是因爲一些操做系統隱藏(不顯示)以 . 開頭的文件,以至拷貝時沒有拷貝這個文件。確保 CakePHP 的副原本自下載一節的站點或 git 倉庫。

  4. 確認 Apache 正確的加載了 mod_rewrite。應該能夠在 httpd.conf 中看到以下的內容::

    1 LoadModule rewrite_module             libexec/httpd/mod_rewrite.so

    或者(在 Apache 1.3)中

    1 AddModule             mod_rewrite.c

     

若是不想或不能讓運行中的系統使用 mod_rewrite(及其它兼容模塊),須要使用 CakePHP 內置的漂亮 URLs。取消/app/Config/core.php 文件中以下一行的註釋:

1 Configure::write('App.baseUrl', env('SCRIPT_NAME'));

同時刪除這幾個 .htaccess 文件:

/.htaccess /app/.htaccess /app/webroot/.htaccess

這會用相似 www.example.com/index.php/controllername/actionname/param 的 URL 代替 www.example.com/controllername/actionname/param。

若是 CakePHP 安裝在 Apache 之外的 web 服務器上,能夠在 高級安裝 一節找到工做在 URL 重寫機制下的介紹。

接下來的 博客課程 —— 加入一個層,將開始第一個 CakePHP 應用程序。

博客課程 —— 加入一個層

創建 Post 模型

模型(model)類是 CakePHP 應用程序的麪包和奶油。經過創建與數據庫結合的模型類,咱們就有了隨後放置所需的顯示、添加、編輯和刪除操做的基礎。

CakePHP 的模型類放在 /app/Model 文件夾,咱們創建的文件將被存爲 /app/Model/Post.php。完整的文件相似於:

1 class Post extends AppModel { 2 }

在 CakePHP 中命名規則很是重要。經過把類命名爲 Post,CakePHP 會自動認定這個模型將被用在 PostsController 中,並且會與名爲 posts 的數據庫表關聯。.

註解

若是 CakePHP 不能在 /app/Model 文件夾內找到相對應的文件,它會動態地創建一個模型對象。也就是說,若是不慎寫錯了文件名(例如 post.php 或者 posts.php),CakePHP 就不認識全部的設置並使用默認的設置代替它。

關於模型的更多信息,諸如表前綴、回調和數據校驗,請參閱手冊中 模型 一章。

創建 Posts 控制器

接着咱們爲貼子創建一個控制器。這個控制器是發生貼子交互的地方。簡單地說,它就是完成運行模型和得到貼子相關工做的地方。咱們將在 /app/Controller 目錄的 PostsController.php 文件中放置一個控制器類。類的基本內容相似於:

1 class PostsController extends AppController { 2 public $helpers = array('Html', 'Form'); 3 }

現 在在控制器中添加一個動做。控制器中的動做一般實現單一的功能或接口。例如,當用戶請求http://www.example.com/post /index(這個和 http://www.example.com/post 相同),他們可能期待看見一個貼子列表。這個動做的代碼相似於:

1 class PostsController extends AppController { 2 public $helpers = array('Html', 'Form'); 3 4 public function index() { 5 $this->set('posts', $this->Post->find('all')); 6  } 7 }

我 來解釋一下這個動做。經過在 PostsController 中定義一個函數 index(),用戶如今就可以經過向www.example.com/posts/index 提交訪問程序邏輯。相似地,若是定義一個函數叫 foobar(),用戶就可以訪問 www.example.com/posts/index。

警告

以短小的方式命名控制器和動做是一種誘惑,要抑制這種誘惑。遵循 CakePHP 的命名規則(以複數命名控制器等)創建易讀、易理解的動做名稱。隨後能夠經過``路由``映射 URLs 到代碼。

上例中index動做中使用 set() 方法從控制器向視圖(後面會建立)傳遞數據。設置視圖那一行中名爲 ‘posts’ 的變量等於 Post 模型的 find('all') 方法的返回值。因爲遵循了 Cake 的命名規則,Posts 模型自動可用($this->Post)。

要學習 Cake 控制器的更多內容,請瀏覽 控制器 一章。

相關文章
相關標籤/搜索