简介:
Yii是一个基于组件的高性能PHP框架,用于开发大型Web应用。Yii采用严格的OOP编写,并有着完善的库引用以及全面的教程。从 MVC、DAO/ActiveRecord、Widgets、caching、等级式RBAC,Web服务,到主题化,I18N和L10N,Yii提供了今日Web 2.0应用开发所需要的几乎一切功能。从成功的网站应用相对于其它框架,Yii是最有效率的PHP框架之一。
Yii是一个高性能的PHP5的web应用程序开发框架。通过一个简单的命令行工具 yiic 可以快速创建一个web应用程序的代码框架,开发者可以在生成的代码框架基础上添加业务逻辑,以快速完成应用程序的开发。
Yii 是一个通用的 Web 编程框架,可以用于开发几乎所有的 Web 应用。由于它是轻量级的且具备了成熟的缓存解决方案,它特别适用于开发高流量的应用,例如门户,论坛,内容管理系统(CMS),电子商务系统等等。
Yii和其它多数的PHP框架类似,Yii 首先也是一个MVC 框架。Yii 以其优异的性能,丰富的功能和清晰的文档优于其他PHP开发框架。Yii 从一开始就仔细设计以适合严谨的Web应用程序开发。它既不是一个其他项目的衍生品,也不是一个第三方工作的组合。 它是作者丰富的Web应用开发经验和对大多数流行的Web编程框架与应用的研究与思考的成果。
优点:
Yii容易学习和使用。只需要知道PHP和面向对象编程,便可以很快上手,而不必事先去学习一种新的架构或者模板语言。
用Yii的开发速度非常之快,除框架本身之外,需要为应用所写的编码极少。造就了Yii是最高效的开发框架之一。
Yii 具有高度的可重用性和可扩展性,是纯粹的面向对象。Yii中的一切都是独立的可被配置,可重用,可扩展的组件。更重要的是Yii有着越来越多的扩展库。主要由使用者贡献出的组件组成,这可能有助于大大减少开发时间。
Yii 有着丰富的功能,从MVC, DAO/ActiveRecord, 到主题化, 国际化和本地化, Yii 提供了几乎所有今天的Web 2.0应用程序开发所需的功能。
Yii参考手册是Yii完备的文档,有着学习和掌握它所需要的任何资料和信息。
Yii一开始就精心设计,以适应复杂的Web应用开发。它不是某个项目的副产品或者第三方集成。而是融合了作者丰富的Web应用开发经验和其它热门 Web 框架和应用的优秀思想的结晶。
最后,重要的一点:Yii是免费的,Yii遵循最新的BSD许可。它确保了它的第三方开发也循序和BSD相兼容的许可。这意味着无论从法律上还是财务上来说,都可以自由的使用Yii来开发任何一个开源的或者私有的应用。
它非常令人印象深刻的是,性能指标相比其他基于PHP的框架有明显效率,立即吸引了非常积极的关注并受到许多开发者的欢迎。
特性:
Yii几乎拥有了当今Web 2.0应用发展的全部特性。下面是这些特性的一个简短的清单。
模型-视图-控制器(MVC)设计模式:Yii在WEB编程中采用这一成熟的技术从而可以更好的将逻辑层和表现层分开。
数据库访问对象(DAO)和Active Record:Yii允许开发者模型数据库中的数据对象,从而减少他们在写很长和重复的SQL语句上的精力。
与jQuery整合:作为最流行的JavaScript框架之一,jQuery可以编写高效而灵活的JavaScript接口。
表单输入和验证:YII使得收集表单输入非常容易和安全。 Yii拥有一套确保数据的有效性的验证器,它也有辅助方法和部件,显示验证失败时的错误。
Web 2.0部件:由jQuery的支持,YII配备了一套Web 2.0的部件,如自动完成输入字段,TreeView等等。
身份验证和授权:Yii具有内置的身份验证支持。它也支持通过分层的基于角色的访问控制(RBAC)的授权。
主题:它能够瞬间改变一个Yii应用的视图。
Web服务:Yii支持自动生成复杂的WSDL服务规范和管理Web服务请求处理。
国际化(I18N)和本地化(L10N):Yii支持消息转换,日期和时间格式,数字格式和界面本地化。
分层缓存方案:Yii支持数据缓存,页面缓存,片段缓存和动态内容。缓存的存储介质,可以轻松地更改而不触及应用程序代码。
错误处理和日志记录:错误的处理很好的呈现出来,日志信息可以分类,过滤并分配到不同的位置。
安全:Yii配备了许多安全的措施,以帮助安全的Web应用程序,以防止网络攻击。这些措施包括跨站点脚本(XSS)预防,跨站点请求伪造(CSRF)预防,Cookie篡改预防等。
符合XHTML:Yii的组件和命令行工具生成的代码符合XHTML标准。
自动代码生成:Yii提供了可以自动生成的代码的工具,根据你的需要,例如生成一个程序骨架,CRUD应用等等。
完全面向对象:Yii框架坚持严格的面向对象编程范式。它没有定义任何全局函数或变量。而且,它定义的类层次结构允许最大的可重用性和定制。
友好的使用第三方代码:Yii精心设计让它第三方代码非常好的工作。例如,你可以在你的Yii应用程序中使用PEAR或Zend Framework的代码。
详细的文档:每一个单一的方法或属性都非常清楚的记录着。同时提供了一个全面的教程和一些新手教程。
扩展库:Yii提供了一个组成用户提供组件的一个扩展库,这使得上述功能列表是永无止境的。
设计参考:
Yii集成了许多其他著名Web编程框架、应用程序的思想。下面是Yii所吸收和设计上参考列表:
Prado:这是Yii思想的主要来源。Yii采用基于组件和事件驱动的编程范式,数据库抽象层,模块化的应用程序架构、国际化、本地化和许多其他的特点和规律。
Ruby on Rails:Yii的约定优于配置继承了它的精神。Yii的ORM层还引用了它的Active Record设计模式。
JQuery: 这是集成在Yii中的基本框架。
Symfony:Yii引用其过滤器的设计和插件体系结构。
Joomla:Yii引用了其模块化设计和信息翻译方案。
开发的必要条件:
要运行一个 Yii 驱动的Web应用,需要有一个支持 PHP 5.1.0 或以上版本的 Web服务器。对于打算使用Yii的开发者来说,首先要懂PHP程序开发语言,另外懂得面向对象编程(OOP)会非常有帮助,因为Yii 是一个纯 OOP 的PHP框架。
Yii 是什么
Yii 最适合做什么?
Yii 和其他框架相比呢?
Yii 版本
系统要求和先决条件
从 Yii 1.1 升级
安装
PHP 需求
命名空间
组件(Component)与对象(Object)
对象的配置
class MyClass extends \yii\base\Object { public function __construct($param1, $param2, $config = []) { // ... 配置生效前的初始化过程 parent::__construct($config); } public function init() { parent::init(); // ...配置生效后的初始化过程 } }
$object = Yii::createObject([ 'class' => 'MyClass', 'property1' => 'abc', 'property2' => 'cde', ], [$param1, $param2]);
事件(Event)
$event = new \yii\base\Event; $component->trigger($eventName, $event);
$component->on($eventName, $handler); // 要解除相关句柄,使用 off 方法: // $component->off($eventName, $handler);
路径别名(Path Alias)
视图(View)
echo $this->render('_item', ['item' => $item]);
模型(Model)
public function scenarios() { return [ 'backend' => ['email', 'role'], 'frontend' => ['email', '!role'], ]; }
控制器(Controller)
public function actionView($id) { $model = \app\models\Post::findOne($id); if ($model) { return $this->render('view', ['model' => $model]); } else { throw new \yii\web\NotFoundHttpException; } }
小部件(Widget)
use yii\widgets\Menu; use yii\widgets\ActiveForm; // 注意必须 **"echo"** 结果以显示内容 echo Menu::widget(['items' => $items]); // 传递一个用于初始化对象属性的数组 $form = ActiveForm::begin([ 'options' => ['class' => 'form-horizontal'], 'fieldConfig' => ['inputOptions' => ['class' => 'input-xlarge']], ]); ... 表单输入栏都在这里 ... ActiveForm::end();
主题(Theme)
控制台应用(Console Application)
国际化(I18N)
操作过滤器(Action Filters)
public function behaviors() { return [ 'access' => [ 'class' => 'yii\filters\AccessControl', 'rules' => [ ['allow' => true, 'actions' => ['admin'], 'roles' => ['@']], ], ], ]; }
前端资源(Assets)
助手类(Helpers)
表单
<?php field($model, 'username') ?> <?php field($model, 'password')->passwordInput() ?>
查询生成器(Query Builder)
$query = new \yii\db\Query(); $query->select('id, name') ->from('user') ->limit(10); $command = $query->createCommand(); $sql = $command->sql; $rows = $command->queryAll();
活动记录(Active Record)
// 检索所有 *活动的* 客户和订单,并以 ID 排序: $customers = Customer::find() ->where(['status' => $active]) ->orderBy('id') ->all();
class Customer extends \yii\db\ActiveRecord { public function getOrders() { return $this->hasMany('Order', ['customer_id' => 'id']); } }
$orders = $customer->getOrders()->andWhere('status=1')->all();
$customers = Customer::find()->asArray()->all();
public function init() { parent::init(); $this->status = self::STATUS_NEW; }
用户及身份验证接口(IdentityInterface)
URL 管理
[ 'pattern' => 'post//', 'route' => 'post/index', 'defaults' => ['page' => 1], ]
同时使用 Yii 1.1 和 2.x
使用数据库
本章节将介绍如何如何创建一个从数据表 country
中获取国家数据并显示出来的页面。为了实现这个目标,你将会配置一个数据库连接,创建一个活动记录类,并且创建一个操作及一个视图。
贯穿整个章节,你将会学到:
- 配置一个数据库连接
- 定义一个活动记录类
- 使用活动记录从数据库中查询数据
- 以分页方式在视图中显示数据
请注意,为了掌握本章你应该具备最基本的数据库知识和使用经验。尤其是应该知道如何创建数据库,如何通过数据库终端执行 SQL 语句。
准备数据库
首先创建一个名为 yii2basic
的数据库,应用将从这个数据库中获取数据。你可以创建 SQLite,MySQL,PostregSQL,MSSQL 或 Oracle 数据库,Yii 内置多种数据库支持。简单起见后面的内容将以 MySQL 为例做演示。
然后在数据库中创建一个名为 country
的表并插入简单的数据。可以执行下面的语句:
CREATE TABLE `country` (
`code` CHAR(2) NOT NULL PRIMARY KEY,
`name` CHAR(52) NOT NULL,
`population` INT(11) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `Country` VALUES ('AU','Australia',18886000);
INSERT INTO `Country` VALUES ('BR','Brazil',170115000);
INSERT INTO `Country` VALUES ('CA','Canada',1147000);
INSERT INTO `Country` VALUES ('CN','China',1277558000);
INSERT INTO `Country` VALUES ('DE','Germany',82164700);
INSERT INTO `Country` VALUES ('FR','France',59225700);
INSERT INTO `Country` VALUES ('GB','United Kingdom',59623400);
INSERT INTO `Country` VALUES ('IN','India',1013662000);
INSERT INTO `Country` VALUES ('RU','Russia',146934000);
INSERT INTO `Country` VALUES ('US','United States',278357000);
于是便有了一个名为 yii2basic
的数据库,在这个数据库中有一个包含三个字段的数据表 country
,表中有十行数据。
配置数据库连接
开始之前,请确保你已经安装了 PHP PDO 扩展和你所使用的数据库的 PDO 驱动(例如 MySQL 的 pdo_mysql
)。对于使用关系型数据库来讲,这是基本要求。
驱动和扩展安装可用后,打开 config/db.php
修改里面的配置参数对应你的数据库配置。该文件默认包含这些内容:
<?php
return [
'class' => 'yiidbConnection',
'dsn' => 'mysql:host=localhost;dbname=yii2basic',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
];
config/db/php
是一个典型的基于文件的配置工具。这个文件配置了数据库连接 [[yiidbConnection]] 的创建和初始化参数,应用的 SQL 查询正是基于这个数据库。
上面配置的数据库连接可以在应用中通过 Yii::$app->db
访问。
补充:
config/db.php
将被包含在应用配置文件config/web.php
中,后者指定了整个应用如何初始化。请参考配置章节了解更多信息。
创建活动记录
创建一个继承自活动记录类的类 Country
,把它放在 models/Country.php
,去表示和获取 country
表的数据。
<?php
namespace appmodels;
use yiidbActiveRecord;
class Country extends ActiveRecord
{
}
这个 Country
类继承自 [[yiidbActiveRecord]]。你不用在里面写任何代码。只需要像现在这样,Yii 就能根据类名去猜测对应的数据表名。
补充:如果类名和数据表名不能直接对应,可以重写 [[yiidbActiveRecord::tableName()|tableName()]] 方法去显式指定相关表名。
使用 Country
类可以很容易地操作 country
表数据,就像这段代码:
use appmodelsCountry;
// 获取 country 表的所有行并以 name 排序
$countries = Country::find()->orderBy('name')->all();
// 获取主键为 “US” 的行
$country = Country::findOne('US');
// 输出 “United States”
echo $country->name;
// 修改 name 为 “U.S.A.” 并在数据库中保存更改
$country->name = 'U.S.A.';
$country->save();
补充:活动记录是面向对象、功能强大的访问和操作数据库数据的方式。你可以在活动记录章节了解更多信息。除此之外你还可以使用另一种更原生的称做数据访问对象的方法操作数据库数据。
创建操作
为了向最终用户显示国家数据,你需要创建一个操作。相比之前小节掌握的在 site
控制器中创建操作,在这里为所有和国家有关的数据新建一个控制器更加合理。新控制器名为CountryController
,并在其中创建一个 index
操作,如下:
<?php
namespace appcontrollers;
use yiiwebController;
use yiidataPagination;
use appmodelsCountry;
class CountryController extends Controller
{
public function actionIndex()
{
$query = Country::find();
$pagination = new Pagination([
'defaultPageSize' => 5,
'totalCount' => $query->count(),
]);
$countries = $query->orderBy('name')
->offset($pagination->offset)
->limit($pagination->limit)
->all();
return $this->render('index', [
'countries' => $countries,
'pagination' => $pagination,
]);
}
}
把上面的代码保存在 controllers/CountryController.php
。
index
操作调用了活动记录 Country::find()
方法,去生成查询语句并从 country
表中取回所有数据。为了限定每个请求所返回的国家数量,查询在 [[yiidataPagination]] 对象的帮助下进行分页。 Pagination
对象的使命主要有两点:
- 为 SQL 查询语句设置
offset
和limit
从句,确保每个请求只需返回一页数据(本例中每页是 5 行)。 - 在视图中显示一个由页码列表组成的分页器,这点将在后面的段落中解释。
在代码末尾,index
操作渲染一个名为 index
的视图,并传递国家数据和分页信息进去。
创建视图
在 views
目录下先创建一个名为 country
的子目录。这个目录存储所有由 country
控制器渲染的视图。在 views/country
目录下创建一个名为 index.php
的视图文件,内容如下:
<?php
use yiihelpersHtml;
use yiiwidgetsLinkPager;
?>
<h1>Countries</h1>
<ul>
<?php foreach ($countries as $country): ?>
<li>
<?= Html::encode("{$country->name} ({$country->code})") ?>:
<?= $country->population ?>
</li>
<?php endforeach; ?>
</ul>
<?= LinkPager::widget(['pagination' => $pagination]) ?>
这个视图包含两部分用以显示国家数据。第一部分遍历国家数据并以无序 HTML 列表渲染出来。第二部分使用 [[yiiwidgetsLinkPager]] 去渲染从操作中传来的分页信息。小部件LinkPager
显示一个分页按钮的列表。点击任何一个按钮都会跳转到对应的分页。
尝试下
浏览器访问下面的 URL 看看能否工作:
http://hostname/index.php?r=country/index
首先你会看到显示着五个国家的列表页面。在国家下面,你还会看到一个包含四个按钮的分页器。如果你点击按钮 “2”,将会跳转到显示另外五个国家的页面,也就是第二页记录。如果观察仔细点你还会看到浏览器的 URL 变成了:
http://hostname/index.php?r=country/index&page=2
在这个场景里,[[yiidataPagination|Pagination]] 提供了为数据结果集分页的所有功能:
- 首先 [[yiidataPagination|Pagination]] 把 SELECT 的子查询
LIMIT 5 OFFSET 0
数据表示成第一页。因此开头的五条数据会被取出并显示。 - 然后小部件 [[yiiwidgetsLinkPager|LinkPager]] 使用 [[yiidataPagination::createUrl()|Pagination::createUrl()]] 方法生成的 URL 去渲染翻页按钮。URL 中包含必要的参数
page
才能查询不同的页面编号。 - 如果你点击按钮 “2”,将会发起一个路由为
country/index
的新请求。[[yiidataPagination|Pagination]] 接收到 URL 中的page
参数把当前的页码设为 2。新的数据库请求将会以LIMIT 5 OFFSET 5
查询并显示。
总结
本章节中你学到了如何使用数据库。你还学到了如何取出并使用 [[yiidataPagination]] 和 [[yiiwidgetsLinkPager]] 显示数据。
下一章中你会学到如何使用 Yii 中强大的代码生成器 Gii,去帮助你实现一些常用的功能需求,例如增查改删(CRUD)数据表中的数据。事实上你之前所写的代码全部都可以由 Gii 自动生成。
使用 Gii 生成代码
本章节将介绍如何使用 Gii 去自动生成 Web 站点常用功能的代码。使用 Gii 生成代码非常简单,只要按照 Gii 页面上的介绍输入正确的信息即可。
贯穿本章节,你将会学到:
- 在你的应用中开启 Gii
- 使用 Gii 去生成活动记录类
- 使用 Gii 去生成数据表操作的增查改删(CRUD)代码
- 自定义 Gii 生成的代码
开始 Gii
Gii 是 Yii 中的一个模块。可以通过配置应用的 [[yiiaseApplication::modules|modules]] 属性开启它。通常来讲在 config/web.php
文件中会有以下配置代码:
$config = [ ... ];
if (YII_ENV_DEV) {
$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = 'yiigiiModule';
}
这段配置的意思是如果当前是开发环境,应用会包含 gii
模块,模块类是 [[yiigiiModule]]。
如果你检查应用的入口脚本 web/index.php
,将看到这行代码将 YII_ENV_DEV
设为 true:
defined('YII_ENV') or define('YII_ENV', 'dev');
代码设置应用处于开发模式下,按照上面的配置会打开 Gii 模块。你可以直接通过 URL 访问 Gii:
http://hostname/index.php?r=gii
生成活动记录类
选择 “Model Generator” (点击 Gii 首页的链接)去生成活动记录类。并像这样填写表单:
- Table Name:
country
- Model Class:
Country
然后点击 “Preview” 按钮。你会看到 models/Country.php
被列在将要生成的文件列表中。可以点击文件名预览内容。
如果你已经创建过同样的文件,使用 Gii 可以覆写它,点击文件名旁边的 diff
能查看现有文件与将要生成的文件的内容区别。
想要覆写已存在文件,选中 “overwrite” 下的复选框然后点击 “Generator”。如果是新文件,只点击 “Generator” 就好。
接下来你会看到一个包含已生成文件的说明页面。如果生成过程中覆写过文件,还会有一条信息说明代码是重新生成覆盖的。
生成 CRUD 代码
CRUD 代表增,查,改,删操作,这是绝大多数 Web 站点常用的数据处理方式。选择 Gii 中的 “CRUD Generator” (点击 Gii 首页的链接)去创建 CRUD 功能。之前的 “country” 例子需要像这样填写表单:
- Model Class:
appmodelsCountry
- Search Model Class:
appmodelsCountrySearch
- Controller Class:
appcontrollersCountryController
然后点击 “Preview” 按钮。你会看到下述将要生成的文件列表。
[[NEED THE IMAGE HERE / 等待官方补充图片]]
如果你之前创建过 controllers/CountryController.php
和 views/country/index.php
文件(在指南的使用数据库小节),选中 “overwrite” 下的复选框覆写它们(之前的文件没能全部支持 CRUD)。
尝试下
用浏览器访问下面的 URL 查看生成代码的运行:
http://hostname/index.php?r=country/index
可以看到一个栅格显示着从数据表中获取的国家数据。支持在列头对数据进行排序,输入筛选条件进行筛选。
可以浏览详情,编辑,或删除栅格中的每个国家。还可以点击栅格上方的 “Create Country” 按钮通过表单创建新国家。
下面列出由 Gii 生成的文件,以便你研习功能和实现,或修改它们。
- 控制器:
controllers/CountryController.php
- 模型:
models/Country.php
和models/CountrySearch.php
- 视图:
views/country/*.php
补充:Gii 被设计成高度可定制和可扩展的代码生成工具。使用它可以大幅提高应用开发速度。请参考 Gii 小节了解更多内容。
总结
本章学习了如何使用 Gii 去生成为数据表中数据实现完整 CRUD 功能的代码。
使用数据库
本章节将介绍如何如何创建一个从数据表 country
中获取国家数据并显示出来的页面。为了实现这个目标,你将会配置一个数据库连接,创建一个活动记录类,并且创建一个操作及一个视图。
贯穿整个章节,你将会学到:
- 配置一个数据库连接
- 定义一个活动记录类
- 使用活动记录从数据库中查询数据
- 以分页方式在视图中显示数据
请注意,为了掌握本章你应该具备最基本的数据库知识和使用经验。尤其是应该知道如何创建数据库,如何通过数据库终端执行 SQL 语句。
准备数据库
首先创建一个名为 yii2basic
的数据库,应用将从这个数据库中获取数据。你可以创建 SQLite,MySQL,PostregSQL,MSSQL 或 Oracle 数据库,Yii 内置多种数据库支持。简单起见后面的内容将以 MySQL 为例做演示。
然后在数据库中创建一个名为 country
的表并插入简单的数据。可以执行下面的语句:
CREATE TABLE `country` (
`code` CHAR(2) NOT NULL PRIMARY KEY,
`name` CHAR(52) NOT NULL,
`population` INT(11) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `Country` VALUES ('AU','Australia',18886000);
INSERT INTO `Country` VALUES ('BR','Brazil',170115000);
INSERT INTO `Country` VALUES ('CA','Canada',1147000);
INSERT INTO `Country` VALUES ('CN','China',1277558000);
INSERT INTO `Country` VALUES ('DE','Germany',82164700);
INSERT INTO `Country` VALUES ('FR','France',59225700);
INSERT INTO `Country` VALUES ('GB','United Kingdom',59623400);
INSERT INTO `Country` VALUES ('IN','India',1013662000);
INSERT INTO `Country` VALUES ('RU','Russia',146934000);
INSERT INTO `Country` VALUES ('US','United States',278357000);
于是便有了一个名为 yii2basic
的数据库,在这个数据库中有一个包含三个字段的数据表 country
,表中有十行数据。
配置数据库连接
开始之前,请确保你已经安装了 PHP PDO 扩展和你所使用的数据库的 PDO 驱动(例如 MySQL 的 pdo_mysql
)。对于使用关系型数据库来讲,这是基本要求。
驱动和扩展安装可用后,打开 config/db.php
修改里面的配置参数对应你的数据库配置。该文件默认包含这些内容:
<?php
return [
'class' => 'yiidbConnection',
'dsn' => 'mysql:host=localhost;dbname=yii2basic',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
];
config/db/php
是一个典型的基于文件的配置工具。这个文件配置了数据库连接 [[yiidbConnection]] 的创建和初始化参数,应用的 SQL 查询正是基于这个数据库。
上面配置的数据库连接可以在应用中通过 Yii::$app->db
访问。
补充:
config/db.php
将被包含在应用配置文件config/web.php
中,后者指定了整个应用如何初始化。请参考配置章节了解更多信息。
创建活动记录
创建一个继承自活动记录类的类 Country
,把它放在 models/Country.php
,去表示和获取 country
表的数据。
<?php
namespace appmodels;
use yiidbActiveRecord;
class Country extends ActiveRecord
{
}
这个 Country
类继承自 [[yiidbActiveRecord]]。你不用在里面写任何代码。只需要像现在这样,Yii 就能根据类名去猜测对应的数据表名。
补充:如果类名和数据表名不能直接对应,可以重写 [[yiidbActiveRecord::tableName()|tableName()]] 方法去显式指定相关表名。
使用 Country
类可以很容易地操作 country
表数据,就像这段代码:
use appmodelsCountry;
// 获取 country 表的所有行并以 name 排序
$countries = Country::find()->orderBy('name')->all();
// 获取主键为 “US” 的行
$country = Country::findOne('US');
// 输出 “United States”
echo $country->name;
// 修改 name 为 “U.S.A.” 并在数据库中保存更改
$country->name = 'U.S.A.';
$country->save();
补充:活动记录是面向对象、功能强大的访问和操作数据库数据的方式。你可以在活动记录章节了解更多信息。除此之外你还可以使用另一种更原生的称做数据访问对象的方法操作数据库数据。
创建操作
为了向最终用户显示国家数据,你需要创建一个操作。相比之前小节掌握的在 site
控制器中创建操作,在这里为所有和国家有关的数据新建一个控制器更加合理。新控制器名为CountryController
,并在其中创建一个 index
操作,如下:
<?php
namespace appcontrollers;
use yiiwebController;
use yiidataPagination;
use appmodelsCountry;
class CountryController extends Controller
{
public function actionIndex()
{
$query = Country::find();
$pagination = new Pagination([
'defaultPageSize' => 5,
'totalCount' => $query->count(),
]);
$countries = $query->orderBy('name')
->offset($pagination->offset)
->limit($pagination->limit)
->all();
return $this->render('index', [
'countries' => $countries,
'pagination' => $pagination,
]);
}
}
把上面的代码保存在 controllers/CountryController.php
。
index
操作调用了活动记录 Country::find()
方法,去生成查询语句并从 country
表中取回所有数据。为了限定每个请求所返回的国家数量,查询在 [[yiidataPagination]] 对象的帮助下进行分页。 Pagination
对象的使命主要有两点:
- 为 SQL 查询语句设置
offset
和limit
从句,确保每个请求只需返回一页数据(本例中每页是 5 行)。 - 在视图中显示一个由页码列表组成的分页器,这点将在后面的段落中解释。
在代码末尾,index
操作渲染一个名为 index
的视图,并传递国家数据和分页信息进去。
创建视图
在 views
目录下先创建一个名为 country
的子目录。这个目录存储所有由 country
控制器渲染的视图。在 views/country
目录下创建一个名为 index.php
的视图文件,内容如下:
<?php
use yiihelpersHtml;
use yiiwidgetsLinkPager;
?>
<h1>Countries</h1>
<ul>
<?php foreach ($countries as $country): ?>
<li>
<?= Html::encode("{$country->name} ({$country->code})") ?>:
<?= $country->population ?>
</li>
<?php endforeach; ?>
</ul>
<?= LinkPager::widget(['pagination' => $pagination]) ?>
这个视图包含两部分用以显示国家数据。第一部分遍历国家数据并以无序 HTML 列表渲染出来。第二部分使用 [[yiiwidgetsLinkPager]] 去渲染从操作中传来的分页信息。小部件LinkPager
显示一个分页按钮的列表。点击任何一个按钮都会跳转到对应的分页。
尝试下
浏览器访问下面的 URL 看看能否工作:
http://hostname/index.php?r=country/index
首先你会看到显示着五个国家的列表页面。在国家下面,你还会看到一个包含四个按钮的分页器。如果你点击按钮 “2”,将会跳转到显示另外五个国家的页面,也就是第二页记录。如果观察仔细点你还会看到浏览器的 URL 变成了:
http://hostname/index.php?r=country/index&page=2
在这个场景里,[[yiidataPagination|Pagination]] 提供了为数据结果集分页的所有功能:
- 首先 [[yiidataPagination|Pagination]] 把 SELECT 的子查询
LIMIT 5 OFFSET 0
数据表示成第一页。因此开头的五条数据会被取出并显示。 - 然后小部件 [[yiiwidgetsLinkPager|LinkPager]] 使用 [[yiidataPagination::createUrl()|Pagination::createUrl()]] 方法生成的 URL 去渲染翻页按钮。URL 中包含必要的参数
page
才能查询不同的页面编号。 - 如果你点击按钮 “2”,将会发起一个路由为
country/index
的新请求。[[yiidataPagination|Pagination]] 接收到 URL 中的page
参数把当前的页码设为 2。新的数据库请求将会以LIMIT 5 OFFSET 5
查询并显示。
总结
本章节中你学到了如何使用数据库。你还学到了如何取出并使用 [[yiidataPagination]] 和 [[yiiwidgetsLinkPager]] 显示数据。
下一章中你会学到如何使用 Yii 中强大的代码生成器 Gii,去帮助你实现一些常用的功能需求,例如增查改删(CRUD)数据表中的数据。事实上你之前所写的代码全部都可以由 Gii 自动生成。