您现在的位置是:网站首页 > 学无止境
PHP YII框架 学习笔记
1.yii2.0安装
Compose安装
composer条件composer软件 github账户
归档文件安装
归档文件:
基础版basic
config-->web.php-->cookieValidationKey-->'zhamin'
访问入口文件
controllers 控制器
models 模型
views 视图
commands 控制台命令
tests 测试相关的文件
assets 资源文件
config 配置文件
web 应用的目录 应用入口文件
assets 应用资源文件
index.php应用的入口文件
runtime 临时文件 日志文件
vendor Yii框架 第三方扩展
yii 控制台命令执行脚本
yii:请求-》响应:11个核心步骤
步骤1:index.php入口文件:读取配置文件及执行实例化应用主体
步骤2:应用主体,通过(请求处理机制)解析路由,创建了控制器
步骤3:控制器创建了动作也就是方法
步骤4:交了控制器,执行过滤【权限、提交方式】:是否继续往后执行动作,读取模型数据,渲染视图,经过响应组件,生成界面
--------------------------------------------------
入口文件:
定义了全局常量
注册了自动加载器,引入了yii核心类
加载了配置文件
创建了应用实例并配置(new yiiwebApplication($config))->run();
可以使用Yii::$app访问应用对象
这个对象有什么属性和方法呢?
答案:交给控制器和视图
--------------------------------------------------
控制器
控制器是由yiiwebcontroller继续而来的,负责处理请求和生成响应
*控制器是用action_开头这些动作组成的,动作是控制器中类中的一个方法,一个方法一般是对应一个页面
控制器中behaviors是行为,主要是负责执行过滤
controller中actionIndex()方法return $this->render('')
$this代表控制器对象本省
render()代表控制器调用了自己的一个渲染视图方法
--------------------------------------------------
视图
视图是yiiwebview应用组件的帮助下,依赖于视图模板文件,进行构造和渲染完成一个页面
习惯上称视图模板为视图
组成部分:HTML标签或模型中数据
<doctype><html><header><title>和导航菜单这些HTML标签都交给了【布局render方法】
--------------------------------------------------
布局
布局是一种特殊的视图。使用layouts/main.php表现了多个视图的公共部分
布局默认存储位置在@app/views/layouts目录中
如何更改布局?
步骤1.在@app/views/layouts目录下新建:自定义名.php
[如:zm.php]
<h2>测试zm布局2</h2>
<?= $content; ?>
步骤2:在控制器类方法中,渲染视图上一行加代码如下:$this->layout = 'zm';
小提示:如果界面无需布局,则可以设置$this->layout = false;
--------------------------------------------------
布局文件数据:
$this是指yiiwebview实例化出来的一个对象,用于管理和渲染这个视图文件
$content是指视图模板文件渲染出来的结果
小提示:布局文件是用来解决页面中具有相同部分的问题
--------------------------------------------------
应用主体配置
@app/common/main.php'language' => 'zh-CN',
前面页面源码
<html lang="zh-CN">
--------------------------------------------------
应用主体属性
@app/config/main.php
@id:应用主体标识ID
@basePath:应用根目录
@defaultRoute:缺省路由默认路由'index/show'
@components:允许注册功能组件,如urlManager美化组件
--------------------------------------------------
控制器
以actionContact为例:
分析代码:
new ContactForm()是实例化了$model模型
$model->load() 调用了模型中的加载方法,加载了2个对象
1.加载了Yii::$app->request->post() 表单中post提交请求对象
2.$model->validate() 执行数据验证
3.$this->refresh() 刷新界面
--------------------------------------------------
模型
模型是MVC中一部分,是表现业务数据、规则和逻辑对象,可以通过继承yiiaseModel或它的子类定义模型类
例子:
class ContactForm extends Model
{
public $name; //模型属性:业务数据
public $email;
public $subject;
public $body;
public $verifyCode;
public function rules(){...} //业务规则
//模型属性:页面展示,块赋值
public function attributeLabels(){...}
//业务逻辑功能:发邮件给站长
public function sendEmail($email){...}
}
--------------------------------------------------
表单
位置:@app/views/site/contact.php
表单通过yiiwidgetsActiveForm类创建表单
ActiveForm::begin() 表单的开始
ActiveForm:end() 表单的结束
<?= $form->field($model,'email') ?>
以上行模板视图语法,将交给{ActiveForm对象}解析成为HTML代码中 表单标签和Jquery验证部分
表单标签:
<input type="text" id="contactform-email" class="form-control" name="ContactForm[email]" aria-required="true">
Jquery验证:
<script>
jQuery('#contact-form').yiiActiveForm([
{
"id":"contactform-email","name":"email","container":".field-contactform-email",
"input":"#contactform-email",
"error":".help-block.help-block-error",
"validate":function (attribute, value, messages, deferred, $form) {
yii.validation.required(value, messages{
"message":"Email不能为空。"
});
</script>
------
块赋值:
<input type="text" id="contactform-email" class="form-control" name="ContactForm[email]" aria-required="true">
利用表单元素input名字是数组,键对应模型的属性,在执行$model->load方法时,就是执行这句三元运算赋值
$model->name = isset($ContactForm['email']) ? $ContactForm['email'] : null;
-------------------------------------------------
Html帮助类
实现视图模板HTML代码生成
它能帮我我们简单的生成各种HTML标签代码,标签属性和内容
案例1:
<?= Html::tag('p',Html::encode($user->name),['class']=>'username') ?>
解析为HTML代码:
<p class="username"><?php echo $user->name; ?></p>
案例2:
<?= Html::submitButton('submit',['class'=>'btn btn-primary','name'=>'contact-button']) ?>
解析为HTML代码:
<button type="submit"> class="'btn btn-primary" name="contact-button">Submit</button>
小提示:拼接变量不多情况下,建议可以只用PHP语法输出
==========================================================
高级版Advanced
==========================================================
别名:
别名用来表示文件路径或URL地址,@字符开头
Yii::setAlias()方法来设置路径别名
使用别名
$cache = new FileCache([
'cachePath' => '@runtime/cache',
])
---------------------------------------------------
配置文件
作用:是给应用主体的属性,进行初始化赋值
'db'=>[
'class'=>'yiidbConnection',
'dsn'=>'mysql:host=localhost;dbname=test',
'username'=>'root',
'password'=>'root',
'charset'=>'utf8',
],
配置文件加载顺序:
$config = yiihelpersArrayHelper::merge(
require(__DIR__ . '/../../common/config/main.php'),
require(__DIR__ . '/../../common/config/main-local.php'),
require(__DIR__ . '/../config/main.php'),
require(__DIR__ . '/../config/main-local.php')
);
----------------------------------------------------
Gii基于web的代码生成器【辅助工具】,可以用于生成模型、控制器、表单、增删改查类或功能代码
@app/config/main-local.php
if (!YII_ENV_TEST) {
// configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug';
$config['modules']['debug'] = [
'class' => 'yiidebugModule',
];
$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = [
'class' => 'yiigiiModule',
];
}
http://demo.yii2.com/frontend/web/index.php?r=gii
------------------------------------------------------
ActiveRecord
AR类:活动记录,提供了一套面向对象接口,用于访问数据库中的数据,关联着对应的数据表,每个AR对象对应着表中的每一行记录,AR对象属性对应着数据表中列,可以直接以面向对象的方式操作表的数据,不需要写SQL就能访问数据库
class Post extents yiidbActiveRecord
{
public static function tableName(){
return 'post';
}
}
控制器代码
AR查询Read:
$model = Post::find()->where(['id'=>1])->one();
$model1 = Post::findOne(1)
$models = Post::find()->where(['status'=>1])->all();
$models1 = Post::findAll(['status'=>1]);
$models2 = Post::find()->where(['and','id=1','id=2'])->all();
$models3 = Post::find()->where(['in','id',[1,2,3]])->all();
$models4 = Post::find()->where(['like','name',['test','sample']])->all();
$models5 = Post::find()->where(['>=','id',10])->all();
AR添加Create:
$post = new Post();
$post->name = 'test1';
$post->pwd = '123456';
$post->save();
AR更新Update:
$post = Post::findOne($id);
$post->name = 'example';
$post->save();
AR删除Delete:
$post = Post::findOne($id);
$post->delete();
-------------------------------------------------------------
查询构建器
$result=(new yiidbQuery())
->select(['name','id'])
->from('user')
->indexBy('id')
->column();
返回:
$result = [
'1'=>'已发布',
'2'=>'已编辑',
'3'=>'待审核',
]
-------------------------------------------------------------
小部件:
Yii提供了一套视图中可重复使用的单元,使用了面向对象的方式创建复杂和可配置的用户界面单元。
DetailView:用于显示一条记录的详细情况
echo DetailView::widget([
'model' => $model, //控制器传入view的数据对象
'attributes' => [ //小部件需要显示的属性
'title', // title attribute (in plain text)
'description:html', // description attribute in HTML
[ // the owner name of the model
'label' => 'Owner',
'value' => $model->owner->name,
],
'created_at:datetime', // creation date formatted as datetime
],
]);
--------------------------------------------------------------
常见问题:CSRF(跨站请求伪造)
解决1:配置文件main-local.php:
'components' => [
'request' => [
'enableCookieValidation' => true,
'cookieValidationKey' => 'cookvalid',
],
解决2:控制器加
public $enableCsrfValidation = false;
解决3:开启CSRF后,表单中加
<input type="hidden" name="jfinal_token" value="${jfinal_token }" />
或手动加_csrf
<input type="hidden" value="<?php echo Yii::$app->request->csrfToken; ?>" name="_csrf" >
上一篇:PHP封装类-面向对象编程