CakePHP 2.x CookBook 中文版 第三章 入门(一)

入门

CakePHP 框架为应用程序提供了坚实的基础。它控制着所有方面,从用户的初始请求直到 web 页面的最终渲染。由于本框架遵循 MVC 原则,使得自定义和扩展应用程序变得更容易。

本框架还提供了一个基本的原始结构,从文件名到数据库表名,保持了应用程序的一致性和逻辑性。这个概念简单而强劲。遵循规则,就会知道东西都在哪儿,都是怎样组织的。

体验和学习 CakePHP 的最好办法是坐下来做点什么。我们将开始构建一个简单的博客系统。

博客课程

欢迎来到 CakePHP。你也许浏览这个课程因为你想了解 CakePHP 如何工作的更多信息。我们旨在提高生产力,使编程更愉悦:我们希望你深入代码,以了解这一点。

本课程将引领你创建一个简单的博客应用程序。我们获取和安装 CakePHP,建立和配置数据库,并且建立列表、新建、编辑和删除博客贴子的逻辑。

以下是我们需要的东西:

  1. 一个运行中的 web 服务器。假定使用的是 Apache,不过使用其它 web 服务器的说明也是类似的。我们可能要做一点服务器配置,但是大多数人完全不需要任何配置就可以运行 Cake。 请确认你拥有 PHP 5.2.8 或更高版本。
  2. 一个数据库服务器。在本课程中我们将使用 MySQL 服务器。你需要了解足够的建立数据库的 SQL 信息:Cake 将从那得到控制权。如果我们使用 MySQL,还要确认 PHP 已经启用了 pdo_mysql 。
  3. 基本的 PHP 知识。最好还懂面向对象编程:但是如果你只是个编程爱好者,也不必担心。
  4. 最后,需要有一点 MVC 编程模式的基本知识。在 理解 模型 - 视图 - 控制器 一节能找到一个快速预览。不用担心,大约只有半页左右。

让我们开始吧!

获得 Cake

首先让我们取得一份新鲜的 Cake 代码的拷贝。

要得到新鲜的下载,访问 Github 上的 CakePHP 项目: http://github.com/cakephp/cakephp/downloads 并且下载 2.0 的最新版本。

也可以使用 git 克隆代码仓库: git。

1 git clone git://github.com/cakephp/cakephp.git

不管是怎样下载的,都把代码放进 DocumentRoot 之内。一旦完成,目录内的东西看起来应该像下面这样:

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

现在也许是多学一点儿关于 CakePHP 目录结构如何工作的好时候:浏览 CakePHP 的文件夹结构 一节。

建立博客数据库

接着,设置博客的基本数据库。如果你还不曾这么做,建立一个为本教程所用的空数据库,名称任选。现在,建立一个单表用来存储博客贴子。我们也抛出几个贴子用于测试。在数据库上执行如下语句:

 1 /* First, create 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());

表名和列名并非随意指定的。如果遵循 Cake 的数据库命名规则和 Cake 类命名规则(两者的要点都在 CakePHP 约定 一节),能够得到额外的好处:附送的功能并且无需配置。Cake 足够灵活以适应糟糕的遗留数据库结构,但是遵循规则会节省很多时间。

更多的信息参见 CakePHP 约定 一节,简单点说,只要把表命名为“posts“就能自动与 Post 模块挂靠在一起,而 modified 和 created 列则会被 Cake 自动管理。

Cake 数据库配置

步步高升:让我们告诉 Cake 数据库在哪儿以及如何连接它。对于多数情况,这是唯一的配置。

/app/Config/database.php.default 是 CakePHP 数据库配置文件的一个副本,在同一目录中复制这个文件,命名为database.php 。

这个配置文件非常简单:只要用实际的值替换数组 $default 的值。下面是一个完整的配置数组的示例:

 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' => ''
12 );

保存了新的 database.php 文件之后,打开浏览器浏览 Cake 欢迎页面。上面将会显示数据库连接文件被找到,并且已能正确地连接到数据库。

注解

记得你需要 PDO,并且 php.ini 文件中 pdo_mysql 必须可用(enabled)。

可选的配置

另外还有三项配置。许多开发人员完成了长长的列表项,但是它们不包含在本教程中。一是定义一个自定义字符串(salt)用于安全哈希。二是定义一个自定义数字(seed)用于加密。三是允许 CakePHP 写入它的 tmp 文件夹。

安全 salt 用来生成哈希值。编辑 /app/Config/core.php 文件的 187 行修改默认的 salt 值。什么样的值不会有麻烦呢?长到不容易被猜到的值。

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 的 192 行修改默认的 seed 值。什么样的值不会有麻烦呢?长到不容易被猜到的值。

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

最后一项任务是使 app/tmp 目录允许 web 写入。最好的办法是先用(<?php echo `whoami`; ?>)找出运行 web 服务器的用户,然后将 app/tmp 的所有者指向该用户。在 *nix 系统中运行类似下面的命令:

1 $ chown -R www-data app/tmp

如果囿于某些条件而不能写入这个文件夹,你会收到一个不能使用产品模式的警告。

mod_rewrite 说明

偶尔有用户会遇到 mod_rewrite 方面的问题,所以我们在这做个简要说明。如果 CakePHP 欢迎页面有点儿可笑(没有图片或 CSS 样式),意味着系统中缺少 mod_rewrite 功能。有一些对正确运行有帮助的提示: :

确定 .htaccess 覆盖是被允许的:在 httpd.conf 中每个目录有一个节定义这条规则。确认是在正确的目录中把AllowOverride 设置 All。出于安全和执行方面的原因,不要在 <Directory /> 中把 AllowOverride 设置为All。替代方案是寻找指向所用 web 站点目录的 <Directory> 块。

  1. 确定 .htaccess 覆盖是被允许的:在 httpd.conf 中每个目录有一个节定义这条规则。确认是在正确的目录中把AllowOverride 设置 All。出于安全和执行方面的原因,不要在 <Directory /> 中把 AllowOverride 设置为All。替代方案是寻找指向所用 web 站点目录的 <Directory> 块。

  2. 确认编辑了正确的 httpd.conf,而不是某个用户或特别站点的 httpd.conf。

  3. 有些情况下,可能拿到的是一个不带 .htaccess 文件的 CakePHP 副本。出现这种情况的原因是由于一些操作系统隐藏(不显示)以 . 开头的文件,以致拷贝时没有拷贝这个文件。确保 CakePHP 的副本来自下载一节的站点或 git 仓库。

  4. 确认 Apache 正确的加载了 mod_rewrite。应该可以在 httpd.conf 中看到如下的内容::

    1 LoadModule rewrite_module             libexec/httpd/mod_rewrite.so

    或者(在 Apache 1.3)中

    1 AddModule             mod_rewrite.c

     

如果不想或不能让运行中的系统使用 mod_rewrite(及其它兼容模块),需要使用 CakePHP 内置的漂亮 URLs。取消/app/Config/core.php 文件中如下一行的注释:

1 Configure::write('App.baseUrl', env('SCRIPT_NAME'));

同时删除这几个 .htaccess 文件:

/.htaccess /app/.htaccess /app/webroot/.htaccess

这会用类似 www.example.com/index.php/controllername/actionname/param 的 URL 代替 www.example.com/controllername/actionname/param。

如果 CakePHP 安装在 Apache 以外的 web 服务器上,可以在 高级安装 一节找到工作在 URL 重写机制下的介绍。

接下来的 博客课程 —— 加入一个层,将开始第一个 CakePHP 应用程序。

博客课程 —— 加入一个层

建立 Post 模型

模型(model)类是 CakePHP 应用程序的面包和奶油。通过建立与数据库结合的模型类,我们就有了随后放置所需的显示、添加、编辑和删除操作的基础。

CakePHP 的模型类放在 /app/Model 文件夹,我们建立的文件将被存为 /app/Model/Post.php。完整的文件类似于:

1 class Post extends AppModel { 2 }

在 CakePHP 中命名规则非常重要。通过把类命名为 Post,CakePHP 会自动认定这个模型将被用在 PostsController 中,而且会与名为 posts 的数据库表关联。.

注解

如果 CakePHP 不能在 /app/Model 文件夹内找到相对应的文件,它会动态地建立一个模型对象。也就是说,如果不慎写错了文件名(例如 post.php 或者 posts.php),CakePHP 就不认识所有的设置并使用默认的设置代替它。

关于模型的更多信息,诸如表前缀、回调和数据校验,请参阅手册中 模型 一章。

建立 Posts 控制器

接着我们为贴子建立一个控制器。这个控制器是发生贴子交互的地方。简单地说,它就是完成运行模型和获得贴子相关工作的地方。我们将在 /app/Controller 目录的 PostsController.php 文件中放置一个控制器类。类的基本内容类似于:

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

现在在控制器中添加一个动作。控制器中的动作通常实现单一的功能或接口。例如,当用户请求http://www.example.com/post/index(这个和 http://www.example.com/post 相同),他们可能期待看见一个贴子列表。这个动作的代码类似于:

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 }

我来解释一下这个动作。通过在 PostsController 中定义一个函数 index(),用户现在就能够通过向www.example.com/posts/index 提交访问程序逻辑。类似地,如果定义一个函数叫 foobar(),用户就能够访问 www.example.com/posts/index。

警告

以短小的方式命名控制器和动作是一种诱惑,要抑制这种诱惑。遵循 CakePHP 的命名规则(以复数命名控制器等)建立易读、易理解的动作名称。随后可以通过``路由``映射 URLs 到代码。

上例中index动作中使用 set() 方法从控制器向视图(后面会创建)传递数据。设置视图那一行中名为 ‘posts’ 的变量等于 Post 模型的 find('all') 方法的返回值。由于遵循了 Cake 的命名规则,Posts 模型自动可用($this->Post)。

要学习 Cake 控制器的更多内容,请浏览 控制器 一章。

 

你可能感兴趣的:(中文,cakephp,帮助,Cookbook,手册)