本文举例源代码或素材下载
在本系列
![](/icons/5198de.gif)
第 1 部分 中
![](/icons/5198dou.gif)
我们已经设定了本系列
![](/icons/5198de.gif)
范围并满足了先决条件
![](/icons/5198dou2.gif)
现在
![](/icons/5198dou.gif)
将分别在 3个框架中构建样例应用
![](/icons/5198chengxu.gif)
![](/icons/5198dou2.gif)
在接下来
![](/icons/5198de.gif)
几篇文章里
![](/icons/5198dou.gif)
将扩展应用
![](/icons/5198chengxu.gif)
、了解不符合常规
![](/icons/5198de.gif)
例外情况、使用 Ajax、集成外部任务等等
![](/icons/5198dou2.gif)
本文将指导您分别在 3个框架中创建样例应用
![](/icons/5198chengxu.gif)
Blahg
![](/icons/5198dou2.gif)
您将从头做起
![](/icons/5198dou.gif)
了解在 Zend 框架、symfony 和 CakePHP 中开发简单应用
![](/icons/5198chengxu.gif)
![](/icons/5198de.gif)
基础知识
![](/icons/5198dou2.gif)
您应当已经完成了 第 1 部分
![](/icons/5198dou.gif)
该部分介绍了如何安装这 3个框架及使用 3个框架必须满足
![](/icons/5198de.gif)
先决条件
![](/icons/5198dou2.gif)
如果您还未读过这
![](/icons/5198yi.gif)
部分
![](/icons/5198dou.gif)
则应立即阅读
![](/icons/5198dou2.gif)
假定您已经了解 PHP、应用
![](/icons/5198chengxu.gif)
设计以及如何在数据库中工作
![](/icons/5198dou2.gif)
您不需要具有框架使用经验
![](/icons/5198dou.gif)
但是您应当已经准备好开始使用框架
![](/icons/5198dou2.gif)
在 Zend 框架中构建 Blahg
首先
![](/icons/5198dou.gif)
创建目录 /column/htdocs/zend 和 /column/protected/zend
![](/icons/5198dou2.gif)
这些目录将分别保存 Web 可访问
![](/icons/5198de.gif)
文件及 Web 不能访问
![](/icons/5198de.gif)
应用
![](/icons/5198chengxu.gif)
文件
![](/icons/5198dou2.gif)
在 /column/htdocs/zend 中
![](/icons/5198dou.gif)
用以下命令行创建
![](/icons/5198yi.gif)
个 .htaccess 文件:
RewriteEngine _disibledevent=> DIRECTORY_SEPARATOR.'column'.DIRECTORY_SEPARATOR.
'htdocs'.DIRECTORY_SEPARATOR.$sf_web_dir_name.DIRECTORY_SEPARATOR.
sfConfig::get('sf_upload_dir_name'), ));
实质上
![](/icons/5198dou.gif)
这些行将告诉 symfony 在什么位置查找 web 目录
![](/icons/5198dou2.gif)
现在已经添加了这些行
![](/icons/5198dou.gif)
您应当把 /column/protected/sf_column/web
![](/icons/5198de.gif)
内容移到 /column/htdocs/symfony 中(如果尚未创建
![](/icons/5198dou.gif)
请创建此目录)
![](/icons/5198dou2.gif)
最后
![](/icons/5198yi.gif)
个要点是
![](/icons/5198dou.gif)
需要修改 /column/htdocs/symfony/index.php 使其知道项目
![](/icons/5198de.gif)
实际根目录位置
![](/icons/5198dou2.gif)
用下面
![](/icons/5198de.gif)
行替代 SF_ROOT_DIR
![](/icons/5198de.gif)
现有定义:
![](/icons/5198define.gif)
('SF_ROOT_DIR', '/column/protected/sf_column');
![](/icons/5198dou2.gif)
几乎就要完成了
![](/icons/5198dou2.gif)
现在只需使用 init
![](/icons/5198chushi.gif)
化 Blahg
![](/icons/5198de.gif)
post 模型
![](/icons/5198dou2.gif)
这意味着要在命令行中运行另
![](/icons/5198yi.gif)
条命令:php /column/protected/symfony/data/bin/symfony init-app blahg
![](/icons/5198dou2.gif)
这条命令像其他命令
![](/icons/5198yi.gif)
样
![](/icons/5198dou.gif)
将构建
![](/icons/5198yi.gif)
些文件和目录
![](/icons/5198dou.gif)
这次是在 /column/protected/sf_column/apps/blahg/modules/post 中
![](/icons/5198dou2.gif)
现在已经使 symfony 启动并运行
![](/icons/5198dou.gif)
是该整合 Blahg
![](/icons/5198de.gif)
时候了
![](/icons/5198dou2.gif)
注:symfony 提供了自动生成代码
![](/icons/5198de.gif)
功能
![](/icons/5198dou.gif)
用于基于数据库提供 Create、Read、Update 和 Delete (CRUD) 功能
![](/icons/5198dou2.gif)
虽然这可以帮助您快速地集中应用
![](/icons/5198chengxu.gif)
![](/icons/5198de.gif)
基本信息
![](/icons/5198dou.gif)
但是在这种环境下使用它
![](/icons/5198dou.gif)
您无法清楚地了解 symfony 应用
![](/icons/5198chengxu.gif)
进行整合
![](/icons/5198de.gif)
方式
![](/icons/5198dou2.gif)
基于本文
![](/icons/5198de.gif)
学习目
![](/icons/5198de.gif)
![](/icons/5198dou.gif)
您将手动构建应用
![](/icons/5198chengxu.gif)
![](/icons/5198dou2.gif)
生成模型
您将使用
![](/icons/5198de.gif)
posts 表同样是在 第 1 部分 中创建
![](/icons/5198de.gif)
![](/icons/5198dou2.gif)
由于 symfony 将使用 Propel 来提供对象关系映射 (Object Relational Mapping)
![](/icons/5198dou.gif)
因此需要用 symfony 命令行实用
![](/icons/5198chengxu.gif)
来生成模型
![](/icons/5198dou2.gif)
这要求描述数据库模式并先提供
![](/icons/5198yi.gif)
些数据库信息
![](/icons/5198dou2.gif)
注:技术上讲
![](/icons/5198dou.gif)
没有必要先提供数据库信息
![](/icons/5198dou2.gif)
symfony 将根据模式构建模型
![](/icons/5198dou.gif)
并且甚至可以使用命令行实用
![](/icons/5198chengxu.gif)
生成 SQL 脚本以根据模式定义创建数据库
![](/icons/5198dou2.gif)
我们将在后面
![](/icons/5198de.gif)
![](/icons/5198yi.gif)
篇文章中尝试该操作
![](/icons/5198dou2.gif)
对于数据库和模式定义文件
![](/icons/5198dou.gif)
symfony 将使用 Yet Another Markup Language (YAML)
![](/icons/5198dou2.gif)
YAML 不太复杂
![](/icons/5198dou.gif)
但是如果您以前从未使用过它
![](/icons/5198dou.gif)
则它可能会有些令人迷惑
![](/icons/5198dou2.gif)
在这个例子中
![](/icons/5198dou.gif)
对于 YAML 需要了解到 whitespace 非常重要
![](/icons/5198dou2.gif)
使用两个空格表示缩进
![](/icons/5198dou.gif)
而且绝不使用制表符
![](/icons/5198dou2.gif)
现在将编辑 database.yml 和 schema.yml 文件
![](/icons/5198dou2.gif)
这些文件位于 /column/protected/sf_column/config 中
![](/icons/5198dou2.gif)
并且需要编辑 schema.yml 文件来描述 posts 表
![](/icons/5198dou2.gif)
编辑模式文件以包含下列信息:
清单 2. 编辑 schema.yml 文件
propel:
posts :
_attributes: { phpName: Post }
id:
title: varchar(255)
text: longvarchar
mod
ied: timestamp
注:由于您可能是复制并粘贴了这段代码
![](/icons/5198dou.gif)
请返回查看并确保每个缩进都是两个空格
![](/icons/5198dou.gif)
并且未使用任何制表符
![](/icons/5198dou2.gif)
例如
![](/icons/5198dou.gif)
mod
![](/icons/5198if.gif)
ied 行开头前应当有 4个空格(两个表示 posts
![](/icons/5198de.gif)
缩进
![](/icons/5198dou.gif)
两个表示 mod
![](/icons/5198if.gif)
ied
![](/icons/5198de.gif)
缩进)
![](/icons/5198dou2.gif)
应当编辑 database.yml 文件使其包含具体
![](/icons/5198de.gif)
数据库参数
![](/icons/5198dou2.gif)
该文件看上去可能类似清单 3
![](/icons/5198dou2.gif)
清单 3. database.yml 文件
all:
propel:
: sfPropelDatabase
param:
phptype: mysql
hostspec: localhost
database: symfony
username: frameworks
password: fwpw
这应当不难
![](/icons/5198dou2.gif)
现在模式和数据库配置已经完成
![](/icons/5198dou.gif)
您可以生成模型了
![](/icons/5198dou2.gif)
返回到先前使用
![](/icons/5198de.gif)
命令行并在 /column/protected/sf_column 中执行以下命令:
php /column/protected/symfony/data/bin/symfony propel-build-model
php /column/protected/symfony/data/bin/symfony clear-cache
每条命令都将输出大量数据
![](/icons/5198dou.gif)
但是重要
![](/icons/5198de.gif)
最终结果是在 /column/protected/sf_column/lib/model 中创建 Post.php 和 PostPeer.php 文件 —— 这些是您
![](/icons/5198de.gif)
模型
![](/icons/5198dou2.gif)
如果打开这些模型
![](/icons/5198dou.gif)
您将看到那里面没有很多内容
![](/icons/5198dou2.gif)
它们只是扩展了基本模型类
![](/icons/5198dou2.gif)
注:无论何时重新构建模型
![](/icons/5198dou.gif)
都必须运行上面
![](/icons/5198de.gif)
clear-cache 命令
![](/icons/5198dou2.gif)
好
![](/icons/5198de.gif)
!这
![](/icons/5198yi.gif)
轮对模型
![](/icons/5198de.gif)
学习已经完成
![](/icons/5198dou2.gif)
有关模型还有很多内容可说
![](/icons/5198dou.gif)
但是接着需要构建控制器
![](/icons/5198dou2.gif)
构建控制器
您不需要像在 Zend 中
![](/icons/5198yi.gif)
样编写 Front 控制器
![](/icons/5198dou.gif)
![](/icons/5198yinwei.gif)
symfony 已经为您提供了该控制器
![](/icons/5198dou2.gif)
post 控制器实际上将被称为 actions.
![](/icons/5198class.gif)
.php 并且将位于 /column/protected/sf_column/apps/blahg/modules/post/actions 中
![](/icons/5198dou2.gif)
此控制器将为 post 模块处理所有操作
![](/icons/5198dou2.gif)
像以前
![](/icons/5198yi.gif)
样
![](/icons/5198dou.gif)
您需要 3个操作
![](/icons/5198dou.gif)
但是名称区别:executeIndex、executeRead 和 executeWrite(executeXxxxxx 是 symfony 所使用
![](/icons/5198de.gif)
操作命名约定
![](/icons/5198dou.gif)
并且必须遵守)
![](/icons/5198dou2.gif)
executeIndex 操作十分简单:检索 posts 并使其对视图可用
![](/icons/5198dou2.gif)
executeRead 操作也十分简单:获取 post ID、检索 post 并使 post 数据对视图可用
![](/icons/5198dou2.gif)
executeWrite 操作将从请求中获取标题和文本并将数据保存到数据库中
![](/icons/5198dou.gif)
返回已经保存
![](/icons/5198de.gif)
post
![](/icons/5198de.gif)
ID
![](/icons/5198dou2.gif)
有关语法和结构
![](/icons/5198de.gif)
详细信息
![](/icons/5198dou.gif)
请查看 代码下载 中
![](/icons/5198de.gif)
post/actions/actions.
![](/icons/5198class.gif)
.php
![](/icons/5198dou2.gif)
现在控制器已经完成
![](/icons/5198dou.gif)
可以接着构建视图
![](/icons/5198dou2.gif)
构建视图
post 视图将位于 /column/protected/sf_column/apps/blahg/modules/post/templates 中
![](/icons/5198dou2.gif)
您需要 3个视图:indexSuccess.php、readSuccess.php 和 writeSuccess.php(xxxxSuccess.php 命名约定是必须遵守
![](/icons/5198de.gif)
symfony 约定)
![](/icons/5198dou2.gif)
这些视图不会像 Zend 视图
![](/icons/5198yi.gif)
样呈现成完全
![](/icons/5198de.gif)
HTML 文档
![](/icons/5198dou2.gif)
symfony 提供了
![](/icons/5198yi.gif)
个默认
![](/icons/5198de.gif)
布局模板(在 apps/blahg/templates/layout.php 中)
![](/icons/5198dou.gif)
该模板提供了 HTML 页面
![](/icons/5198de.gif)
基本页头和页尾
![](/icons/5198dou2.gif)
您需要提供
![](/icons/5198de.gif)
全部内容是视图
![](/icons/5198de.gif)
中间部分 —— 操作
![](/icons/5198de.gif)
具体内容
![](/icons/5198dou2.gif)
例如
![](/icons/5198dou.gif)
indexSuccess.php 只需要循环并设定所提供
![](/icons/5198de.gif)
posts
![](/icons/5198shuzu.gif)
![](/icons/5198de.gif)
格式
![](/icons/5198dou.gif)
readSuccess.php 只设定 post 内容
![](/icons/5198de.gif)
格式
![](/icons/5198dou.gif)
而 writeSuccess.php 将在 post 被提交后显示表单或输出成功消息
![](/icons/5198dou2.gif)
如果创建或安装过程
![](/icons/5198yi.gif)
切正常
![](/icons/5198dou.gif)
您应当能够通过转到 http://localhost/symfony/post 访问 symfony 版本
![](/icons/5198de.gif)
Blahg(假定所有内容都安装在本地)
![](/icons/5198dou2.gif)
现在您已经了解了 Blahg 如何在 Zend 框架和 symfony 中整合
![](/icons/5198dou2.gif)
已经在两个框架中构建了 Blahg
![](/icons/5198dou.gif)
还剩最后
![](/icons/5198yi.gif)
个框架
![](/icons/5198dou2.gif)
在 CakePHP 中构建 Blahg
开始在 CakePHP 中构建 Blahg 的前
![](/icons/5198dou.gif)
必须先创建
![](/icons/5198yi.gif)
些文件
![](/icons/5198dou2.gif)
然后设置数据库连接并让 Bake 接管
![](/icons/5198dou2.gif)
设置文件结构
看
![](/icons/5198yi.gif)
看 /column/protected/cakephp/ 目录
![](/icons/5198dou2.gif)
您应当会看到 4个目录:application(保存应用
![](/icons/5198chengxu.gif)
![](/icons/5198de.gif)
目录)、cake(包含 Cake
![](/icons/5198de.gif)
核心文件
![](/icons/5198de.gif)
目录)、docs(自述文档)和 vendors(放置可能使用
![](/icons/5198de.gif)
第 3方库
![](/icons/5198de.gif)
位置)
![](/icons/5198dou2.gif)
还有两个文件:index.php 和 .htaccess
![](/icons/5198dou2.gif)
仅当您在 webroot 中安装 CakePHP 时才会使用这两个文件
![](/icons/5198dou2.gif)
通常
![](/icons/5198dou.gif)
这不是明智
![](/icons/5198de.gif)
做法
![](/icons/5198dou.gif)
![](/icons/5198yinwei.gif)
它允许使用 Web 浏览器
![](/icons/5198de.gif)
任何人访问应用
![](/icons/5198chengxu.gif)
![](/icons/5198de.gif)
所有文件
![](/icons/5198dou2.gif)
安装
![](/icons/5198de.gif)
首选思路方法是使 /column/protected/cakephp/app/webroot 成为 Web 服务器
![](/icons/5198de.gif)
根目录
![](/icons/5198dou2.gif)
等效
![](/icons/5198de.gif)
可行思路方法(且为本系列
![](/icons/5198de.gif)
首选思路方法)是把 /column/protected/cakephp/app/webroot
![](/icons/5198de.gif)
内容复制到 Web 可访问
![](/icons/5198de.gif)
目录(在本例中为 /column/htdocs/cakephp)中
![](/icons/5198dou2.gif)
继续并立即执行该操作
![](/icons/5198dou2.gif)
当您复制完文件的后
![](/icons/5198dou.gif)
需要打开 /column/protected/cakephp/app/webroot/index.php 并作
![](/icons/5198yi.gif)
些编辑:需要更新 ROOT 和 APP_DIR
![](/icons/5198de.gif)
现有定义
![](/icons/5198dou2.gif)
它们应当类似清单 4
![](/icons/5198dou2.gif)
清单 4. ROOT 和 APP_DIR
![](/icons/5198de.gif)
定义
(!
d('ROOT')) {
('ROOT', DS . 'column' . DS . 'protected' . DS . 'cakephp');
}
(!
d('APP_DIR')) {
('APP_DIR', 'app');
}
您可以继续构建
![](/icons/5198dou.gif)
但是您也可以输入数据库信息并用 CAKE_SESSION_STRING
![](/icons/5198de.gif)
惟
![](/icons/5198yi.gif)
值更新 core.php
![](/icons/5198dou2.gif)
在 /column/protected/cakephp/app/config/ 中
![](/icons/5198dou.gif)
为 database.php.default 创建
![](/icons/5198yi.gif)
个名为 database.php
![](/icons/5198de.gif)
副本
![](/icons/5198dou.gif)
然后输入系统
![](/icons/5198de.gif)
主机、登录名、密码和数据库名称
![](/icons/5198dou2.gif)
另外
![](/icons/5198dou.gif)
在 /column/protected/cakephp/app/config/core.php 中
![](/icons/5198dou.gif)
将 CAKE_SESSION_STRING
![](/icons/5198de.gif)
定义更改为包含
![](/icons/5198yi.gif)
个新值
![](/icons/5198dou.gif)
例如
![](/icons/5198define.gif)
('CAKE_SESSION_STRING', 'He had a Subbuteo player in his hair. I got distracted.');
![](/icons/5198dou2.gif)
您已经完成了预备工作
![](/icons/5198dou2.gif)
现在可以开始享用 CakePHP 了
![](/icons/5198dou2.gif)
注:像 symfony
![](/icons/5198yi.gif)
样
![](/icons/5198dou.gif)
CakePHP 提供了自动生成代码功能来基于数据库提供 CRUD 功能
![](/icons/5198dou2.gif)
CakePHP 还提供了可以提供类似服务而无需生成任何代码
![](/icons/5198de.gif)
scaffolding
![](/icons/5198dou2.gif)
这两个功能都能帮助您快速集中获得应用
![](/icons/5198chengxu.gif)
![](/icons/5198de.gif)
基本信息
![](/icons/5198dou.gif)
但是如前所述
![](/icons/5198dou.gif)
在此环境中使用这些功能将不会给您提供在 CakePHP 中构建应用
![](/icons/5198chengxu.gif)
![](/icons/5198de.gif)
太多感受
![](/icons/5198dou2.gif)
创建表和模型
如果您没有 posts 表
![](/icons/5198dou.gif)
您跳过了第 1 部分中创建 posts 表
![](/icons/5198de.gif)
那
![](/icons/5198yi.gif)
部分
![](/icons/5198dou.gif)
请立即转到相应位置查看并创建该表
![](/icons/5198dou2.gif)
在 /column/protected/cakephp/app/models 目录中创建名为 post.php
![](/icons/5198de.gif)
文件
![](/icons/5198dou2.gif)
该文件将包含模型
![](/icons/5198de.gif)
类定义
![](/icons/5198dou2.gif)
定义十分简单:类是 Post 并扩展 AppModel
![](/icons/5198dou.gif)
并且应当将类变量 $name 设为 post
![](/icons/5198dou2.gif)
所有工作就这么多
![](/icons/5198dou2.gif)
您
![](/icons/5198de.gif)
模型将使用来自 AppModel
![](/icons/5198de.gif)
所有继承思路方法
![](/icons/5198dou2.gif)
现在可以接着构建控制器了
![](/icons/5198dou2.gif)
注:您可能已经注意到该表被称为 posts(复数)
![](/icons/5198dou.gif)
而模型名称为 post(单数)
![](/icons/5198dou2.gif)
这是 Cake
![](/icons/5198de.gif)
重要约定部分
![](/icons/5198dou2.gif)
模型总是单数
![](/icons/5198dou.gif)
而其对应
![](/icons/5198de.gif)
表总是复数
![](/icons/5198dou2.gif)
构建 Cake posts 控制器
posts 控制器将十分简单
![](/icons/5198dou.gif)
像您今天编写
![](/icons/5198de.gif)
其他控制器
![](/icons/5198yi.gif)
样
![](/icons/5198dou2.gif)
您将安插几个帮助器
![](/icons/5198dou.gif)
然后定义 3个操作:index、read 和 write
![](/icons/5198dou2.gif)
index 操作将获取 posts 列表并使其对视图可用
![](/icons/5198dou2.gif)
read 操作将获取 post
![](/icons/5198de.gif)
ID
![](/icons/5198dou.gif)
检索 post 并使 post 数据可用于视图
![](/icons/5198dou2.gif)
write 操作用于接受提交(如果有提交操作)并将数据保存到数据库中
![](/icons/5198dou2.gif)
有关语法和结构
![](/icons/5198de.gif)
详细信息
![](/icons/5198dou.gif)
请查看 代码下载 中
![](/icons/5198de.gif)
/column/protected/cakephp/app/controllers/posts_controller.php
![](/icons/5198dou2.gif)
控制器已经完成
![](/icons/5198dou2.gif)
现在可以接着构建最后几个视图
![](/icons/5198dou2.gif)
构建 Cake 视图
您需要使用在其他框架中为 Blahg 创建
![](/icons/5198de.gif)
3个基础视图
![](/icons/5198dou2.gif)
在本例中
![](/icons/5198dou.gif)
您将在 /column/protected/cakephp/app/views/posts 目录中创建 index.ctp、read.ctp 和 write.ctp 文件
![](/icons/5198dou2.gif)
这些文件只是 CakePHP 将使用
![](/icons/5198de.gif)
模板
![](/icons/5198dou.gif)
它们很像您在 symfony 中创建
![](/icons/5198de.gif)
模板
![](/icons/5198dou2.gif)
请查看代码归档中
![](/icons/5198de.gif)
这些文件
![](/icons/5198dou2.gif)
视图将充分使用表单和 HTML 帮助器来输出链接和表单元素
![](/icons/5198dou.gif)
但是它们看上去应当类似您为 symfony 创建
![](/icons/5198de.gif)
其他视图
![](/icons/5198dou2.gif)
注意
![](/icons/5198dou.gif)
视图不会呈现到完全
![](/icons/5198de.gif)
HTML 文件中
![](/icons/5198dou2.gif)
默认布局是由 CakePHP 提供
![](/icons/5198de.gif)
![](/icons/5198dou2.gif)
这些默认布局文件都是位于 /column/protected/cakephp/cake/libs/views/templates/layouts 中
![](/icons/5198dou.gif)
但是不必修改这些文件
![](/icons/5198dou2.gif)
如果需要更改默认布局
![](/icons/5198dou.gif)
请将 default.ctp 布局文件
![](/icons/5198de.gif)
副本放到 /column/protected/cakephp/app/views/layouts 中并根据需要进行修改
![](/icons/5198dou2.gif)
注:使用这些帮助器
![](/icons/5198de.gif)
话
![](/icons/5198dou.gif)
则 Cake 中
![](/icons/5198de.gif)
表单和链接更易于维护
![](/icons/5198dou.gif)
![](/icons/5198yinwei.gif)
Cake 将确保链接指向应用
![](/icons/5198chengxu.gif)
中
![](/icons/5198de.gif)
正确安装位置或移至其他目录
![](/icons/5198de.gif)
位置
![](/icons/5198dou.gif)
并且如果正确设定了表单元素名称
![](/icons/5198de.gif)
格式
![](/icons/5198dou.gif)
Cake 将为您完成大部分工作
![](/icons/5198dou2.gif)
根据 Blahg
![](/icons/5198de.gif)
需求构建视图
![](/icons/5198dou.gif)
或者安装 代码下载 中
![](/icons/5198de.gif)
视图
![](/icons/5198dou2.gif)
假定所有内容均已正确编写并安装
![](/icons/5198dou.gif)
您应当能够访问位于 http://localhost/cakephp/posts
![](/icons/5198de.gif)
CakePHP 版本
![](/icons/5198de.gif)
Blahg(假定已在本地安装)
![](/icons/5198dou2.gif)
结束语
您完成了很多工作:安装、启动并运行了 3个框架
![](/icons/5198dou.gif)
并且在每个框架中创建了
![](/icons/5198yi.gif)
个基本应用
![](/icons/5198chengxu.gif)
![](/icons/5198dou2.gif)
花
![](/icons/5198yi.gif)
些时间使用每个框架中
![](/icons/5198de.gif)
Blahg
![](/icons/5198dou.gif)
然后尝试在每个框架中扩展 Blahg
![](/icons/5198dou2.gif)
尝试编写
![](/icons/5198yi.gif)
个 comments 控制器
![](/icons/5198dou.gif)
该控制器将允许用户发布对每个 post
![](/icons/5198de.gif)
回复
![](/icons/5198dou2.gif)
可是这时还不能把链接注释整合到 posts 中
![](/icons/5198dou2.gif)
但如果您感觉这样做没问题
![](/icons/5198dou.gif)
那就尽管去做吧!在第 3 部分中
![](/icons/5198dou.gif)
将为您提供涉及这部分操作
![](/icons/5198de.gif)
![](/icons/5198yi.gif)
些代码