yii框架学习
一、yii1.1
视频教学 http://www.cnblogs.com/phpyii/articles/4164111.html
yii学习网站 http://www.yiifans.com/forum.php
http://open.itcast.cn/home/Open/index/mark/6.html
1.下载yii-1.1.6.r2877压缩包解压到web文件夹,出现demos 、 framework、 requirements三个文件夹,
2.浏览器访问requirements下的index.php文件,监测当前php配置是否满足框架要求
3.用命令创建web项目文件
window下:
①.环境变量中添加php.exe所在目录;
②.cmd命令窗口中进入framework目录下,使用命令yiic webapp web目录/项目名称
③.选择yes 即可
Linux下:
①.添加执行权限: chmod -R +x /yiic目录/
②.执行创建命令: /yiic目录/yiic webapp /web项目目录/web项目名称
③.选择yes 即可
二、YII2(basic版)
1.下载包解压到web根目录
2.更改config/web.php配置文件,
修改'cookieValidationKey' => ''
为
'cookieValidationKey' => 'xxxxx'
xxxxx代表任意字符
3.重要文件代码理解
(1)index.php中的代码:
defined('YII_DEBUG') or define('YII_DEBUG', true);//设置项目为调试模式
defined('YII_ENV') or define('YII_ENV', 'dev'); //设置项目环境为开发环境
(2)配置文件的代码:
①$config = []
全局配置信息,任何环境下都起作用
②if (YII_ENV_DEV) {}
仅在开发环境(即index.php中添加了defined('YII_ENV') or define('YII_ENV', 'dev');这段代码)下起作用的配置信息
(3)获取网站IP
PHP原生的方式:$_SERVER["SERVER_ADDR"]
YII2方法
(4)跳转页面:
php原生函数:header("Location:http://www.baidu.com");
exit; //header后的PHP代码还会被执行,exit结束后续代码的执行
YII方式:在controller控制器类内部使用$this->redirect("/admin/test/index");
带参数跳转$this->redirect(['index',array('id'=>12,'name'=>'james')]);
4.模型有两种,均继承于原始基类 Model
继承Model的模型:表单操作
继承ActiveRecord的模型:数据库操作,
用AR对象进行CURD操作:参考https://github.com/yiisoft/yii2/blob/master/docs/guide-zh-CN/db-dao.md
在controller类中调用AR对象,
(1).查询:find()和findBySql()方法都会返回yii\db\ActiveQuery实例,该实例包含数据库操作方法,
all()方法返回的是查询结果对象形成的数组(每个元素都是对象),one()方法返回的是查询结果对象,
如果要求返回数据结构是键值对数组,可以使用asArray()方法,例如$User::find()->asArray()->all();
①ActiveRecord::find()纯面向对象方式:
$customers = Customer::find()
->where(['status' => '1')
->orderBy('id')
->all();
②ActiveRecord::findBySql()原生sql方式:
$sql = 'SELECT * FROM customer';
$customers = Customer::findBySql($sql)->all();
(2).关联查询:
定义关联关系使用一个可以返回 [[yii\db\ActiveQuery]] 对象的 getter 方法, [[yii\db\ActiveQuery]]对象有关联上下文的相关信息,因此可以只查询关联数据。
class Customer extends \yii\db\ActiveRecord
{
public function getOrders()
{
// 客户和订单通过 Order.customer_id -> id 关联建立一对多关系
return $this->hasMany(Order::className(), ['customer_id' => 'id']);
}
}
class Order extends \yii\db\ActiveRecord
{
// 订单和客户通过 Customer.id -> customer_id 关联建立一对一关系
public function getCustomer()
{
return $this->hasOne(Customer::className(), ['id' => 'customer_id']);
}
}
以上使用了 [[yii\db\ActiveRecord::hasMany()]] 和 [[yii\db\ActiveRecord::hasOne()]] 方法。 以上两例分别是关联数据多对一关系和一对一关系的建模范例。 如,一个客户有很多订单,一个订单只归属一个客户
(3).非查询:save()、insert()、update()、delete()
// 插入新客户的记录
$customer = new Customer();
$customer->name = 'James';
$customer->email = 'james@example.com';
$customer->save(); // 等同于 $customer->insert();
// 更新现有客户记录
$customer = Customer::findOne($id);
$customer->email = 'james@example.com';
$customer->save(); // 等同于 $customer->update();
// 删除已有客户记录
$customer = Customer::findOne($id);
$customer->delete();
// 删除多个年龄大于20,性别为男(Male)的客户记录
Customer::deleteAll('age > :age AND gender = :gender', [':age' => 20, ':gender' => 'M']);
// 所有客户的age(年龄)字段加1:
Customer::updateAllCounters(['age' => 1]);
须知:save()
方法会调用 insert()
和 update()
中的一个, 用哪个取决于当前 AR 对象是不是新对象(在函数内部,他会检查 [[yii\db\ActiveRecord::isNewRecord]] 的值)。 若 AR 对象是由 new
操作符 初始化出来的,save()
方法会在表里插入一条数据; 如果一个 AR 是由 find()
方法获取来的, 则 save()
会更新表里的对应行记录。
AR继承自[[yii\base\Model]],所以它同样也支持Model的数据输入、验证等特性,当你调用 save()
、insert()
、update()
这三个方法时,会自动调用[[yii\base\Model::validate()|validate()]]方法。如果验证失败,数据将不会保存进数据库。下面的例子演示了如何使用AR 获取/验证用户输入的数据并将他们保存进数据库:
// 新建一条记录
$model = new Customer;
if ($model->load(Yii::$app->request->post()) && $model->save()) {
// 获取用户输入的数据,验证并保存
}
// 更新主键为$id的AR
$model = Customer::findOne($id);
if ($model === null) {
throw new NotFoundHttpException;
}
if ($model->load(Yii::$app->request->post()) && $model->save()) {
// 获取用户输入的数据,验证并保存
}
5.使用gii自动生成代码
访问http://服务器IP/index.php?r=gii
报错:"Forbidden (#403)",
原因:yii默认只允许本机电脑访问gii页面,即http://localhost/index.php?r=gii
配置远程机器访问服务器gii页面:
修改配置文件 config目录下的web.php (对应高级版的配置文件是frontend/config/main-local.php)
将$config['modules']['gii'] = 'yii\gii\Module';
更改为
$config['modules']['gii'] = [
'class' =>'yii\gii\Module',
'allowedIPs' =>['127.0.0.1','::1','192.168.142.1']
]
这样就允许IP为192.168.142.1的电脑访问服务器YII项目的gii页面了
gii页面显示六项:
Model:根据表结果来生成模型类
CRUD:生成Controller,并在Controller里面实现基类的CRUD,同时也会生成view文件
Controller:这个是单独生成一个Controller文件的和相关的view文件
Form:这个是根据输入的模型生成这个相应的表单
Module:这个用来生成Module
Extension:这个用来生成一个Extension的结构
①生成model:默认继承\yii\db\ActiveRecord类,
操作注意事项:
.如果没有在配置文件中设置表前缀,Model Generator页面的table name一空要填数据表的全名称
.如果数据表结构发生了变化,可以重新生成model,preview时能看到新旧model的代码区别,选择override覆盖掉旧model即可
.勾选项Use Table Prefix ,决定model类中的方法tableName()的返回值,未勾选时,返回纯粹的表名称,勾选时,返回{{%xxx}},
例如,表名称hh_user,勾选Use Table Prefix 后,生成的model类中tableName()函数返回的是{{%hh_user}},如果config/db.php中配置了pre_fix的值为hh_ ,
则这个返回值是{{%user}},没有配置的话,默认表前缀是空字符串。
.批量生成所有表的model类:在Table Name填写上xx_*,表示以xx_为前缀的所有表都生成model类,要注意的是如果要使生成的model类名称不包含xx前缀字符串,就必须在config/db.php中配置表前缀'tablePrefix'=>'xx_'
②生成CRUD:
操作注意事项:必填项Model Class、Controller Class,必须写上完整的命名空间名, 例如:app\models\User 、app\controllers\FaController
Search Model Class 是指继承指定表model类的searchModel类,作用是list页面最上面一行的查询功能
默认生成的XXController类在controllers目录中,
默认在views目录创建XX名称的对应XXController控制器的视图目录,包含create.php、_form.php、index.php、update.php、view.php五个视图文件
视图文件夹命名规则:ControllerID对应小写字母,形如控制器类 PostCommentController对应的为post-comment
③生成model对应的表单form:ViewName指定form文件名称,ModelClass指定要对应的model类
④生成Module:basic模版缺少modules文件夹,自己创建这个文件夹,
Module Class 填写完整命名空间下的module类名,例如app\modules\admin\AdminModule
MOdule ID 默认是module类文件所在文件夹名称,例如上边的是admin
创建完module后,必须在config/web.php配置文件中配置module才能访问,
比如,在$config = [...]中添加:
'modules' =>[
'admin' => [
'class' => 'app\modules\admin\AdminModule',
],
],
6.路由URL
(1).开启pretty路由,显示成目录形式url:
config/web.php中的components[...]添加以下代码:
'urlManager' => [
'enablePrettyUrl' => true,
],
效果:
http://localhost/index.php/fa/index
等效于http://localhost/index.php?r=fa/index
(2).隐藏index.php等脚本名称:
7.视图布局layout
使用render方法渲染视图是默认会调用布局文件,默认的布局文件在@app/views/layout/main.php,
布局文件使用先后顺序:首先是查找controller中的$this->layout变量值,如果没有赋值则查找@app/views/layout,如果有指定的布局文件直接使用,如果没有再查找对应模块中的views/layout布局文件
设置使用布局文件的方式:
(1)可以在controller中的类全局变量或action方法中指定要使用的布局文件$this->layout="test";默认在controller对应的views/layout中找test.php布局文件,
(2)也可在modules中指定布局文件,例如可在AdminModule.php中的init方法中赋值layout变量,
public function init()
{
parent::init();
$this->layout = 'main';
}
默认会使用admin模块中views\layout布局文件main.php,
如果$this->layout = '/main';则会使用@app/views/layout中的布局文件
如果不想使用布局文件进行渲染,用函数renderPartial()
渲染视图的方法汇总:
render() 渲染一个 视图名 并使用一个 布局 返回到渲染结果。
renderPartial() 渲染一个 视图名 并且不使用布局。
renderAjax() 渲染一个 视图名 并且不使用布局, 并注入所有注册的JS/CSS脚本和文件,通常使用在响应AJAX网页请求的情况下。
renderFile()渲染一个视图文件目录或别名下的视图文件。
8.Yii 表单交互的三种方式
参考http://blog.sina.com.cn/s/blog_66ac09390101gbb9.html
三、开发流程
1.创建目录结构
2.配置配置文件
3.创建model类,使用gii工具
4.创建controller类,使用gii工具
5.实现actions和相应的views
6.在controller类里配置需要的action filters
7.如果需要主题功能,编写themes
8.如果需要internationalization国际化功能,编写翻译语句
9.使用caching技术缓存数据和页面
10.最后tune up 调整程序和发布.
四、错误集锦:
1."Namespace declaration statement has to be the very first statement in the script"
错因:命名空间的定义要写在php文件的首行
比如以下的<?php上面不能空行
<?php
namespace app\models;
。。。
2."Unable to verify your data submission."
原因:form表单中包含name=_csrf的隐藏域,YII2默认要求对POST过来的form进行csrf验证,防止跨域脚本攻击
顶层的controller基类中包含属性 public $enableCsrfValidation = true;
可以在当前控制器中改变这个属性的值,消除这个验证要求,public $enableCsrfValidation=false;
3.Method Not Allowed (#405)
Method Not Allowed. This url can only handle the following request methods: POST.
原因:
删除数据时,触发actionDelete()动作,默认是必须POST提交数据进行删除的
解决办法:方法1:利用ajax方式post提交然后刷新本页面
方法2:改用其他action处理删除动作