Yii 框架学习--02 进阶
本文以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提供的代码自动生成器,可以通过简单的输入生成Controller
、Model
、View
等文件代码,并提供代码预览功能。
开启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 进阶的更多相关文章
- Yii框架学习 新手教程(一)
本人小菜鸟一仅仅,为了自我学习和交流PHP(jquery,linux,lamp,shell,javascript,server)等一系列的知识,小菜鸟创建了一个群.希望光临本博客的人能够进来交流.寻求 ...
- Yii框架学习笔记(二)将html前端模板整合到框架中
选择Yii 2.0版本框架的7个理由 http://blog.chedushi.com/archives/8988 刚接触Yii谈一下对Yii框架的看法和感受 http://bbs.csdn.net/ ...
- Yii 框架学习--01 框架入门
Yii 是一个高性能的,适用于开发 WEB2.0 应用的 PHP 框架. Yii目前有两个主要的版本: 2.0 和 1.1.本文以YII 2.0.7为例. 环境需求 Yii2.0 框架有一些系统上的需 ...
- Yii框架学习资源盘点
盘点一些Yii框架的常用学习资源. 1.Yii中文论坛 https://www.yiichina.com/ 2.Yii中文网 http://www.yii-china.com/ 3.魏曦教你学Yii2 ...
- PHP开发框架之YII框架学习——碾压ThinkPHP不是梦
前 言 JRedu 程序猿是一种慵懒的生物!能少敲一行代码,绝对不会多敲一个字符!所以,越来越多的开发框架应运而生,在帮助我们完成功能的同时,极大程度上也帮我们节省了人力物力,而且也提高了系统的 ...
- <yii 框架学习> yii 框架改为中文提示
工作需要用到yii框架,但发现yii框架自带的提示都是英文的.上网找资料才发现其实可以自己陪置 . 将项目protected/config/main.php里的app配置加上language=> ...
- YII框架学习(二)
YII框架的增删改查 例:一个新闻表的增删改查: (1)首先使用gii工具生成控制器和模型 (2)控制器 <?php class NewsController extends Controlle ...
- YII框架学习(一)
1.安装: windows:将php命令所在的文件夹路径加入到环境变量中,通过cmd命令:进入yii框架中的framework目录,执行: php yiic webapp ../cms linux:类 ...
- yii框架学习(MVC)
路由:两种方式,第一种是默认方式访问,假设配置了虚拟主机,那么localhost/web/index.php?r=admin/index 访问的是controllers目录下的admin控制器里 ...
随机推荐
- VIM的一些操作小技巧
vim的设计理念是:组合. 命令的组合,模式的组合, 普通模式 左: h 上:k 下:j 右 : l i : 当前光标处插入 I: 到光标所在行的行首进入插入模式 a: 在当前光标的后一位 ...
- C语言小练习二
题目要求: 编程实现功能:将4行4列数组的左下三角设置为下图所示的数据.43 7 2 6 91 5 8 10 程序源码: #include <stdio.h> int main(void) ...
- webDriver环境搭建与测试
1.安装jdk 2.安装eclipse 3.安装selenium 由于使用的是开发语言是java,因此需要安装java版的selenium包.下载地址:http://pan.baidu.com/s/1 ...
- 原生态jdbc的应用技术
为了更好的了解jdbc,最近查阅了前期学习的资料,整理归纳了一下,整理出来了一套jdbc常用的工具类.之所以在这里撰文,一来可以和大家共享技术的魅力,二来可以方便以后的查阅方便.以下是一个jdbc的优 ...
- Android本地数据存储复习
Android本地数据存储复习 Android无论是应用层还是系统层都需要在本地保存一些数据,尤其在应用层中使用的就更为普遍,大体有这么几种:SharedPreference,file,sqlite数 ...
- 关于mock server
这篇技术博客是在知乎上看到的 知乎js大神张云龙写的 这里贴过来记录下,如果侵权 请告知将及时删除. --------------------------- 为了更好的分工合作,让前端能在不依赖后端环 ...
- 算法入门笔记------------Day1
1.C语言使用%d显示float值,不会把float值转换为近似的int值,而是显示垃圾值,使用%f显示int值,也不会把该int值转换为浮点值 2.三位数反转:输入一个三位数,分离它的百位,十位和个 ...
- java-7311练习(上)
java练习,仅供参考! 欢迎同学们交流讨论. JDK 1.8 API帮助文档 JDK 1.6 API中文文档 Java GUI -------------------------2016-10-23 ...
- Bootstrap自带的一些预定义的按钮颜色
浅蓝色 btn-info 被用在那些用户可能会采取的操作上. 红色btn-danger被用来提醒用户该操作具有“破坏性”,例如删除一张猫的图片.
- Ubuntu下不重装系统安装SSD总结
一.要想给自己的机子装个固态,但又不想重装系统,各种配置,那么就要先把自己的系统从HDD复制到SSD上,这里说下我的情况.我的HDD 是500G ubuntu系统,安装的时候没有分区,默认是dev/s ...