本文以YII 2.0.7为例。

应用结构

入口文件

文件位置: web/index.php

<?php

//开启debug,应用会保留更多日志信息,如果抛出异常,会显示详细的错误调用堆栈
defined('YII_DEBUG') or define('YII_DEBUG', true); //环境定义
defined('YII_ENV') or define('YII_ENV', 'dev'); //dev,prod // 注册 Composer 自动加载器
require(__DIR__ . '/../vendor/autoload.php'); // 包含 Yii 类文件
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php'); // 加载应用配置
$config = require(__DIR__ . '/../config/web.php'); // 创建、配置、运行一个应用
(new yii\web\Application($config))->run();

需要注意的是,如果想通过命令行方式(cli)访问应用,入口文件是根目录下的yii。里面的内容实质是php代码,与config/web.php类似。Windows下请使用yii.bat。该文件在Linux下需要有执行权限,这样用户就能通过命令./yii <route> [arguments] [options] 来运行cli应用。

配置文件

config/web.php

下面列出全部配置属性,实际项目请选择性配置。

<?php

//加载全局配置文件
$params = require(__DIR__ . '/params.php'); //配置开始
$config = [
/* 必要属性 */
'id' => 'basic', //用来区分其他应用的唯一标识ID。主要给程序使用
'basePath' => dirname(__DIR__), //指定该应用的根目录。根目录包含应用系统所有受保护的源代码。 在根目录下可以看到对应MVC设计模式的models, views, controllers等子目录 /* 重要属性 */
'aliases' => [
'@name1' => 'path/to/path1',
'@name2' => 'path/to/path2',
], //使用这个属性来定义别名,代替 Yii::setAlias() 方法来设置
'bootstrap' => ['log'], //指定启动阶段yii\base\Application::bootstrap()需要运行的组件
'catchAll' => [
'offline/notice',
'param1' => 'value1',
'param2' => 'value2',
], //重定向所有请求到某个控制器方法,通常用于系统维护
'components' => [
'request' => [
'cookieValidationKey' => 'test',
],
'cache' => [
'class' => 'yii\caching\FileCache',
],
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
],
'errorHandler' => [
'errorAction' => 'site/error',
],
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
'useFileTransport' => true,
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'db' => require(__DIR__ . '/db.php'),
/*
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
],
],
*/
], //注册多个在其他地方使用的应用组件
'controllerMap' => [
[
'account' => 'app\controllers\UserController',
'article' => [
'class' => 'app\controllers\PostController',
'enableCsrfValidation' => false,
],
],
], //重映射控制器ID到任意控制器类
'language'=> 'en', //语言
'modules' => [
// "booking" 模块以及对应的类
'booking' => 'app\modules\booking\BookingModule', // "comment" 模块以及对应的配置数组
'comment' => [
'class' => 'app\modules\comment\CommentModule',
'db' => 'db',
],
], //指定应用所包含的 模块
'name' => '', //给终端用户展示的应用名称,可选
'version' => '1.0', //版本,可选
'sourceLanguage' => 'en', //应用代码的语言,可选
'timeZone' => 'Asia/Shanghai', //默认时区,可选
'params' => $params, //全局通用参数 /* 实用属性 : 通常使用系统默认值 */
'charset' => 'UTF-8', //默认值为 'UTF-8'
'defaultRoute' => 'site', //对于网页应用,默认值为 'site' 对应 SiteController 控制器,并使用默认的动作
'extensions' => [
[
'name' => 'extension name',
'version' => 'version number',
'bootstrap' => 'BootstrapClassName', // 可选配,可为配置数组
'alias' => [ // 可选配
'@alias1' => 'to/path1',
'@alias2' => 'to/path2',
],
],
], //指定应用安装和使用的 扩展,默认自动生成和维护更新
'layout' => 'main', // 视图 默认使用的布局名字,默认值为 'main' 对应布局路径下的 main.php 文件
'layoutPath' => 'layouts', // 布局文件的路径,默认值为 视图路径 下的 layouts 子目录
'runtimePath' => '@app/runtime', //指定临时文件如日志文件、缓存文件等保存路径,默认值为带别名的 @app/runtime
'viewPath' => '@app/views', //视图文件的根目录,默认值为带别名的 @app/views
'vendorPath' => '@app/vendor', //第三方库。 默认值为带别名的 @app/vendor
'enableCoreCommands' => true, //是否启用Yii中的核心命令,默认值为 true /* 应用事件:类似于钩子 */
'on beforeRequest' => function ($event) {
// ...
},
]; if (YII_ENV_DEV) {
// configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug';
$config['modules']['debug'] = [
'class' => 'yii\debug\Module',
]; $config['bootstrap'][] = 'gii';
$config['modules']['gii'] = [
'class' => 'yii\gii\Module',
'allowedIPs' => ['127.0.0.1', '::1', '192.168.0.*', '192.168.178.20'] // 允许访问的 IP 地址
];
} return $config;

使用配置:

components:使用\Yii::$app->ComponentID 全局访问
params:\Yii::$app->params['key']

使用GII

gii是yii提供的代码自动生成器,可以通过简单的输入生成ControllerModelView等文件代码,并提供代码预览功能。

开启gii需要将 YII_ENV_DEV 设为 true:

defined('YII_ENV') or define('YII_ENV', 'dev');

我们通过 URL 访问 Gii:http://hostname/index.php?r=gii

由于Gii 是 Yii 中的一个模块。可以通过配置应用的 yii\base\Application::modules 属性开启它。通常来讲在 config/web.php 文件中会有以下配置代码:

$config = [ ... ];

if (YII_ENV_DEV) {
$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = [
'class' => 'yii\gii\Module',
'allowedIPs' => ['127.0.0.1', '::1', '192.168.0.*', '192.168.178.20'] // 允许访问的 IP 地址,可选
];
}

这段配置表明,如果当前是开发环境,应用会包含 gii 模块,模块类是 yii\gii\Module

关于GII的用法请查看:http://www.yiichina.com/doc/guide/2.0/start-gii

数据库连接

切换数据库

默认使用的是config/db.php里的数据库配置。配置连接组件后Yii里可以使用以下语法访问:

$connection = \Yii::$app->db;

同理,我们可以修改config/web.php

return [
// ...
'components' => [
'db' => require(__DIR__ . '/db.php'),
'db2' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=testdb',
'username' => 'demo',
'password' => 'demo',
],
];

定义多个数据库连接配置。

Model里:

通过重写 yii\db\ActiveRecord::getDb() 方法切换数据库连接:

class Customer extends ActiveRecord
{
// ... public static function getDb()
{
return \Yii::$app->db2; // 使用名为 "db2" 的应用组件
}
}

http://www.yiichina.com/doc/guide/2.0/db-active-record

使用SQL直接操作数据库

ActiveRecord 提供了数据库与模型(MVC 中的 M,Model) 的交互,QueryBuilder 用于创建动态的查询语句。

yii除了可以使用模型对象的方式(ORM)操作数据库外,还可以使用原生的SQL语句。通过yii\db\Command::createCommand可以执行SQL语句。

查询:

$connection = \Yii::$app->db;

//返回DataReader对象,需要使用yii\db\DataReader解析
$data = $connection->createCommand('SELECT * FROM post')->query();
$rows = $data->readAll(); //返回数组 //查询返回多行:(数组)
$command = $connection->createCommand('SELECT * FROM post');
$posts = $command->queryAll(); //返回单行:(数组)
$command = $connection->createCommand('SELECT * FROM post WHERE id=1');
$post = $command->queryOne(); //返回某个字段的集合:未指定字段返回第一个字段(数组)
$command = $connection->createCommand('SELECT title FROM post');
$titles = $command->queryColumn(); //查询标量值/计算值: (标量)
$command = $connection->createCommand('SELECT COUNT(*) FROM post');
$postCount = $command->queryScalar();

可以使用insert,update,delete 方法,这些方法会根据参数生成合适的SQL并执行:

// INSERT
$connection->createCommand()->insert('user', [
'name' => 'Sam',
'age' => 30,
])->execute(); // INSERT 一次插入多行
$connection->createCommand()->batchInsert('user', ['name', 'age'], [
['Tom', 30],
['Jane', 20],
['Linda', 25],
])->execute(); // UPDATE
$connection->createCommand()->update('user', ['status' => 1], 'age > 30')->execute(); // DELETE
$connection->createCommand()->delete('user', 'status = 0')->execute();

预处理语句

为安全传递查询参数可以使用预处理语句,首先应当使用:placeholder占位,再将变量绑定到对应占位符:

$command = $connection->createCommand('SELECT * FROM post WHERE id=:id');
$command->bindValue(':id', $_GET['id']);
$post = $command->query();
另一种用法是准备一次预处理语句而执行多次查询: $command = $connection->createCommand('DELETE FROM post WHERE id=:id');
$command->bindParam(':id', $id); $id = 1;
$command->execute(); $id = 2;
$command->execute();

切换数据库类型

修改config/web.php

return [
// ...
'components' => [
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=mydatabase', // MySQL, MariaDB
//'dsn' => 'sqlite:/path/to/database/file', // SQLite
//'dsn' => 'pgsql:host=localhost;port=5432;dbname=mydatabase', // PostgreSQL
//'dsn' => 'cubrid:dbname=demodb;host=localhost;port=33000', // CUBRID
//'dsn' => 'sqlsrv:Server=localhost;Database=mydatabase', // MS SQL Server, sqlsrv driver
//'dsn' => 'dblib:host=localhost;dbname=mydatabase', // MS SQL Server, dblib driver
//'dsn' => 'mssql:host=localhost;dbname=mydatabase', // MS SQL Server, mssql driver
//'dsn' => 'oci:dbname=//localhost:1521/mydatabase', // Oracle
'username' => 'root', //数据库用户名
'password' => '', //数据库密码
'charset' => 'utf8',
],
],
// ...
];

http://www.yiichina.com/doc/guide/2.0/db-dao

数据库复制和读写分离

很多数据库支持数据库复制 database replication来提高可用性和响应速度. 在数据库复制中,数据总是从主服务器 到 从服务器. 所有的插入和更新等写操作在主服务器执行,而读操作在从服务器执行.

通过配置yii\db\Connection可以实现数据库复制和读写分离.

[
'class' => 'yii\db\Connection', // 配置主服务器
'dsn' => 'dsn for master server',
'username' => 'master',
'password' => '', // 配置从服务器
'slaveConfig' => [
'username' => 'slave',
'password' => '',
'attributes' => [
// use a smaller connection timeout
PDO::ATTR_TIMEOUT => 10,
],
], // 配置从服务器组
'slaves' => [
['dsn' => 'dsn for slave server 1'],
['dsn' => 'dsn for slave server 2'],
['dsn' => 'dsn for slave server 3'],
['dsn' => 'dsn for slave server 4'],
],
]

以上的配置实现了一主多从的结构,从服务器用以执行读查询,主服务器执行写入查询,读写分离的功能由后台代码自动完成。调用者无须关心。

http://www.yiichina.com/doc/guide/2.0/db-dao

类库扩展

新建helper

示例:新建一个Utils类。该文件可以在任何目录,例如 @app/components

我们在根目录新建components文件夹,并新建components/Utils.php:

<?php

namespace yii\helpers;

class Utils{

    public static function test() {
echo 'test';
}
}

引入:

在应用程序入口文件(index.php)处,在引入的 yii.php 文件后面 添加以下代码行,用 Yii 自动加载器 来加载自定义类 代替框架的原始助手类:

Yii::$classMap['yii\helpers\Utils'] = '@app/components/Utils.php';

未完待续。。。

Yii 框架学习--02 进阶的更多相关文章

  1. Yii框架学习 新手教程(一)

    本人小菜鸟一仅仅,为了自我学习和交流PHP(jquery,linux,lamp,shell,javascript,server)等一系列的知识,小菜鸟创建了一个群.希望光临本博客的人能够进来交流.寻求 ...

  2. Yii框架学习笔记(二)将html前端模板整合到框架中

    选择Yii 2.0版本框架的7个理由 http://blog.chedushi.com/archives/8988 刚接触Yii谈一下对Yii框架的看法和感受 http://bbs.csdn.net/ ...

  3. Yii 框架学习--01 框架入门

    Yii 是一个高性能的,适用于开发 WEB2.0 应用的 PHP 框架. Yii目前有两个主要的版本: 2.0 和 1.1.本文以YII 2.0.7为例. 环境需求 Yii2.0 框架有一些系统上的需 ...

  4. Yii框架学习资源盘点

    盘点一些Yii框架的常用学习资源. 1.Yii中文论坛 https://www.yiichina.com/ 2.Yii中文网 http://www.yii-china.com/ 3.魏曦教你学Yii2 ...

  5. PHP开发框架之YII框架学习——碾压ThinkPHP不是梦

      前  言 JRedu 程序猿是一种慵懒的生物!能少敲一行代码,绝对不会多敲一个字符!所以,越来越多的开发框架应运而生,在帮助我们完成功能的同时,极大程度上也帮我们节省了人力物力,而且也提高了系统的 ...

  6. <yii 框架学习> yii 框架改为中文提示

    工作需要用到yii框架,但发现yii框架自带的提示都是英文的.上网找资料才发现其实可以自己陪置 . 将项目protected/config/main.php里的app配置加上language=> ...

  7. YII框架学习(二)

    YII框架的增删改查 例:一个新闻表的增删改查: (1)首先使用gii工具生成控制器和模型 (2)控制器 <?php class NewsController extends Controlle ...

  8. YII框架学习(一)

    1.安装: windows:将php命令所在的文件夹路径加入到环境变量中,通过cmd命令:进入yii框架中的framework目录,执行: php yiic webapp ../cms linux:类 ...

  9. yii框架学习(MVC)

    路由:两种方式,第一种是默认方式访问,假设配置了虚拟主机,那么localhost/web/index.php?r=admin/index    访问的是controllers目录下的admin控制器里 ...

随机推荐

  1. Java 第17章 继承

    继承的概念 继承机制是面向对象程序设计不可缺少的关键概念,是实现软件可重用的根基, 是提高软件系统的可扩展性与可维护性的主要途径. 所谓继承是指一个类的定义可以基于另外一个已经存在的类,即子类基于父类 ...

  2. VMware 12 的vmware tools安装和如何使用(系统是CENTOS6.5)

    1.用了一下虚拟机vmware12,但是总是没法使用它的vmware Tool ,网上一直说在哪个哪个文件夹,其实并没有 2.于是我用命令行找到了在系统中的VMware Tools 3.首先,保证li ...

  3. Java学习笔记 05 数据包装类

    一.包装类 综述 >>java.lang包中的Integer类.Long类和Short类,分别将基本数据类型int.long和short封装成一个类.这些类都是Number的子类. Int ...

  4. 基于Django的web开发

    github地址:https://github.com/shirleyandgithub/PythonWeb

  5. Spring学习笔记 1. 尚硅谷_佟刚_Spring_HelloWorld

    1,准备工作 (1)安装spring插件 搜索https://spring.io/tools/sts/all就可以下载最新的版本 下载之后不用解压,使用Eclipse进行安装.在菜单栏最右面的Help ...

  6. Oracle/SQL 修改字段类型和长度

    标准SQL修改字段类型和长度语句: ALTER TABLE tableName modify column columnName 类型;例如Mysql的修改字段类型语句:alter table tes ...

  7. C#匿名函数的坑

    在for循环中catch索引 for (int i = 0; i < n; i++) { foo(() =>{ if (i == x) //这里的i始终都是最后一个... { //bala ...

  8. python 装饰器学习(decorator)

    最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...

  9. 8.4.4 Picasso

    Picasso 收到加载及显示图片的任务,创建 Request 并将它交给 Dispatcher,Dispatcher 分发任务到具体 RequestHandler,任务通过 MemoryCache ...

  10. 【转载】CentOS6.5_X64下安装配置MongoDB数据库

    [转载]CentOS6.5_X64下安装配置MongoDB数据库 2014-05-16 10:07:09|  分类: 默认分类|举报|字号 订阅      下载LOFTER客户端 本文转载自zhm&l ...