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版本

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

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

/path_to_document_root
    /app
    /lib
    /plugins
    /vendors
    .htaccess
    index.php
    README

现在是了解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重写信息让你的服务正常运行。

现在,继续到博客教程 - 添加一个模型,开始建立你的第一个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>
            <?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>
            <?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>
            <?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' => 'Are you sure?')
                );
            ?>
            <?php
                echo $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. 简单身份验证和授权的应用: 用户身份验证和授权教程

补充阅读



  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值