快速入门

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目录中。 一旦完成,你的目录设置看起来应该像下面这样:

/path_to_document_root/app/lib/plugins/vendors.htaccessindex.phpREADME

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

tmp目录的权限

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

$ chown -R www-data app/tmp

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

创建博客数据库

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

/* First, create our posts table: */
CREATE TABLE posts (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,title VARCHAR(50),body TEXT,created DATETIME DEFAULT NULL,modified DATETIME DEFAULT NULL
);/* Then insert some posts for testing: */
INSERT INTO posts (title,body,created)VALUES ('The title', 'This is the post body.', NOW());
INSERT INTO posts (title,body,created)VALUES ('A title once again', 'And the post body follows.', NOW());
INSERT INTO posts (title,body,created)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 数组与那些适用于您的安装的值。例如完成配置数组可能看起来像下面这样:

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的可以成功连接到数据库。

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

可选配置

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

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

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

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

/*** A random numeric string (digits only) used to encrypt/decrypt strings.*/
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。 已完成的文件应该是这样的:

class Post extends AppModel {
}

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

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

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

创建 Posts 控制器

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

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

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

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

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

你可能受到诱惑,命名您的控制器和操作有一定的方法来获得一个特定的URL。 抵制这种诱惑。 遵循CakePHP的约定(大小写,复数名称等),并创建可读的, 可以理解的动作名称。 您可以使用覆盖后的“routes”URL映射到你的代码。

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

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

创建 Post 视图

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

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

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

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

// print_r($posts) output:Array
([0] => Array([Post] => Array([id] => 1[title] => The title[body] => This is the post body.[created] => 2008-02-13 18:34:55[modified] =>))[1] => Array([Post] => Array([id] => 2[title] => A title once again[body] => And the post body follows.[created] => 2008-02-13 18:34:56[modified] =>))[2] => Array([Post] => Array([id] => 3[title] => Title strikes back[body] => This is really exciting! Not.[created] => 2008-02-13 18:34:57[modified] =>))
)

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

<!-- File: /app/View/Posts/index.ctp --><h1>Blog posts</h1>
<table><tr><th>Id</th><th>Title</th><th>Created</th></tr><!-- Here is where we loop through our $posts array, printing out post info --><?php foreach ($posts as $post): ?><tr><td><?php echo $post['Post']['id']; ?></td><td><?php echo $this->Html->link($post['Post']['title'],
array('controller' => 'posts', 'action' => 'view', $post['Post']['id'])); ?></td><td><?php echo $post['Post']['created']; ?></td></tr><?php endforeach; ?><?php unset($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 创建它:

// File: /app/Controller/PostsController.php
class PostsController extends AppController {public $helpers = array('Html', 'Form');public function index() {$this->set('posts', $this->Post->find('all'));}public function view($id = null) {if (!$id) {throw new NotFoundException(__('Invalid post'));}$post = $this->Post->findById($id);if (!$post) {throw new NotFoundException(__('Invalid post'));}$this->set('post', $post);}
}

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

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

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

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

<!-- File: /app/View/Posts/view.ctp --><h1><?php echo h($post['Post']['title']); ?></h1><p><small>Created: <?php echo $post['Post']['created']; ?></small></p><p><?php echo h($post['Post']['body']); ?></p>

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

添加 Posts

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

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

class PostsController extends AppController {public $helpers = array('Html', 'Form', 'Session');public $components = array('Session');public function index() {$this->set('posts', $this->Post->find('all'));}public function view($id) {if (!$id) {throw new NotFoundException(__('Invalid post'));}$post = $this->Post->findById($id);if (!$post) {throw new NotFoundException(__('Invalid post'));}$this->set('post', $post);}public function add() {if ($this->request->is('post')) {$this->Post->create();if ($this->Post->save($this->request->data)) {$this->Session->setFlash(__('Your post has been saved.'));return $this->redirect(array('action' => 'index'));}$this->Session->setFlash(__('Unable to add your post.'));}}
}
$this->request->is() 接受一个参数,它可以是请求方法(GET,PUT,POST,DELETE)或一些请求标识符(AJAX)。 它不是一种来检查特定发布的数据方法。例如,$this->request->is('book')如果book的数据被发布不会返回true。
你需要引用 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

下面是我们添加的视图:

<!-- File: /app/View/Posts/add.ctp --><h1>Add Post</h1>
<?php
echo $this->Form->create('Post');
echo $this->Form->input('title');
echo $this->Form->input('body', array('rows' => '3'));
echo $this->Form->end('Save Post');
?>

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

<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 echo $this->Html->link('Add Post',array('controller' => 'posts', 'action' => 'add')
); ?>

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

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

public function edit($id = null) {if (!$id) {throw new NotFoundException(__('Invalid post'));}$post = $this->Post->findById($id);if (!$post) {throw new NotFoundException(__('Invalid post'));}if ($this->request->is(array('post', 'put'))) {$this->Post->id = $id;if ($this->Post->save($this->request->data)) {$this->Session->setFlash(__('Your post has been updated.'));return $this->redirect(array('action' => 'index'));}$this->Session->setFlash(__('Unable to update your post.'));}if (!$this->request->data) {$this->request->data = $post;}
}

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

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

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

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

<!-- File: /app/View/Posts/edit.ctp --><h1>Edit Post</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('Save Post');
?>

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

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

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

<!-- File: /app/View/Posts/index.ctp  (edit links added) --><h1>Blog posts</h1>
<p><?php echo $this->Html->link("Add Post", array('action' => 'add')); ?></p>
<table><tr><th>Id</th><th>Title</th><th>Action</th><th>Created</th></tr><!-- Here's where we loop through our $posts array, printing out post info --><?php foreach ($posts as $post): ?><tr><td><?php echo $post['Post']['id']; ?></td><td><?phpecho $this->Html->link($post['Post']['title'],array('action' => 'view', $post['Post']['id']));?></td><td><?phpecho $this->Html->link('Edit',array('action' => 'edit', $post['Post']['id']));?></td><td><?php echo $post['Post']['created']; ?></td></tr>
<?php endforeach; ?></table>

删除 Posts

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

public function delete($id) {if ($this->request->is('get')) {throw new MethodNotAllowedException();}if ($this->Post->delete($id)) {$this->Session->setFlash(__('The post with id: %s has been deleted.', h($id)));return $this->redirect(array('action' => 'index'));}
}

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

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

<!-- File: /app/View/Posts/index.ctp --><h1>Blog posts</h1>
<p><?php echo $this->Html->link('Add Post', array('action' => 'add')); ?></p>
<table><tr><th>Id</th><th>Title</th><th>Actions</th><th>Created</th></tr><!-- Here's where we loop through our $posts array, printing out post info --><?php foreach ($posts as $post): ?><tr><td><?php echo $post['Post']['id']; ?></td><td><?phpecho $this->Html->link($post['Post']['title'],array('action' => 'view', $post['Post']['id']));?></td><td><?phpecho $this->Form->postLink('Delete',array('action' => 'delete', $post['Post']['id']),array('confirm' => 'Are you sure?'));?><?phpecho $this->Html->link('Edit', array('action' => 'edit', $post['Post']['id']));?></td><td><?php echo $post['Post']['created']; ?></td></tr><?php endforeach; ?></table>

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

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

路由

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

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

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

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

Router::connect('/',array('controller' => 'pages', 'action' => 'display', 'home')
);

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

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

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

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

CakePHP快速入门相关推荐

  1. CAKEPHP 快速入门

    快速入门¶ 实战是学习以及体验 CakePHP 的最好途径. 让我们以开发一个内容管理系统(CMS)为例,来学习 CakePHP. 內容管理系統教程 此教程将讲述如何建立一个简单的 CMS. 首先我们 ...

  2. 第1讲韩顺平 PHP视频教程 zend framework zend介绍 zend快速入门 韩顺平php视频教程ppt 笔记心得

    韩顺平 PHP视频教程  zend framework  PPT笔记心得 本教程贯穿了两个软件公司常用的两个项目,数据采集系统和购物车,共分20讲从本质上深入浅出的分析了zend framework运 ...

  3. Shiro第一个程序:官方快速入门程序Qucickstart详解教程

    目录 一.下载解压 二.第一个Shiro程序 1. 导入依赖 2. 配置shiro配置文件 3. Quickstart.java 4. 启动测试 三.shiro.ini分析 四.Quickstart. ...

  4. 计算机入门新人必学,异世修真人怎么玩?新手快速入门必备技巧

    异世修真人怎么快速入门?最近新出来的一款文字修仙游戏,很多萌新不知道怎么玩?进小编给大家带来了游戏新手快速入门技巧攻略,希望可以帮到大家. 新手快速入门攻略 1.开局出来往下找婆婆,交互给点钱,旁边有 ...

  5. Spring Boot 2 快速教程:WebFlux 快速入门(二)

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘 ...

  6. Apache Hive 快速入门 (CentOS 7.3 + Hadoop-2.8 + Hive-2.1.1)

    2019独角兽企业重金招聘Python工程师标准>>> 本文节选自<Netkiller Database 手札> 第 63 章 Apache Hive 目录 63.1. ...

  7. 《iOS9开发快速入门》——导读

    本节书摘来自异步社区<iOS9开发快速入门>一书中的目录,作者 刘丽霞 , 邱晓华,更多章节内容可以访问云栖社区"异步社区"公众号查看 目 录 前 言 第1章 iOS ...

  8. BIML 101 - ETL数据清洗 系列 - BIML 快速入门教程 - 序

    BIML 101 - BIML 快速入门教程 做大数据的项目,最花时间的就是数据清洗. 没有一个相对可靠的数据,数据分析就是无木之舟,无水之源. 如果你已经进了ETL这个坑,而且预算有限,并且有大量的 ...

  9. python scrapy菜鸟教程_scrapy学习笔记(一)快速入门

    安装Scrapy Scrapy是一个高级的Python爬虫框架,它不仅包含了爬虫的特性,还可以方便的将爬虫数据保存到csv.json等文件中. 首先我们安装Scrapy. pip install sc ...

最新文章

  1. Matlab R2018a版离线使用帮助文档方法
  2. SAP UI5 应用启动(bootstrap)过程单步调试
  3. JavaOne演讲者选择了您不应该错过的10个会话
  4. 1.ELF之Elf Header
  5. 论文浅尝 | Dynamic Weighted Majority for Incremental Learning
  6. java list e 查找_源码(04) -- java.util.ListE
  7. java面试要点---Spring体系知识点复习,IOC,AOP---随时更新
  8. OpenCV精进之路(零):core组件——Mat和IplImage访问像素的方法总结
  9. 局域网ip冲突检测工具_“网络工程师培训”基础教程五:局域网
  10. Dapper使用在WCF上总是说Service找不到
  11. 深度神经网络训练过程中为什么验证集上波动很大_一个值得深思的问题?为什么验证集的loss会小于训练集的loss...
  12. 选择所在城市html按字母,移动端根据字母定位到指定的城市【原创】
  13. mysql proxy maxscale_MaxScale: 一个用于解决MySQL扩展性的新工具(译)
  14. 【Transformer论文模型细致讲解】
  15. 通过调用百度生成短连接API接口,将长链接转换成短链接,并且生成短网址并返回,用户可以通过短连接访问,然后浏览器会解析跳转至长链接地址,有效的解决用户修改url后面的参数
  16. 重装系统后计算机无法启动,重装系统后电脑为什么启动不了?云骑士告诉你怎么办?...
  17. Chapter 12 设计概念
  18. ubuntu 关闭系统自动更新
  19. 【游戏设计模式】之四 《游戏编程模式》全书内容提炼总结
  20. 管理经济分析01:博弈论与经济学

热门文章

  1. 【开关】刀开关矩阵(Pole Switched Matrix)的结构讨论
  2. 2021投资大复盘】上个月年化收益50%,这个月到今天54%了,也在今天封盘了,来年我们再战江湖【配图版】
  3. 六轴机械臂DIY(四)机械模型重建及DH法建模
  4. 硕士如何打造一份靓丽的简历
  5. ES6学习笔记(九)
  6. 少儿思维导图怎样绘制简单
  7. Java中Array.sort()的几种用法[转]
  8. ghost11还原linux,Ubuntu 11.04在有一键GHOST的Windows XP系统上的安装
  9. 开心截图,拖拽大作战
  10. 抖音html 3d旋转扩大图片数量,抖音怎么上传高清照片 抖音多张图片怎么上传