CakePHP 框架爲應用程序提供了堅實的基礎。它控制着全部方面,從用戶的初始請求直到 web 頁面的最終渲染。因爲本框架遵循 MVC 原則,使得自定義和擴展應用程序變得更容易。 php
本框架還提供了一個基本的原始結構,從文件名到數據庫表名,保持了應用程序的一致性和邏輯性。這個概念簡單而強勁。遵循規則,就會知道東西都在哪兒,都是怎樣組織的。 mysql
體驗和學習 CakePHP 的最好辦法是坐下來作點什麼。咱們將開始構建一個簡單的博客系統。 git
歡迎來到 CakePHP。你也許瀏覽這個課程由於你想了解 CakePHP 如何工做的更多信息。咱們旨在提升生產力,使編程更愉悅:咱們但願你深刻代碼,以瞭解這一點。 github
本課程將引領你建立一個簡單的博客應用程序。咱們獲取和安裝 CakePHP,創建和配置數據庫,而且創建列表、新建、編輯和刪除博客貼子的邏輯。 web
如下是咱們須要的東西: sql
讓咱們開始吧! 數據庫
首先讓咱們取得一份新鮮的 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 數據庫在哪兒以及如何鏈接它。對於多數狀況,這是惟一的配置。
/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 方面的問題,因此咱們在這作個簡要說明。若是 CakePHP 歡迎頁面有點兒好笑(沒有圖片或 CSS 樣式),意味着系統中缺乏 mod_rewrite 功能。有一些對正確運行有幫助的提示: :
肯定 .htaccess 覆蓋是被容許的:在 httpd.conf 中每一個目錄有一個節定義這條規則。確認是在正確的目錄中把AllowOverride 設置 All。出於安全和執行方面的緣由,不要 在 <Directory /> 中把 AllowOverride 設置爲All。替代方案是尋找指向所用 web 站點目錄的 <Directory> 塊。
肯定 .htaccess 覆蓋是被容許的:在 httpd.conf 中每一個目錄有一個節定義這條規則。確認是在正確的目錄中把AllowOverride 設置 All。出於安全和執行方面的緣由,不要在 <Directory /> 中把 AllowOverride 設置爲All。替代方案是尋找指向所用 web 站點目錄的 <Directory> 塊。
確認編輯了正確的 httpd.conf,而不是某個用戶或特別站點的 httpd.conf。
有些狀況下,可能拿到的是一個不帶 .htaccess 文件的 CakePHP 副本。出現這種狀況的緣由是因爲一些操做系統隱藏(不顯示)以 . 開頭的文件,以至拷貝時沒有拷貝這個文件。確保 CakePHP 的副原本自下載一節的站點或 git 倉庫。
確認 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 應用程序。
模型(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 就不認識全部的設置並使用默認的設置代替它。
關於模型的更多信息,諸如表前綴、回調和數據校驗,請參閱手冊中 模型 一章。
接着咱們爲貼子創建一個控制器。這個控制器是發生貼子交互的地方。簡單地說,它就是完成運行模型和得到貼子相關工做的地方。咱們將在 /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 控制器的更多內容,請瀏覽 控制器 一章。