cakephp
快速入门
CakePHP的框架为您的应用程序提供了一个强大的基础。它可以处理每一个环节,从用户的初始请求一路到网页的最终渲染。 而且,由于该框架采用MVC的框构,它可以让你轻松定制和扩展你的应用程序。
该框架还提供了一个基本的组织结构,从文件名到数据库表名,让您的整个应用程序一致性和逻辑性。这个概念很简单,但功能强大。按照约定你将更容易的了解如何去组织他们。
体验和学习CakePHP的最好的办法是坐下来建立一些有趣的东西。要开始了,我们将构建一个简单的博客应用程序。
博客教程
欢迎来到CakePHP。 你可能会仔细阅读该教程,因为你想了解更多关于CakePHP是如何工作的。以提高生产率,使编码更有乐趣,这是我们的目标:我们希望当你深入了解到代码,你会看到这一点。
本教程将引导您完成创建一个简单的博客应用程序。我们将获取和安装CakePHP,创建配置数据库和创建应用程逻辑用来显示、添加、编辑、删除博客。
这里就是你需要的:
- 运行Web服务器。 我们假设您将使用Apache做为Web服务器,但使用其他服务器的说明应该是非常相似的。我们可能需要一点点额外的服务器配置,但大多数人可以安装运行CakePHP无需任何配置的。请确保您有PHP5.2.8或更高版本。
- 一个数据库服务器。在本教程中我们将使用mysql服务器。你需要掌握SQL语言,创建一个数据库: 在这里CakePHP将采取一些措施。 因为我们使用的是MySQL,所以我们要确定PHP已经开启pdo_mysql扩展。
- 基本的PHP知识。 更多的使用面像对像程序设计,效果会变的更好:但不要害怕,如果你是一个出色的程序员。
- 最后,你需要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
- /path_to_document_root
- /APP
- /lib
- /plugins
- /vendors
- .htaccess
- index.php
- README
现在是了解CakePHP目录结构的好时机: 检查看CakePHP 文件夹结构一节
tmp目录的权限
接下来我们需要让服务器上的app/tmp目录拥有写权限。 要做到这一点,最好的办法是找出你的web服务器是那个用户运行的。 您可以运行包含<?phpechoexec('whoami');?>的PHP文件在任何Web服务器上。你应该会看到他所打印出的用户名。将app/tmp目录的所有权更改到该用户。 你(在* nix中)运行的最后一个命令可能看起来像这样:
[php]view plaincopy
- $chown-Rwww-dataapp/tmp
如果由于某种原因的CakePHP无法写入该目录,你会看到警告和未捕获的异常"exceptions that cache data cannot be written"。
创建博客数据库
接下来,让我们建立博客基础数据库。 如果你还没有这样做的话,请在本教程中创建使用一个空的数据库,使用您选择的名称。现在,我们只需要建立一个单一的表来存储我们的帖子。我们将新插入几个帖子,用于测试目的。 执行下面的SQL语句到数据库:
[sql]view plaincopy
- /*First,createourpoststable:*/
- CREATETABLEposts(
- idINTUNSIGNEDAUTO_INCREMENTprimarykey,
- titleVARCHAR(50),
- bodyTEXT,
- createdDATETIMEDEFAULTNULL,
- modifiedDATETIMEDEFAULTNULL
- );
- /*Theninsertsomepostsfortesting:*/
- INSERTINTOposts(title,body,created)
- VALUES('Thetitle','Thisisthepostbody.',NOW());
- INSERTINTOposts(title,body,created)
- VALUES('Atitleonceagain','Andthepostbodyfollows.',NOW());
- INSERTINTOposts(title,body,created)
- 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
- public$default=array(
- 'datasource'=>'Database/Mysql',
- 'persistent'=>false,
- 'host'=>'localhost',
- 'port'=>'',
- 'login'=>'cakeBlog',
- 'password'=>'c4k3-rUl3Z',
- 'database'=>'cake_blog_tutorial',
- 'schema'=>'',
- 'prefix'=>'',
- 'encoding'=>'utf8'
- );
一旦你保存到新的database.php文件中, 你应该可以打开浏览器并会看到CakePHP的欢迎页面。它应该会告诉你,你的数据库连接文件被发现,而且CakePHP的可以成功连接到数据库。
[php]view plaincopy
- 请记住,你需要有PDO,并在你的php.ini文件中激活PDO_MYSQL。
可选配置
有可配置一些其它项目。 大多数开发人员可以完成这些清单项目,但他们并不需要这个教程。第一个是安全散列使用定义一个自定义字符串(或“随机”)。第二是定义自定义密码(或“密码种子”),用于加密使用。
安全随机代码用于生成哈希值。修改/app/Config/core.php文件中的Security.salt默认值。替换掉的值要足够长,难以猜测和随机生成你可以把他定议为:
[php]view plaincopy
- /**
- *Arandomstringusedinsecurityhashingmethods.
- */
- configure::write('Security.salt','pl345e-P45s_7h3*S@l7!');
密码种子是用于加密/解密字符串。 通过编辑/app/Config/core.php文件中的Security.cipherSeed的默认值。替换值应该是一个大的随机整数:
[php]view plaincopy
- /**
- *Arandomnumericstring(digitsonly)usedtoencrypt/decryptstrings.
- */
- 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
- classPostextendsAppModel{
- }
CakePHP的命名约定是非常重要的。 将我们的模型命名为 Post, CakePHP可以自动推断出这个模型将在PostsController中使用,并且将被连接到数据库表posts.
[php]view plaincopy
- CakePHP会动态地创建模型对象,如果它不能找到在/app/Model目录中对应的文件。这也意味着,如果你不小心将文件名称写错(例如,post.php或posts.php而不是Post.php),CakePHP的将不承认任何设置,将使用默认值代替。
创建 Posts 控制器
接下来,我们将创建一个控制器,用于我们的posts。该控制器是触发所有与post互动的业务逻辑。概括地说, 他就是控制你的模型或取于它相关的操作。我们把这个新的控制器放在一个名为PostsController.php在/app/Controller目录中。 基本的控制器应该是什么样子:
[php]view plaincopy
- classPostsControllerextendsAppController{
- public$helpers=array('Html','Form');
- }
现在,让我们行动加入到我们的控制器。Action代表了一个应用程序的单一功能或接口。例如,当用户请求 www.example.com/posts/index (这是相同的 www.example.com/posts/), 他们可能希望看到posts的列表。 该操作的代码将看起来像这样:
[php]view plaincopy
- classPostsControllerextendsAppController{
- public$helpers=array('Html','Form');
- publicfunctionindex(){
- $this->set('posts',$this->Post->find('all'));
- }
- }
定议函数index()在 PostsController, 用户可以通过请求www.example.com/posts/index访问业务逻辑。同样的,如果我们定义一个调用的函数foobar(), 用户将能够在 www.example.com/posts/foobar 访问到它。
[php]view plaincopy
- 你可能受到诱惑,命名您的控制器和操作有一定的方法来获得一个特定的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
- //print_r($posts)output:
- Array
- (
- [0]=>Array
- (
- [Post]=>Array
- (
- [id]=>1
- [title]=>Thetitle
- [body]=>Thisisthepostbody.
- [created]=>2008-02-1318:34:55
- [modified]=>
- )
- )
- [1]=>Array
- (
- [Post]=>Array
- (
- [id]=>2
- [title]=>Atitleonceagain
- [body]=>Andthepostbodyfollows.
- [created]=>2008-02-1318:34:56
- [modified]=>
- )
- )
- [2]=>Array
- (
- [Post]=>Array
- (
- [id]=>3
- [title]=>Titlestrikesback
- [body]=>Thisisreallyexciting!Not.
- [created]=>2008-02-1318:34:57
- [modified]=>
- )
- )
- )
CakePHP的视图文件存放在/app/View于其相应的控制器命名的文件夹内。 (在这种情况下我们将要创建一个名为,“Posts”文件夹。) 要格式化这个post数据到一个很好的表格,视图代码可能会是这个样子:
[php]view plaincopy
- <!--File:/app/View/Posts/index.ctp-->
- <h1>Blogposts</h1>
- <table>
- <tr>
- <th>Id</th>
- <th>Title</th>
- <th>Created</th>
- </tr>
- <!--Hereiswhereweloopthroughour$postsarray,printingoutpostinfo-->
- <?phpforeach($postsas$post):?>
- <tr>
- <td><?phpecho$post['Post']['id'];?></td>
- <td>
- <?phpecho$this->Html->link($post['Post']['title'],
- array('controller'=>'posts','action'=>'view',$post['Post']['id']));?>
- </td>
- <td><?phpecho$post['Post']['created'];?></td>
- </tr>
- <?phpendforeach;?>
- <?phpunset($post);?>
- </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
- //File:/app/Controller/PostsController.php
- classPostsControllerextendsAppController{
- public$helpers=array('Html','Form');
- publicfunctionindex(){
- $this->set('posts',$this->Post->find('all'));
- }
- publicfunctionview($id=null){
- if(!$id){
- thrownewnotfoundException(__('Invalidpost'));
- }
- $post=$this->Post->findById($id);
- if(!$post){
- thrownewNotFoundException(__('Invalidpost'));
- }
- $this->set('post',$post);
- }
- }
对于set()调用应该很熟悉。我们使用findById()而不是使用find('all')因为我们只想要一个岗位的信息公告。
请注意,我们的视图动作需要一个参数:我们希望看到的postID。 此参数是通过URL请求的传递给具体的动作。如果一个用户请求/posts/view/3,则该值'3'是传递给$ID。
我们也做了一点错误检查以确保用户实际访问的记录。如果一个用户请求/posts/view, 我们将抛出NotFoundException和 CakePHP ERRORhandler。 我们也进行了类似的检查,以确保用户访问一个存在的记录。
现在让我们来创建视图为我们新的'视图',并将其放置在/app/View/Posts/view.ctp
[php]view plaincopy
- <!--File:/app/View/Posts/view.ctp-->
- <h1><?phpechoh($post['Post']['title']);?></h1>
- <p><small>Created:<?phpecho$post['Post']['created'];?></small></p>
- <p><?phpechoh($post['Post']['body']);?></p>
通过链接/posts/index或手动输入/posts/view/1来验证他们是否能够正常工作。
添加 Posts
从数据库中读取,并显示我们的posts是一个很好的开始,但是让我们允许增加新的posts。
首先,先在PostsController中创建add()动作:
[php]view plaincopy
- classPostsControllerextendsAppController{
- public$helpers=array('Html','Form','session');
- public$components=array('Session');
- publicfunctionindex(){
- $this->set('posts',$this->Post->find('all'));
- }
- publicfunctionview($id){
- if(!$id){
- thrownewNotFoundException(__('Invalidpost'));
- }
- $post=$this->Post->findById($id);
- if(!$post){
- thrownewNotFoundException(__('Invalidpost'));
- }
- $this->set('post',$post);
- }
- publicfunctionadd(){
- if($this->request->is('post')){
- $this->Post->create();
- if($this->Post->save($this->request->data)){
- $this->Session->setFlash(__('Yourposthasbeensaved.'));
- return$this->redirect(array('action'=>'index'));
- }
- $this->Session->setFlash(__('Unabletoaddyourpost.'));
- }
- }
- }
[php]view plaincopy
- $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
- 你需要引用SessionComponent和SessionHelper在任何控制器中你都会使用到它们。如果有必要,将它包含在您的AppController。
每一个 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
- <!--File:/app/View/Posts/add.ctp-->
- <h1>AddPost</h1>
- <?php
- echo$this->Form->create('Post');
- echo$this->Form->input('title');
- echo$this->Form->input('body',array('rows'=>'3'));
- echo$this->Form->end('SavePost');
- ?>
我们使用 FormHelper 生成一个HTML表单的标记。下面是t$this->Form->create()方法生成的HMTL。
[php]view plaincopy
- <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
- <?phpecho$this->Html->link(
- 'AddPost',
- array('controller'=>'posts','action'=>'add')
- );?>
您可能想知道:我该如何告诉CakePHP我的验证要求? 验证规则在模型中定义。让我们回头看看我们的Post模型并作一些调整:
[php]view plaincopy
- classPostextendsAppModel{
- public$validate=array(
- 'title'=>array(
- 'rule'=>'notempty'
- ),
- 'body'=>array(
- 'rule'=>'notEmpty'
- )
- );
- }
$validate数组告诉CakePHP 调用save()方法时如何验证数据。 在这里我指定,无论是boy和title字段不能为空。 CakePHP的验证引擎是强大的,关于内置规则 (信用卡号码,电子邮件地址等。) 和灵活性,添加您自己的验证规则。 For more 欲了解更多信息请查看数据验证。
现在,用你自已的验证规则取代现有规则,让应用程序试图用一个空标题或正文,看看它是如何工作添加一个职位。 由于我们使用FormHelper::input()方法让 FormHelper 来创建我们的表单元素。 我们的验证错误信息将自动显示。
编辑 Posts
Post 编辑: 在这里,我们走。你是一个专业的CakePHP,所以你应该有回升的格局。 然后在视图制作动作。 这里的PostsControlleredit()动作看起来如下:
[php]view plaincopy
- publicfunctionedit($id=null){
- if(!$id){
- thrownewNotFoundException(__('Invalidpost'));
- }
- $post=$this->Post->findById($id);
- if(!$post){
- thrownewNotFoundException(__('Invalidpost'));
- }
- if($this->request->is(array('post','put'))){
- $this->Post->id=$id;
- if($this->Post->save($this->request->data)){
- $this->Session->setFlash(__('Yourposthasbeenupdated.'));
- return$this->redirect(array('action'=>'index'));
- }
- $this->Session->setFlash(__('Unabletoupdateyourpost.'));
- }
- if(!$this->request->data){
- $this->request->data=$post;
- }
- }
这个动作首先确保用户试图访问一个现有的记录。如果他们在$id参数上没有通过, 或该post不存在,我们抛出一个NotFoundException为 CakePHP ErrorHandler 来处理。
下一步的动作会检查该请求是POST或PUT。 如果是,那么我们使用POST数据来更新我们的记录后,如果被排斥,将显示用户验证错误。
如果没有数据设置为$this->request->data, 我们只需将其设置为先前检索post。
编辑视图可能看起来像这样:
[php]view plaincopy
- <!--File:/app/View/Posts/edit.ctp-->
- <h1>EditPost</h1>
- <?php
- echo$this->Form->create('Post');
- echo$this->Form->input('title');
- echo$this->Form->input('body',array('rows'=>'3'));
- echo$this->Form->input('id',array('type'=>'hidden'));
- echo$this->Form->end('SavePost');
- ?>
视图输出编辑表单(与填充值),以及所有需要验证错误消息。
有一点需要注意: CakePHP会假设你正在编辑一个模型,如果'id'字段存在数组中的数据。如果没有'id'存在 (回头看看我们的附加视图),CakePHP会假设你要插入一个新的模型时save()方法会被调用。
现在,您可以更新您的Index视图链接到编辑具体的post:
[php]view plaincopy
- <!--File:/app/View/Posts/index.ctp(editlinksadded)-->
- <h1>Blogposts</h1>
- <p><?phpecho$this->Html->link("AddPost",array('action'=>'add'));?></p>
- <table>
- <tr>
- <th>Id</th>
- <th>Title</th>
- <th>Action</th>
- <th>Created</th>
- </tr>
- <!--Here'swhereweloopthroughour$postsarray,printingoutpostinfo-->
- <?phpforeach($postsas$post):?>
- <tr>
- <td><?phpecho$post['Post']['id'];?></td>
- <td>
- <?php
- echo$this->Html->link(
- $post['Post']['title'],
- array('action'=>'view',$post['Post']['id'])
- );
- ?>
- </td>
- <td>
- <?php
- echo$this->Html->link(
- 'Edit',
- array('action'=>'edit',$post['Post']['id'])
- );
- ?>
- </td>
- <td>
- <?phpecho$post['Post']['created'];?>
- </td>
- </tr>
- <?phpendforeach;?>
- </table>
删除 Posts
接下来,让我们做一个方式为用户删除post。 开始在PostsController中创建delete()动作:
[php]view plaincopy
- publicfunctiondelete($id){
- if($this->request->is('get')){
- thrownewMethodNotAllowedException();
- }
- if($this->Post->delete($id)){
- $this->Session->setFlash(
- __('Thepostwithid:%shasbeendeleted.',h($id))
- );
- return$this->redirect(array('action'=>'index'));
- }
- }
这种逻辑删除由$ id指定的post,并使用$this->Session->setFlash()重定向它们到/posts显示一些息。如果用户试图使用一个GET请求做一个删除,我们抛出一个异常。 未捕获的异常由CakePHP的异常处理程序捕获,并显示一个友好的错误页面。 有许多内置的的异常,可以用来表示各种HTTP错误您的应用程序可能需要生成。
因为我们只是执行一些逻辑和重定向,这个动作没有视图。你可能需要更新 Index 视图的链接,使用户可以删除post,但是:
[php]view plaincopy
- <!--File:/app/View/Posts/index.ctp-->
- <h1>Blogposts</h1>
- <p><?phpecho$this->Html->link('AddPost',array('action'=>'add'));?></p>
- <table>
- <tr>
- <th>Id</th>
- <th>Title</th>
- <th>Actions</th>
- <th>Created</th>
- </tr>
- <!--Here'swhereweloopthroughour$postsarray,printingoutpostinfo-->
- <?phpforeach($postsas$post):?>
- <tr>
- <td><?phpecho$post['Post']['id'];?></td>
- <td>
- <?php
- echo$this->Html->link(
- $post['Post']['title'],
- array('action'=>'view',$post['Post']['id'])
- );
- ?>
- </td>
- <td>
- <?php
- echo$this->Form->postLink(
- 'Delete',
- array('action'=>'delete',$post['Post']['id']),
- array('confirm'=>'Areyousure?')
- );
- ?>
- <?php
- echo$this->Html->link(
- 'Edit',array('action'=>'edit',$post['Post']['id'])
- );
- ?>
- </td>
- <td>
- <?phpecho$post['Post']['created'];?>
- </td>
- </tr>
- <?phpendforeach;?>
- </table>
使用postLink()将创建一个使用JavaScript做一个POST请求来删除我们的post的链接。允许内容使用GET请求来删除是危险的,因为网络爬虫可能不小心删除所有内容。
[php]view plaincopy
- 该视图的代码还采用了FormHelper他们试图删除后,提示用户用一个JavaScript确认对话框。
路由
对于一些人来说,CakePHP的默认路由不够好。 开发方便用户和通用搜索引擎的兼容,CakePHP的URL映射到具体的行动。所以,我们只是做一个快速变化的路由在本教程中。
有关高级路由技术的更多信息, 请参见路由配置。
默认情况下,CakePHP的响应为您的网站(例如:http://www.example.com)使用PagesController,渲染所谓的“home”视图的请求。相反,我们将创建一个路由规则与我们的PostsController来替换它。
CakePHP的路由是在/app/Config/routes.php进行配置。 你要注释掉或删除它定义了默认的根路径就行了。它看起来像这样:
[php]view plaincopy
- Router::connect(
- '/',
- array('controller'=>'pages','action'=>'display','home')
- );
此行的URL'/'使用默认的CakePHP主页连接。我们希望它与我们自己的控制器进行连接,所以更换这一个线:
[php]view plaincopy
- Router::connect('/',array('controller'=>'posts','action'=>'index'));
PostsController的index()动作应该连接用户请求'/'。
[php]view plaincopy
- CakePHP中还使用“反向路由”。如果有明确的路由,array('controller'=>'posts','action'=>'index')用于生成的URL将是'/'。因此,这是一个好主意,总是使用数组的URL,因为这意味着你的路由定义,其中一个URL,并且还确保链接指向同一个地方。
结论
创建应用使这种方式将为你赢得和平,荣誉,爱情和金钱甚至超越你最疯狂的幻想。很简单,不是吗?请记住,本教程是非常基本的。CakePHP提供有许多的功能,并且是灵活的,我们不希望在这里简单的叙述。 使用本手册的其余部分作为构建功能更丰富的应用指南。
现在,您已经创建了一个基本的CakePHP应用程序,你准备好真实的东西。开始自己的项目并阅读Cookbook和API。
如果您需要帮助,有很多种方法来获得您需要的帮助 - 请参阅获取帮助页。 欢迎来到CakePHP!
建议后续阅读
这些都是常见的人学习CakePHP中通常要研究:
- 布局: 自定义您的网站布局
- 元素: 包含重用视图代码片段
- 脚手架: 创建代码之前原型
- 代码生成与烘烤:生成基本的CRUD代码
- 简单身份验证和授权的应用: 用户身份验证和授权教程
补充阅读
- 一个典型的CakePHP请求
- CakePHP的约定
- CakePHP的文件夹结构
- CakePHP的结构