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处理删除动作

posted on 2015-02-25 22:25  JYsharp  阅读(583)  评论(0编辑  收藏  举报