CakePHP快速入门

来源:互联网 发布:热点图 软件 编辑:程序博客网 时间:2024/06/10 03:09

快速入门

CakePHP的框架为您的应用程序提供了一个强大的基础。它可以处理每一个环节,从用户的初始请求一路到网页的最终渲染。 而且,由于该框架采用MVC的框构,它可以让你轻松定制和扩展你的应用程序。

该框架还提供了一个基本的组织结构,从文件名到数据库表名,让您的整个应用程序一致性和逻辑性。这个概念很简单,但功能强大。按照约定你将更容易的了解如何去组织他们。

体验和学习CakePHP的最好的办法是坐下来建立一些有趣的东西。要开始了,我们将构建一个简单的博客应用程序。

博客教程

欢迎来到CakePHP。 你可能会仔细阅读该教程,因为你想了解更多关于CakePHP是如何工作的。以提高生产率,使编码更有乐趣,这是我们的目标:我们希望当你深入了解到代码,你会看到这一点。


本教程将引导您完成创建一个简单的博客应用程序。我们将获取和安装CakePHP,创建配置数据库和创建应用程逻辑用来显示、添加、编辑、删除博客。

这里就是你需要的:

  1. 运行Web服务器。 我们假设您将使用Apache做为Web服务器,但使用其他服务器的说明应该是非常相似的。我们可能需要一点点额外的服务器配置,但大多数人可以安装运行CakePHP无需任何配置的。请确保您有PHP5.2.8或更高版本。
  2. 一个数据库服务器。在本教程中我们将使用MySQL服务器。你需要掌握SQL语言,创建一个数据库: 在这里CakePHP将采取一些措施。 因为我们使用的是MySQL,所以我们要确定PHP已经开启 pdo_mysql 扩展。
  3. 基本的PHP知识。 更多的使用面像对像程序设计,效果会变的更好:但不要害怕,如果你是一个出色的程序员。
  4. 最后,你需要MVC编程模式的基本知识。 快速预览中可以找到 领会 Model-View-Controller。 别担心,它只有一页半左右。
让我们开始吧!

获取CakePHP

首先,让我们获取最新的CakePHP代码副本。

为了得到一个最新的版本,请访问GitHub上的CakePHP的项目:https://github.com/cakephp/cakephp/tags 并下载最新的2.X版本

您还可以使用克隆存储库 git. git clone git://github.com/cakephp/cakephp.git

无论你如何下载它,将你的代码放在DocumentRoot目录中。 一旦完成,你的目录设置看起来应该像下面这样:

[php] view plain copy
  1. /path_to_document_root  
  2.     /app  
  3.     /lib  
  4.     /plugins  
  5.     /vendors  
  6.     .htaccess  
  7.     index.php  
  8.     README  

现在是了解CakePHP目录结构的好时机: 检查看 CakePHP 文件夹结构 一节

tmp目录的权限

接下来我们需要让服务器上的 app/tmp 目录拥有写权限。 要做到这一点,最好的办法是找出你的web服务器是那个用户运行的。 您可以运行包含 <?php echo exec('whoami'); ?> 的PHP文件在任何Web服务器上。 你应该会看到他所打印出的用户名。将 app/tmp 目录的所有权更改到该用户。 你(在* nix中)运行的最后一个命令可能看起来像这样:

[php] view plain copy
  1. chown -R www-data app/tmp  

如果由于某种原因的CakePHP无法写入该目录,你会看到警告和未捕获的异常"exceptions that cache data cannot be written"。

创建博客数据库

接下来,让我们建立博客基础数据库。 如果你还没有这样做的话,请在本教程中创建使用一个空的数据库,使用您选择的名称。现在,我们只需要建立一个单一的表来存储我们的帖子。我们将新插入几个帖子,用于测试目的。 执行下面的SQL语句到数据库:

[sql] view plain copy
  1. /* Firstcreate 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());  

在表名和列名的选取上不是随意的。如果你遵循CakePHP的数据库命名惯例, 和CakePHP的类命名约定 (CakePHP 约定定做了相应的概述), 你可以采取很多现成的功能来避免大量的配置。 CakePHP足够灵活,可以适应即使是最糟糕的遗留数据库模式,但遵循他的惯例将节省您的时间。

查看 CakePHP约定 的更多信息,但我只想说,我们命名表'posts'自动将其挂接到我们的Post模型, 且字段的“修改“和”创造"将CakePHP中被自动地管理。

CakePHP的数据库配置

勇往直前:让我们告诉CakePHP如何连接到我们的数据库。 对于许多人来说,这是第一次也是最后一次配置任何东西。

CakePHP的数据库配置文件在 /app/Config/database.php.default文件中可以找到。 在这个目录中,将其命名为 database.php

该配置文件应该是相当简单的:只是替换 $default 数组与那些适用于您的安装的值。例如完成配置数组可能看起来像下面这样:

[php] view plain copy
  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' => 'utf8'  
  12. );  

一旦你保存到新的 database.php 文件中, 你应该可以打开浏览器并会看到CakePHP的欢迎页面。它应该会告诉你,你的数据库连接文件被发现,而且CakePHP的可以成功连接到数据库。
[php] view plain copy
  1. 请记住,你需要有PDO,并在你的php.ini文件中激活PDO_MYSQL。  


可选配置

有可配置一些其它项目。 大多数开发人员可以完成这些清单项目,但他们并不需要这个教程。第一个是安全散列使用定义一个自定义字符串(或“随机”)。第二是定义自定义密码(或“密码种子”),用于加密使用。

安全随机代码用于生成哈希值。修改/app/Config/core.php文件中的 Security.salt 默认值。替换掉的值要足够长,难以猜测和随机生成你可以把他定议为:

[php] view plain copy
  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 文件中的 Security.cipherSeed 的默认值。替换值应该是一个大的随机整数:

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

mod_rewrite 注意事项

偶尔新用户会碰到mod_rewrite的问题。 例如,如果CakePHP的欢迎页面看起来有点滑稽(无图像或CSS样式),这可能意味着mod_rewrite没有在你的系统上运行。 请参考以下URL重写信息让你的服务正常运行。

  • URL 重写

现在,继续到博客教程 - 添加一个模型,开始建立你的第一个CakePHP的应用。

博客教程添加模型

创建 Post 模型

Model类是CakePHP的应用的面包和奶油。 通过创建一个CakePHP的模型,将与我们的数据库进行交互,我们将使用他来取代现有的基础操作如显示,添加,修改,删除操作。

CakePHP的Model类文件在 /app/Model目录中。 我们将要创建的文件将被保存到/app/Model/Post.php。 已完成的文件应该是这样的:

[php] view plain copy
  1. class Post extends AppModel {  
  2. }  

CakePHP的命名约定是非常重要的。 将我们的模型命名为 Post, CakePHP可以自动推断出这个模型将在PostsController中使用,并且将被连接到数据库表 posts.

[php] view plain copy
  1. CakePHP会动态地创建模型对象,如果它不能找到在/app/Model目录中对应的文件。 这也意味着,如果你不小心将文件名称写错 (例如, post.php 或 posts.php 而不是 Post.php), CakePHP的将不承认任何设置,将使用默认值代替。  


欲了解更多有关模型,如表前缀,回调, 和验证, 请查阅该手册的 模型 章节。

创建 Posts 控制器

接下来,我们将创建一个控制器,用于我们的posts。该控制器是触发所有与post互动的业务逻辑。概括地说, 他就是控制你的模型或取于它相关的操作。我们把这个新的控制器放在一个名为 PostsController.php 在 /app/Controller 目录中。 基本的控制器应该是什么样子:

[php] view plain copy
  1. class PostsController extends AppController {  
  2.     public $helpers = array('Html''Form');  
  3. }  

现在,让我们行动加入到我们的控制器。 Action 代表了一个应用程序的单一功能或接口。例如,当用户请求 www.example.com/posts/index (这是相同的 www.example.com/posts/), 他们可能希望看到posts的列表。 该操作的代码将看起来像这样:
[php] view plain copy
  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. }  

定议函数 index() 在 PostsController, 用户可以通过请求 www.example.com/posts/index 访问业务逻辑。同样的,如果我们定义一个调用的函数 foobar(), 用户将能够在 www.example.com/posts/foobar 访问到它。

[php] view plain copy
  1. 你可能受到诱惑,命名您的控制器和操作有一定的方法来获得一个特定的URL。 抵制这种诱惑。 遵循CakePHP的约定(大小写,复数名称等),并创建可读的, 可以理解的动作名称。 您可以使用覆盖后的“<span style="font-family: Arial; font-size: 14px; line-height: 19.600000381469727px; background-color: rgb(251, 237, 237);">routes</span>”URL映射到你的代码。  

在动作中使用一个简单的 set() 函数从控制器将数据传递到视图中 (接下来我们将会创建)。 该行所调用的 “posts“ 等于 find('all') 方法用于返回 Post 模型的所有数据。 我们的Post模型可以自动的使用 $this->Post 因为我们遵循CakePHP的命名约定。

要了解更多关于CakePHP的控制器,请查阅 控制器 章节。

创建 Post 视图

现在,我们已经把我们的数据流向我们的模型, 并通过我们的控制器定义了应用程序逻辑和流程,让我们创造我们上面所创建的索引操作的视图。

CakePHP 视图只是用来展示应用程序组织块适合在布局中。对于大多数应用程序,它们的HTML混合使用PHP,但他们可能最终会成为XML,CSV或二进制数据。

布局是包裹在视图呈现的代码。多种布局可以被定义,你可以在它们之间进行切换,但现在,我们只使用默认值。

还记得在上一节中我们使用分配“posts”变量视图中的 set() 方法? 将传递数据到视图,将看起来像这样:

[php] view plain copy
  1. // print_r($posts) output:  
  2.   
  3. Array  
  4. (  
  5.     [0] => Array  
  6.         (  
  7.             [Post] => Array  
  8.                 (  
  9.                     [id] => 1  
  10.                     [title] => The title  
  11.                     [body] => This is the post body.  
  12.                     [created] => 2008-02-13 18:34:55  
  13.                     [modified] =>  
  14.                 )  
  15.         )  
  16.     [1] => Array  
  17.         (  
  18.             [Post] => Array  
  19.                 (  
  20.                     [id] => 2  
  21.                     [title] => A title once again  
  22.                     [body] => And the post body follows.  
  23.                     [created] => 2008-02-13 18:34:56  
  24.                     [modified] =>  
  25.                 )  
  26.         )  
  27.     [2] => Array  
  28.         (  
  29.             [Post] => Array  
  30.                 (  
  31.                     [id] => 3  
  32.                     [title] => Title strikes back  
  33.                     [body] => This is really exciting! Not.  
  34.                     [created] => 2008-02-13 18:34:57  
  35.                     [modified] =>  
  36.                 )  
  37.         )  
  38. )  

CakePHP的视图文件存放在 /app/View 于其相应的控制器命名的文件夹内。 (在这种情况下我们将要创建一个名为,“Posts”文件夹。) 要格式化这个post数据到一个很好的表格,视图代码可能会是这个样子:


[php] view plain copy
  1. <!-- File: /app/View/Posts/index.ctp -->  
  2.   
  3. <h1>Blog posts</h1>  
  4. <table>  
  5.     <tr>  
  6.         <th>Id</th>  
  7.         <th>Title</th>  
  8.         <th>Created</th>  
  9.     </tr>  
  10.   
  11.     <!-- Here is where we loop through our $posts array, printing out post info -->  
  12.   
  13.     <?php foreach ($posts as $post): ?>  
  14.     <tr>  
  15.         <td><?php echo $post['Post']['id']; ?></td>  
  16.         <td>  
  17.             <?php echo $this->Html->link($post['Post']['title'],  
  18. array('controller' => 'posts''action' => 'view'$post['Post']['id'])); ?>  
  19.         </td>  
  20.         <td><?php echo $post['Post']['created']; ?></td>  
  21.     </tr>  
  22.     <?php endforeach; ?>  
  23.     <?php unset($post); ?>  
  24. </table>  

您可能已经注意到了利用名为 $this->Html的对像。 这是 CakePHPHtmlHelper 类的一个实例。 CakePHP附带了一套视图助手,让喜欢的东西联系起来,形成输出,JavaScript和AJAX的一个单元。您可以了解更多关于如何使用它们 在帮助文档中, 但什么是重要的,这里要注意的是, link() 方法将生成具有给定标题(第一个参数)和URL(第二个参数)的HTML链接。

当指定的CakePHP的的URL,建议您使用数组格式。这是在对路由的部分更详细地解释。 使用URL的数组格式允许您利用CakePHP的反向路由功能的优势。 您也可以指定相对于在 /controller/action/param1/param2 形式的,应用程序的基本URL。

此时,你应该可以将浏览器指向http://www.example.com/posts/index。 您应该看到您的视图,与posts的标题和表格清单格式正确无误。

如果你碰巧点击了的一个,我们在此视图中所创建的链接 (其中一个post的标题链接 /posts/view/some_id),你可能会从 CakePHP 获取到一个“该操作还没有被定义”的错误提示。 如果你没有得到通知,无论是出了问题,或者你其实也已经定义它,在这种情况下,你很是卑鄙的。否则,我们将现在的 PostsController 创建它:

[php] view plain copy
  1. // File: /app/Controller/PostsController.php  
  2. class PostsController extends AppController {  
  3.     public $helpers = array('Html''Form');  
  4.   
  5.     public function index() {  
  6.          $this->set('posts'$this->Post->find('all'));  
  7.     }  
  8.   
  9.     public function view($id = null) {  
  10.         if (!$id) {  
  11.             throw new NotFoundException(__('Invalid post'));  
  12.         }  
  13.   
  14.         $post = $this->Post->findById($id);  
  15.         if (!$post) {  
  16.             throw new NotFoundException(__('Invalid post'));  
  17.         }  
  18.         $this->set('post'$post);  
  19.     }  
  20. }  

对于 set() 调用应该很熟悉。我们使用 findById() 而不是使用 find('all') 因为我们只想要一个岗位的信息公告。

请注意,我们的视图动作需要一个参数: 我们希望看到的post ID。 此参数是通过URL请求的传递给具体的动作。如果一个用户请求 /posts/view/3, 则该值'3'是传递给$ID。

我们也做了一点错误检查以确保用户实际访问的记录。如果一个用户请求 /posts/view, 我们将抛出 NotFoundException 和 CakePHP ErrorHandler。 我们也进行了类似的检查,以确保用户访问一个存在的记录。

现在让我们来创建视图为我们新的'视图',并将其放置在 /app/View/Posts/view.ctp

[php] view plain copy
  1. <!-- File: /app/View/Posts/view.ctp -->  
  2.   
  3. <h1><?php echo h($post['Post']['title']); ?></h1>  
  4.   
  5. <p><small>Created: <?php echo $post['Post']['created']; ?></small></p>  
  6.   
  7. <p><?php echo h($post['Post']['body']); ?></p>  

通过链接 /posts/index 或手动输入/posts/view/1来验证他们是否能够正常工作。


添加 Posts

从数据库中读取,并显示我们的posts是一个很好的开始,但是让我们允许增加新的posts

首先,先在PostsController中创建 add() 动作:

[php] view plain copy
  1. class PostsController extends AppController {  
  2.     public $helpers = array('Html''Form''Session');  
  3.     public $components = array('Session');  
  4.   
  5.     public function index() {  
  6.         $this->set('posts'$this->Post->find('all'));  
  7.     }  
  8.   
  9.     public function view($id) {  
  10.         if (!$id) {  
  11.             throw new NotFoundException(__('Invalid post'));  
  12.         }  
  13.   
  14.         $post = $this->Post->findById($id);  
  15.         if (!$post) {  
  16.             throw new NotFoundException(__('Invalid post'));  
  17.         }  
  18.         $this->set('post'$post);  
  19.     }  
  20.   
  21.     public function add() {  
  22.         if ($this->request->is('post')) {  
  23.             $this->Post->create();  
  24.             if ($this->Post->save($this->request->data)) {  
  25.                 $this->Session->setFlash(__('Your post has been saved.'));  
  26.                 return $this->redirect(array('action' => 'index'));  
  27.             }  
  28.             $this->Session->setFlash(__('Unable to add your post.'));  
  29.         }  
  30.     }  
  31. }  

[php] view plain copy
  1. $this->request->is() 接受一个参数,它可以是请求方法(GET,PUT,POST,DELETE)或一些请求标识符(AJAX)。 它不是一种来检查特定发布的数据<span style="font-family: Arial;">方法</span><span style="font-family: Arial;">。例如,$this->request->is('book')如果book的数据被发布不会返回true。</span>  
[php] view plain copy
  1. 你需要引用 SessionComponent和SessionHelper在任何控制器中你都会使用到它们。 如果有必要,将它包含在您的AppController。  


下面介绍一下 add() 操作方法: 如果请求的HTTP方法是POST,它会尝试使用Post模型来保存数据。如果由于某种原因,它不保存,它只是呈现视图。 这给了我们一个机会向用户显示验证错误或其他警告。

每一个 CakePHP 请求都包含 CakeRequest 对象是访问使用 $this->request。 请求对象包含刚接收有用的请求信息,并且可以用来控制应用程序的流程。 在这种情况下,我们使用 CakeRequest::is() 方法来检查请求是不是一个HTTP POST请求。
当用户使用表单POST数据到你的应用程序,这些信息包含在 $this->request->data中。 你能够使用 pr() 或 debug() 函数打印出你想看到的数据。

我们使用 SessionComponent 的 SessionComponent::setFlash() 方法来设置一个消息重定向后显示在页面上一个会话变量。 在布局中我们有 SessionHelper::flash 显示消息并清除相应的会话变量。 该控制器 Controller::redirect 重定向到另一个URL。 该参数数组 array('action' => 'index') 将转换成 URL /posts (也就是posts控制器的index动作)。 您可以参考 Router::url() 函数的 API 来格式化各种功能的CakePHP URL。


在调用 save() 方法将检查验证错误并中止已发生的储存操作。 我们将讨论这些错误是如何在下面的章节中进行处理。


首先我们调用 create() 方法重置模型的状态来保存新信息的数据。 实际上它并不在数据库中创建一条记录, 但清除 Model::$id 和设置 Model::$data 根据你的数据库字段的默认值的数据。


数据验证

CakePHP走一段很长的路转向了单调出来的形式输入验证。每个人都痛恨编码了无尽的形式及其验证例程。CakePHP的使得它更容易和更快速。

要利用的验证功能,您将需要使用CakePHP的 FormHelper 在你的视图中。 FormHelper 在视图中默认为 $this->Form

下面是我们添加的视图:

[php] view plain copy
  1. <!-- File: /app/View/Posts/add.ctp -->  
  2.   
  3. <h1>Add Post</h1>  
  4. <?php  
  5. echo $this->Form->create('Post');  
  6. echo $this->Form->input('title');  
  7. echo $this->Form->input('body'array('rows' => '3'));  
  8. echo $this->Form->end('Save Post');  
  9. ?>  

我们使用 FormHelper 生成一个HTML表单的标记。下面是t $this->Form->create() 方法生成的HMTL。

[php] view plain copy
  1. <form id="PostAddForm" method="post" action="/posts/add">  

如果 create() 方法被调用时没有提供任何参数, 它假定您POST到当前的控制器的 add() 动作。(或 edit() 动作当 id 包括在该表单数据中)。

$this->Form->input() 方法用于创建具有相同名称的形式标记。 第一个参数告诉CakePHP它们对应于哪个字段, 第二个参数允许你指定了各种选项 - 在多行的textarea的数量情况下。这里进行反思: input() 将根据指定的model字段输出不同的表单元素。

$this->Form->end() 调用产生一个提交按钮,结速表单定义。如果一个字符串做为 end()第一个参数,FormHelper 相应输出随form关闭标签及提交按钮。 再次,参照 Helpers 获得更多的帮助。

现在,让我们回过头来更新我们的 /app/View/Posts/index.ctp 添加 “Add Post” 作为一个新的链接。 在<table>,之前添加一行:

[php] view plain copy
  1. <?php echo $this->Html->link(  
  2.     'Add Post',  
  3.     array('controller' => 'posts''action' => 'add')  
  4. ); ?>  

您可能想知道:我该如何告诉CakePHP我的验证要求? 验证规则在模型中定义。让我们回头看看我们的Post模型并作一些调整:

[php] view plain copy
  1. class Post extends AppModel {  
  2.     public $validate = array(  
  3.         'title' => array(  
  4.             'rule' => 'notEmpty'  
  5.         ),  
  6.         'body' => array(  
  7.             'rule' => 'notEmpty'  
  8.         )  
  9.     );  
  10. }  

$validate 数组告诉CakePHP 调用 save() 方法时如何验证数据。 在这里我指定,无论是boy和title字段不能为空。 CakePHP的验证引擎是强大的,关于内置规则 (信用卡号码,电子邮件地址等。) 和灵活性,添加您自己的验证规则。 For more 欲了解更多信息请查看 数据验证

现在,用你自已的验证规则取代现有规则,让应用程序试图用一个空标题或正文,看看它是如何工作添加一个职位。 由于我们使用 FormHelper::input() 方法让 FormHelper 来创建我们的表单元素。 我们的验证错误信息将自动显示。

编辑 Posts

Post 编辑: 在这里,我们走。你是一个专业的CakePHP,所以你应该有回升的格局。 然后在视图制作动作。 这里的 PostsController edit() 动作看起来如下:

[php] view plain copy
  1. public function edit($id = null) {  
  2.     if (!$id) {  
  3.         throw new NotFoundException(__('Invalid post'));  
  4.     }  
  5.   
  6.     $post = $this->Post->findById($id);  
  7.     if (!$post) {  
  8.         throw new NotFoundException(__('Invalid post'));  
  9.     }  
  10.   
  11.     if ($this->request->is(array('post''put'))) {  
  12.         $this->Post->id = $id;  
  13.         if ($this->Post->save($this->request->data)) {  
  14.             $this->Session->setFlash(__('Your post has been updated.'));  
  15.             return $this->redirect(array('action' => 'index'));  
  16.         }  
  17.         $this->Session->setFlash(__('Unable to update your post.'));  
  18.     }  
  19.   
  20.     if (!$this->request->data) {  
  21.         $this->request->data = $post;  
  22.     }  
  23. }  

这个动作首先确保用户试图访问一个现有的记录。如果他们在 $id参数上没有通过, 或该post不存在, 我们抛出一个 NotFoundException 为 CakePHP ErrorHandler 来处理。

下一步的动作会检查该请求是POST或PUT。 如果是,那么我们使用POST数据来更新我们的记录后,如果被排斥,将显示用户验证错误。

如果没有数据设置为 $this->request->data, 我们只需将其设置为先前检索post。

编辑视图可能看起来像这样:

[php] view plain copy
  1. <!-- File: /app/View/Posts/edit.ctp -->  
  2.   
  3. <h1>Edit Post</h1>  
  4. <?php  
  5. echo $this->Form->create('Post');  
  6. echo $this->Form->input('title');  
  7. echo $this->Form->input('body'array('rows' => '3'));  
  8. echo $this->Form->input('id'array('type' => 'hidden'));  
  9. echo $this->Form->end('Save Post');  
  10. ?>  

视图输出编辑表单(与填充值),以及所有需要验证错误消息。

有一点需要注意: CakePHP会假设你正在编辑一个模型,如果'id'字段存在数组中的数据。如果没有'id'存在 (回头看看我们的附加视图),CakePHP会假设你要插入一个新的模型时 save() 方法会被调用。

现在,您可以更新您的Index视图链接到编辑具体的post:

[php] view plain copy
  1. <!-- File: /app/View/Posts/index.ctp  (edit links added) -->  
  2.   
  3. <h1>Blog posts</h1>  
  4. <p><?php echo $this->Html->link("Add Post"array('action' => 'add')); ?></p>  
  5. <table>  
  6.     <tr>  
  7.         <th>Id</th>  
  8.         <th>Title</th>  
  9.         <th>Action</th>  
  10.         <th>Created</th>  
  11.     </tr>  
  12.   
  13. <!-- Here's where we loop through our $posts array, printing out post info -->  
  14.   
  15. <?php foreach ($posts as $post): ?>  
  16.     <tr>  
  17.         <td><?php echo $post['Post']['id']; ?></td>  
  18.         <td>  
  19.             <?php  
  20.                 echo $this->Html->link(  
  21.                     $post['Post']['title'],  
  22.                     array('action' => 'view'$post['Post']['id'])  
  23.                 );  
  24.             ?>  
  25.         </td>  
  26.         <td>  
  27.             <?php  
  28.                 echo $this->Html->link(  
  29.                     'Edit',  
  30.                     array('action' => 'edit'$post['Post']['id'])  
  31.                 );  
  32.             ?>  
  33.         </td>  
  34.         <td>  
  35.             <?php echo $post['Post']['created']; ?>  
  36.         </td>  
  37.     </tr>  
  38. <?php endforeach; ?>  
  39.   
  40. </table>  

删除 Posts

接下来,让我们做一个方式为用户删除post。 开始在PostsController中创建 delete() 动作:

[php] view plain copy
  1. public function delete($id) {  
  2.     if ($this->request->is('get')) {  
  3.         throw new MethodNotAllowedException();  
  4.     }  
  5.   
  6.     if ($this->Post->delete($id)) {  
  7.         $this->Session->setFlash(  
  8.             __('The post with id: %s has been deleted.', h($id))  
  9.         );  
  10.         return $this->redirect(array('action' => 'index'));  
  11.     }  
  12. }  

这种逻辑删除由$ id指定的post,并使用 $this->Session->setFlash() 重定向它们到 /posts显示一些息。如果用户试图使用一个GET请求做一个删除,我们抛出一个异常。 未捕获的异常由CakePHP的异常处理程序捕获,并显示一个友好的错误页面。 有许多内置的的异常,可以用来表示各种HTTP错误您的应用程序可能需要生成。

因为我们只是执行一些逻辑和重定向,这个动作没有视图。你可能需要更新 Index 视图的链接,使用户可以删除post,但是:

[php] view plain copy
  1. <!-- File: /app/View/Posts/index.ctp -->  
  2.   
  3. <h1>Blog posts</h1>  
  4. <p><?php echo $this->Html->link('Add Post'array('action' => 'add')); ?></p>  
  5. <table>  
  6.     <tr>  
  7.         <th>Id</th>  
  8.         <th>Title</th>  
  9.         <th>Actions</th>  
  10.         <th>Created</th>  
  11.     </tr>  
  12.   
  13. <!-- Here's where we loop through our $posts array, printing out post info -->  
  14.   
  15.     <?php foreach ($posts as $post): ?>  
  16.     <tr>  
  17.         <td><?php echo $post['Post']['id']; ?></td>  
  18.         <td>  
  19.             <?php  
  20.                 echo $this->Html->link(  
  21.                     $post['Post']['title'],  
  22.                     array('action' => 'view'$post['Post']['id'])  
  23.                 );  
  24.             ?>  
  25.         </td>  
  26.         <td>  
  27.             <?php  
  28.                 echo $this->Form->postLink(  
  29.                     'Delete',  
  30.                     array('action' => 'delete'$post['Post']['id']),  
  31.                     array('confirm' => 'Are you sure?')  
  32.                 );  
  33.             ?>  
  34.             <?php  
  35.                 echo $this->Html->link(  
  36.                     'Edit'array('action' => 'edit'$post['Post']['id'])  
  37.                 );  
  38.             ?>  
  39.         </td>  
  40.         <td>  
  41.             <?php echo $post['Post']['created']; ?>  
  42.         </td>  
  43.     </tr>  
  44.     <?php endforeach; ?>  
  45.   
  46. </table>  

使用 postLink() 将创建一个使用JavaScript做一个POST请求来删除我们的post的链接。允许内容使用GET请求来删除是危险的,因为网络爬虫可能不小心删除所有内容。

[php] view plain copy
  1. 该视图的代码还采用了 FormHelper 他们试图删除后,提示用户用一个JavaScript确认对话框。  

路由

对于一些人来说,CakePHP的默认路由不够好。 开发方便用户和通用搜索引擎的兼容,CakePHP的URL映射到具体的行动。所以,我们只是做一个快速变化的路由在本教程中。

有关高级路由技术的更多信息, 请参见 路由配置

默认情况下,CakePHP的响应为您的网站(例如:http://www.example.com)使用PagesController,渲染所谓的“home”视图的请求。相反,我们将创建一个路由规则与我们的PostsController来替换它。

CakePHP的路由是在 /app/Config/routes.php进行配置。 你要注释掉或删除它定义了默认的根路径就行了。它看起来像这样:

[php] view plain copy
  1. Router::connect(  
  2.     '/',  
  3.     array('controller' => 'pages''action' => 'display''home')  
  4. );  

此行的URL'/'使用默认的CakePHP主页连接。我们希望它与我们自己的控制器进行连接,所以更换这一个线:

[php] view plain copy
  1. Router::connect('/'array('controller' => 'posts''action' => 'index'));  

PostsController的index()动作应该连接用户请求'/' 。
[php] view plain copy
  1. CakePHP中还使用“反向路由”。如果有明确的路由,array('controller' => 'posts''action' => 'index')用于生成的URL将是'/'。因此,这是一个好主意,总是使用数组的URL, 因为这意味着你的路由定义,其中一个URL, 并且还确保链接指向同一个地方。  

结论

创建应用使这种方式将为你赢得和平,荣誉,爱情和金钱甚至超越你最疯狂的幻想。很简单,不是吗?请记住,本教程是非常基本的。CakePHP提供有许多的功能,并且是灵活的,我们不希望在这里简单的叙述。 使用本手册的其余部分作为构建功能更丰富的应用指南。

现在,您已经创建了一个基本的CakePHP应用程序,你准备好真实的东西。开始自己的项目并阅读 Cookbook 和 API。

如果您需要帮助,有很多种方法来获得您需要的帮助 - 请参阅 获取帮助页 。 欢迎来到CakePHP!

建议后续阅读

这些都是常见的人学习CakePHP中通常要研究:

  1. 布局: 自定义您的网站布局
  2. 元素: 包含重用视图代码片段
  3. 脚手架: 创建代码之前原型
  4. 代码生成与烘烤:生成基本的CRUD代码
  5. 简单身份验证和授权的应用: 用户身份验证和授权教程

补充阅读

  • 一个典型的CakePHP请求
  • CakePHP的约定
  • CakePHP的文件夹结构

  • CakePHP的结构

原创粉丝点击