必威体育Betway必威体育官网
当前位置:首页 > IT技术

CakePHP快速入门

时间:2019-09-18 00:11:04来源:IT技术作者:seo实验室小编阅读:51次「手机版」
 

cakephp

快速入门

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.gitclonegit://github.com/cakephp/cakephp.git

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

[php]view plaincopy

  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服务器是那个用户运行的。 您可以运行包含<?phpechoexec('whoami');?>的PHP文件在任何Web服务器上。你应该会看到他所打印出的用户名。将app/tmp目录的所有权更改到该用户。 你(在* nix中)运行的最后一个命令可能看起来像这样:

[php]view plaincopy

  1. $chown-Rwww-dataapp/tmp

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

创建博客数据库

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

[sql]view plaincopy

  1. /*First,createourpoststable:*/
  2. CREATETABLEposts(
  3. idINTUNSIGNEDAUTO_INCREMENTprimarykey,
  4. titleVARCHAR(50),
  5. bodyTEXT,
  6. createdDATETIMEDEFAULTNULL,
  7. modifiedDATETIMEDEFAULTNULL
  8. );
  9. /*Theninsertsomepostsfortesting:*/
  10. INSERTINTOposts(title,body,created)
  11. VALUES('Thetitle','Thisisthepostbody.',NOW());
  12. INSERTINTOposts(title,body,created)
  13. VALUES('Atitleonceagain','Andthepostbodyfollows.',NOW());
  14. INSERTINTOposts(title,body,created)
  15. VALUES('Titlestrikesback','Thisisreallyexciting!Not.',NOW());

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

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

CakePHP的数据库配置

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

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

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

[php]view plaincopy

  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 plaincopy

  1. 请记住,你需要有PDO,并在你的php.ini文件中激活PDO_MYSQL。

可选配置

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

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

[php]view plaincopy

  1. /**
  2. *Arandomstringusedinsecurityhashingmethods.
  3. */
  4. configure::write('Security.salt','pl345e-P45s_7h3*S@l7!');

密码种子是用于加密/解密字符串。 通过编辑/app/Config/core.php文件中的Security.cipherSeed的默认值。替换值应该是一个大的随机整数:

[php]view plaincopy

  1. /**
  2. *Arandomnumericstring(digitsonly)usedtoencrypt/decryptstrings.
  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 plaincopy

  1. classPostextendsAppModel{
  2. }

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

[php]view plaincopy

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

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

创建 Posts 控制器

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

[php]view plaincopy

  1. classPostsControllerextendsAppController{
  2. public$helpers=array('Html','Form');
  3. }

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

[php]view plaincopy

  1. classPostsControllerextendsAppController{
  2. public$helpers=array('Html','Form');
  3. publicfunctionindex(){
  4. $this->set('posts',$this->Post->find('all'));
  5. }
  6. }

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

[php]view plaincopy

  1. 你可能受到诱惑,命名您的控制器和操作有一定的方法来获得一个特定的URL。抵制这种诱惑。遵循CakePHP的约定(大小写,复数名称等),并创建可读的,可以理解的动作名称。您可以使用覆盖后的“<spanstyle="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 plaincopy

  1. //print_r($posts)output:
  2. Array
  3. (
  4. [0]=>Array
  5. (
  6. [Post]=>Array
  7. (
  8. [id]=>1
  9. [title]=>Thetitle
  10. [body]=>Thisisthepostbody.
  11. [created]=>2008-02-1318:34:55
  12. [modified]=>
  13. )
  14. )
  15. [1]=>Array
  16. (
  17. [Post]=>Array
  18. (
  19. [id]=>2
  20. [title]=>Atitleonceagain
  21. [body]=>Andthepostbodyfollows.
  22. [created]=>2008-02-1318:34:56
  23. [modified]=>
  24. )
  25. )
  26. [2]=>Array
  27. (
  28. [Post]=>Array
  29. (
  30. [id]=>3
  31. [title]=>Titlestrikesback
  32. [body]=>Thisisreallyexciting!Not.
  33. [created]=>2008-02-1318:34:57
  34. [modified]=>
  35. )
  36. )
  37. )

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

[php]view plaincopy

  1. <!--File:/app/View/Posts/index.ctp-->
  2. <h1>Blogposts</h1>
  3. <table>
  4. <tr>
  5. <th>Id</th>
  6. <th>Title</th>
  7. <th>Created</th>
  8. </tr>
  9. <!--Hereiswhereweloopthroughour$postsarray,printingoutpostinfo-->
  10. <?phpforeach($postsas$post):?>
  11. <tr>
  12. <td><?phpecho$post['Post']['id'];?></td>
  13. <td>
  14. <?phpecho$this->Html->link($post['Post']['title'],
  15. array('controller'=>'posts','action'=>'view',$post['Post']['id']));?>
  16. </td>
  17. <td><?phpecho$post['Post']['created'];?></td>
  18. </tr>
  19. <?phpendforeach;?>
  20. <?phpunset($post);?>
  21. </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 plaincopy

  1. //File:/app/Controller/PostsController.php
  2. classPostsControllerextendsAppController{
  3. public$helpers=array('Html','Form');
  4. publicfunctionindex(){
  5. $this->set('posts',$this->Post->find('all'));
  6. }
  7. publicfunctionview($id=null){
  8. if(!$id){
  9. thrownewnotfoundException(__('Invalidpost'));
  10. }
  11. $post=$this->Post->findById($id);
  12. if(!$post){
  13. thrownewNotFoundException(__('Invalidpost'));
  14. }
  15. $this->set('post',$post);
  16. }
  17. }

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

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

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

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

[php]view plaincopy

  1. <!--File:/app/View/Posts/view.ctp-->
  2. <h1><?phpechoh($post['Post']['title']);?></h1>
  3. <p><small>Created:<?phpecho$post['Post']['created'];?></small></p>
  4. <p><?phpechoh($post['Post']['body']);?></p>

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

添加 Posts

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

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

[php]view plaincopy

  1. classPostsControllerextendsAppController{
  2. public$helpers=array('Html','Form','session');
  3. public$components=array('Session');
  4. publicfunctionindex(){
  5. $this->set('posts',$this->Post->find('all'));
  6. }
  7. publicfunctionview($id){
  8. if(!$id){
  9. thrownewNotFoundException(__('Invalidpost'));
  10. }
  11. $post=$this->Post->findById($id);
  12. if(!$post){
  13. thrownewNotFoundException(__('Invalidpost'));
  14. }
  15. $this->set('post',$post);
  16. }
  17. publicfunctionadd(){
  18. if($this->request->is('post')){
  19. $this->Post->create();
  20. if($this->Post->save($this->request->data)){
  21. $this->Session->setFlash(__('Yourposthasbeensaved.'));
  22. return$this->redirect(array('action'=>'index'));
  23. }
  24. $this->Session->setFlash(__('Unabletoaddyourpost.'));
  25. }
  26. }
  27. }

[php]view plaincopy

  1. $this->request->is()接受一个参数,它可以是请求方法(GET,PUT,POST,DELETE)或一些请求标识符(AJAX)。它不是一种来检查特定发布的数据<spanstyle="font-family:Arial;">方法</span><spanstyle="font-family:Arial;">。例如,$this->request->is('book')如果book的数据被发布不会返回true。</span>

[php]view plaincopy

  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 plaincopy

  1. <!--File:/app/View/Posts/add.ctp-->
  2. <h1>AddPost</h1>
  3. <?php
  4. echo$this->Form->create('Post');
  5. echo$this->Form->input('title');
  6. echo$this->Form->input('body',array('rows'=>'3'));
  7. echo$this->Form->end('SavePost');
  8. ?>

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

[php]view plaincopy

  1. <formid="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 plaincopy

  1. <?phpecho$this->Html->link(
  2. 'AddPost',
  3. array('controller'=>'posts','action'=>'add')
  4. );?>

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

[php]view plaincopy

  1. classPostextendsAppModel{
  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,所以你应该有回升的格局。 然后在视图制作动作。 这里的PostsControlleredit()动作看起来如下:

[php]view plaincopy

  1. publicfunctionedit($id=null){
  2. if(!$id){
  3. thrownewNotFoundException(__('Invalidpost'));
  4. }
  5. $post=$this->Post->findById($id);
  6. if(!$post){
  7. thrownewNotFoundException(__('Invalidpost'));
  8. }
  9. if($this->request->is(array('post','put'))){
  10. $this->Post->id=$id;
  11. if($this->Post->save($this->request->data)){
  12. $this->Session->setFlash(__('Yourposthasbeenupdated.'));
  13. return$this->redirect(array('action'=>'index'));
  14. }
  15. $this->Session->setFlash(__('Unabletoupdateyourpost.'));
  16. }
  17. if(!$this->request->data){
  18. $this->request->data=$post;
  19. }
  20. }

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

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

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

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

[php]view plaincopy

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

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

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

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

[php]view plaincopy

  1. <!--File:/app/View/Posts/index.ctp(editlinksadded)-->
  2. <h1>Blogposts</h1>
  3. <p><?phpecho$this->Html->link("AddPost",array('action'=>'add'));?></p>
  4. <table>
  5. <tr>
  6. <th>Id</th>
  7. <th>Title</th>
  8. <th>Action</th>
  9. <th>Created</th>
  10. </tr>
  11. <!--Here'swhereweloopthroughour$postsarray,printingoutpostinfo-->
  12. <?phpforeach($postsas$post):?>
  13. <tr>
  14. <td><?phpecho$post['Post']['id'];?></td>
  15. <td>
  16. <?php
  17. echo$this->Html->link(
  18. $post['Post']['title'],
  19. array('action'=>'view',$post['Post']['id'])
  20. );
  21. ?>
  22. </td>
  23. <td>
  24. <?php
  25. echo$this->Html->link(
  26. 'Edit',
  27. array('action'=>'edit',$post['Post']['id'])
  28. );
  29. ?>
  30. </td>
  31. <td>
  32. <?phpecho$post['Post']['created'];?>
  33. </td>
  34. </tr>
  35. <?phpendforeach;?>
  36. </table>

删除 Posts

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

[php]view plaincopy

  1. publicfunctiondelete($id){
  2. if($this->request->is('get')){
  3. thrownewMethodNotAllowedException();
  4. }
  5. if($this->Post->delete($id)){
  6. $this->Session->setFlash(
  7. __('Thepostwithid:%shasbeendeleted.',h($id))
  8. );
  9. return$this->redirect(array('action'=>'index'));
  10. }
  11. }

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

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

[php]view plaincopy

  1. <!--File:/app/View/Posts/index.ctp-->
  2. <h1>Blogposts</h1>
  3. <p><?phpecho$this->Html->link('AddPost',array('action'=>'add'));?></p>
  4. <table>
  5. <tr>
  6. <th>Id</th>
  7. <th>Title</th>
  8. <th>Actions</th>
  9. <th>Created</th>
  10. </tr>
  11. <!--Here'swhereweloopthroughour$postsarray,printingoutpostinfo-->
  12. <?phpforeach($postsas$post):?>
  13. <tr>
  14. <td><?phpecho$post['Post']['id'];?></td>
  15. <td>
  16. <?php
  17. echo$this->Html->link(
  18. $post['Post']['title'],
  19. array('action'=>'view',$post['Post']['id'])
  20. );
  21. ?>
  22. </td>
  23. <td>
  24. <?php
  25. echo$this->Form->postLink(
  26. 'Delete',
  27. array('action'=>'delete',$post['Post']['id']),
  28. array('confirm'=>'Areyousure?')
  29. );
  30. ?>
  31. <?php
  32. echo$this->Html->link(
  33. 'Edit',array('action'=>'edit',$post['Post']['id'])
  34. );
  35. ?>
  36. </td>
  37. <td>
  38. <?phpecho$post['Post']['created'];?>
  39. </td>
  40. </tr>
  41. <?phpendforeach;?>
  42. </table>

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

[php]view plaincopy

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

路由

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

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

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

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

[php]view plaincopy

  1. Router::connect(
  2. '/',
  3. array('controller'=>'pages','action'=>'display','home')
  4. );

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

[php]view plaincopy

  1. Router::connect('/',array('controller'=>'posts','action'=>'index'));

PostsController的index()动作应该连接用户请求'/'。

[php]view plaincopy

  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的结构

相关阅读

分享到:

栏目导航

推荐阅读

热门阅读