YII2 学习
下载地址:
http://www.yiiframework.com/download/ http://www.yiichina.com/download
直接选择basic模板下载即可
下载之后解压到www中即可
打开/config/web.php
找到cookieValidationKey,将它的值修改为jtthink(命名随意)
然后打开浏览器输入网址:http://localhost/basic/web 看到以下效果图说明安装成功
应用结构学习
# 第三方整理:
http://blog.csdn.net/lamp_yang_3533/article/details/52186829 # 官方整理:
http://www.yiichina.com/doc/guide/2.0/start-workflow
Yii 实现了模型-视图-控制器 (MVC)设计模式,这点在目录结构中也得以体现。 models 目录包含了所有模型类, views 目录包含了所有视图脚本, controllers 目录包含了所有控制器类。
生命周期学习
- 用户向入口脚本
web/index.php
发起请求。 - 入口脚本加载应用配置 并创建一个应用实例去处理请求。
- 应用通过请求组件 解析请求的路由。
- 应用创建一个控制器实例去处理请求。
- 控制器创建一个操作实例并针对操作执行过滤器。
- 如果任何一个过滤器返回失败,则操作退出。
- 如果所有过滤器都通过,操作将被执行。
- 操作会加载一个数据模型,或许是来自数据库。
- 操作会渲染一个视图,把数据模型提供给它。
- 渲染结果返回给响应组件。
- 响应组件发送渲染结果给用户浏览器。
demo1 : Hello World
# 官方demo
http://www.yiichina.com/doc/guide/2.0/start-hello
通过本章节你将接触 MVC 设计模式中的控制器和视图部分。 创建了一个操作作为控制器的一部分去处理特定请求。然后又创建了一个视图去构造响应内容。
1、创建操作
由文件/controllers/SayController.php
定义的。 以下是一个操作的声明:
<?php
namespace app\controllers;
use yii\web\controller; class SayController extends controller{
public function actionSay($message = 'hello')
{
return $this->render('say',['message'=>$message]);
}
}
say
操作被定义为 actionSay
方法。 Yii 使用 action
前缀区分普通方法和操作。
2、创建视图
say
视图应该存为 views/say/say.php
文件
<?php
use yii\helpers\Html;
?> <?= Html::encode($message) ?>
注意以上代码,message
参数在输出之前被 yii\helpers\Html::encode() 方法处理过。 这很有必要,当参数来自于最终用户时, 参数中可能隐含的恶意 JavaScript 代码会导致 跨站脚本(XSS)攻击。
3、试运行
创建完操作和视图后,你就可以通过下面的 URL 访问新页面了:
http://localhost/basic/web/index.php?r=say/say&message=Hello+World
上面 URL 中的参数 r
需要更多解释。 它代表路由,是整个应用级的, 指向特定操作的独立 ID。路由格式是 控制器 ID/操作 ID
。
DEMO2: 使用表单
# 官方demo
http://www.yiichina.com/doc/guide/2.0/start-forms
本demo介绍如何创建一个让用户提交数据的表单页。 该页将显示一个包含 name 输入框和 email 输入框的表单。 当提交这两部分信息后,页面将会显示用户所输入的信息。
1、创建模型
该类如下所示并存储在 models/EntryForm.php
文件中
<?php namespace app\models; use Yii;
use yii\base\Model; class EntryForm extends Model
{
public $name;
public $email; public function rules(){
return [
[['name','email'],'required'],
['email','email']
];
}
}
name
和email
值都是必填的email
的值必须满足email规则验证
2、创建操作
由文件/controllers/EntryController.php
定义的。 以下是一个操作的声明:
<?php namespace app\controllers; use Yii;
use yii\web\Controller;
use app\models\EntryForm; class EntryController extends Controller{
public function actionEntry(){
$model = new EntryForm; if($model->load(Yii::$app->request->post()) && $model->validate()){
return $this->render('entry-confirm',['model'=>$model]);
} else {
return $this->render('entry',['model' => $model]);
} }
}
该操作首先创建了一个 EntryForm
对象。然后尝试从 $_POST
搜集用户提交的数据, 由 Yii 的 yii\web\Request::post() 方法负责搜集。
注意:在这个简单例子里我们只是呈现了有效数据的确认页面。 实践中你应该考虑使用 yii\web\Controller::refresh() 或 yii\web\Controller::redirect() 去避免表单重复提交问题。
3、创建视图
最后创建两个视图文件 entry-confirm
和 entry
。 他们会被刚才创建的 entry
操作渲染。
entry-confirm
视图简单地显示提交的 name 和 email 数据。视图文件保存在 views/site/entry-confirm.php
。
<?php
use yii\helpers\Html;
?>
<p>You have entered the following information:</p> <ul>
<li><label>Name</label>: <?= Html::encode($model->name) ?></li>
<li><label>Email</label>: <?= Html::encode($model->email) ?></li>
</ul>
entry
视图显示一个 HTML 表单。视图文件保存在 views/site/entry.php
。
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
?>
<?php $form = ActiveForm::begin(); ?> <?= $form->field($model, 'name') ?> <?= $form->field($model, 'email') ?> <div class="form-group">
<?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?>
</div> <?php ActiveForm::end(); ?>
4、试运行
http://localhost/basic/web/index.php?r=entry/entry
你会看到一个包含两个输入框的表单的页面。 如果什么都不填就点击提交按钮,或填入格式不正确的 email 地址,将会看到在对应的输入框下显示错误信息。
输入有效的 name 和 email 信息并提交后, 将会看到一个显示你所提交数据的确认页面。
demo3:使用数据库
# 官方教程
http://www.yiichina.com/doc/guide/2.0/start-databases
本demo将介绍如何如何创建一个从数据表, 并且从中读取数据并显示到页面。 为了实现这个目标,你将会配置一个数据库连接,创建一个活动记录类, 并且创建一个操作及一个视图。
1、准备数据库
在目录位置/config/db.php中修改配置
首先创建一个名为 yii2basic
的数据库,执行下面的sql语句
CREATE TABLE `country` (
`code` CHAR(2) NOT NULL PRIMARY KEY,
`name` CHAR(52) NOT NULL,
`population` INT(11) NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `country` VALUES ('AU','Australia',18886000);
INSERT INTO `country` VALUES ('BR','Brazil',170115000);
INSERT INTO `country` VALUES ('CA','Canada',1147000);
INSERT INTO `country` VALUES ('CN','China',1277558000);
INSERT INTO `country` VALUES ('DE','Germany',82164700);
INSERT INTO `country` VALUES ('FR','France',59225700);
INSERT INTO `country` VALUES ('GB','United Kingdom',59623400);
INSERT INTO `country` VALUES ('IN','India',1013662000);
INSERT INTO `country` VALUES ('RU','Russia',146934000);
INSERT INTO `country` VALUES ('US','United States',278357000);
此时便有了一个名为 yii2basic
的数据库,在这个数据库中有一个包含三个字段的数据表 country
,表中有十行数据。
2、创建活动记录
创建一个继承自活动记录类的类 Country
, 把它放在 models/Country.php
文件,去代表和读取 country
表的数据。
<?php namespace app\models; use yii\db\ActiveRecord; class Country extends ActiveRecord
{
}
这个 Country
类继承自 yii\db\ActiveRecord。你不用在里面写任何代码。 只需要像现在这样,Yii 就能根据类名去猜测对应的数据表名。
3、创建操作
新建一个控制器,位于目录/Controllers/CountryController.php。控制器名为 CountryController
,并在其中创建一个 index
操作,如下:
<?php namespace app\controllers; use yii\web\Controller;
use yii\data\Pagination;
use app\models\Country; class CountryController extends Controller
{
public function actionIndex()
{
$query = Country::find(); $pagination = new Pagination([
'defaultPageSize' => 5,
'totalCount' => $query->count(),
]); $countries = $query->orderBy('name')
->offset($pagination->offset)
->limit($pagination->limit)
->all(); return $this->render('index', [
'countries' => $countries,
'pagination' => $pagination,
]);
}
}
index
操作调用了活动记录 Country::find()
方法,去生成查询语句并从 country
表中取回所有数据。 为了限定每个请求所返回的国家数量,查询在 yii\data\Pagination 对象的帮助下进行分页。 Pagination
对象的使命主要有两点:
- 为 SQL 查询语句设置
offset
和limit
从句, 确保每个请求只需返回一页数据(本例中每页是 5 行)。 - 在视图中显示一个由页码列表组成的分页器
在代码末尾,index
操作渲染一个名为 index
的视图, 并传递国家数据和分页信息进去。
4、创建视图
在 views
目录下先创建一个名为 country
的子目录。这个目录存储所有由 country
控制器渲染的视图。 在 views/country
目录下创建一个名为 index.php
的视图文件, 内容如下:
<?php
use yii\helpers\Html;
use yii\widgets\LinkPager;
?>
<h1>Countries</h1>
<ul>
<?php foreach ($countries as $country): ?>
<li>
<?= Html::encode("{$country->name} ({$country->code})") ?>:
<?= $country->population ?>
</li>
<?php endforeach; ?>
</ul> <?= LinkPager::widget(['pagination' => $pagination]) ?>
试运行
浏览器访问下面的 URL 看看能否工作:
http://localhost/basic/web/index.php?r=country/index
点击翻页:
DEMO4:代码生成工具gii
# 官方教程
http://www.yiichina.com/doc/guide/2.0/start-gii
开始 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',
];
}
这段配置表明,如果当前是开发环境, 应用会包含 gii
模块,模块类是 yii\gii\Module。
如果你检查应用的入口脚本 web/index.php
, 将看到这行代码将 YII_ENV_DEV
设为 true:
defined('YII_ENV') or define('YII_ENV', 'dev');
鉴于这行代码的定义,应用处于开发模式下,按照上面的配置会打开 Gii 模块。你可以直接通过 URL 访问 Gii:
http://hostname/index.php?r=gii
生成 CRUD 代码
CRUD 代表增,查,改,删操作,这是绝大多数 Web 站点常用的数据处理方式。选择 Gii 中的 “CRUD Generator” (点击 Gii 首页的链接)去创建 CRUD 功能。本例 “country” 中需要这样填写表单:
- Model Class:
app\models\Country
- Search Model Class:
app\models\CountrySearch
- Controller Class:
app\controllers\CountryController
- View Path:可以不填,或者填写如下格式:@app/views/country
项目中如果已存在上述的文件夹和文件,建议先删除然后再进行下一步
点击 “Preview” 按钮,再点击“Generate”按钮即可
试运行
用浏览器访问下面的 URL 查看生成代码的运行:
http://hostname/index.php?r=country/index
DEMO5: 入口文件
# 官方教程
http://www.yiichina.com/doc/guide/2.0/structure-entry-scripts
入口脚本是应用启动流程中的第一环, 一个应用只有一个入口脚本。 终端用户的请求通过入口脚本实例化应用并将将请求转发到应用。
Web 应用的入口脚本必须放在终端用户能够访问的目录下, 通常命名为 index.php
, 也可以使用 Web 服务器能定位到的其他名称。
以下是基础应用模版入口脚本的代码:
<?php // 是否开启调试模式
defined('YII_DEBUG') or define('YII_DEBUG', true); // 配置当前的开发环境
defined('YII_ENV') or define('YII_ENV', 'dev'); // 注册 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();
YII2 学习的更多相关文章
- YII2学习第一天
YII2学习第一天,之前稍微看了看TP,感觉和自己的理念不是很符合,然后转学YII2了. 使用的文档是https://github.com/yiisoft/yii2/tree/master/docs/ ...
- yii2 学习中
属性: public function __get($name) // 这里$name是属性名 { $getter = 'get' . $name; // getter函数的函数名 if (metho ...
- yii2学习笔记
之前看过Yii2框架,也在其他框架实现其Gii手脚架功能,现在开始使用Yii做项目,顺便记录一下学习笔记 先推荐一个网址 Yii2速查表(中文版)http://nai8.me/tool-sc.html ...
- 关于yii2学习笔记:gii的使用
yii2中的gii无疑是非常强大的代码生成工具,以下是我学习使用gii的一些技巧,跟大家分享一下. 以User为例,在数据库中,创建user表. /*Navicat MySQL Data Transf ...
- yii2安装与初始化-Yii2学习笔记(一)
一.安装项目: 使用composer下载安装yii2 advanced安装包: composer create-project yiisoft/yii2-app-advanced advanced(自 ...
- Yii2学习笔记---内附GridView配置总结
1./vendor/yiisoft/yii2/web/UrlManager.php 方法createUrl 修改url参数转码2.config/web.php 配置文件Yii::$app(应用主体)的 ...
- Yii2学习笔记之场景
场景 一个模型可能在多个场景中使用,在不同的场景中,模型可能使用不同的业务逻辑和规则.例如, User 模型可能在用户登录时使用,也可能在用户注册时使用,某些属性可能在用户注册时强制要求有,在用户登录 ...
- 慕课网,我的yii2学习笔记(基础篇)
一.关于PHP知识点 1.命名空间:存放类文件的空间,可以随便定义,建议与类文件目录一致,方便管理. 注:(1).如果类没有设置命名空间,默认为顶级命名空间,在程序中可以用一下方式实例化. $mode ...
- yii2学习的论坛
http://www.yiifans.com/forum.php http://www.yiichina.com/ http://www.yiichina.com/
随机推荐
- Android学习--广播机制
广播机制简介 Android的广播可以分为两种类型的,标准广播和有序的广播: 标准广播: 是一种完全异步执行的广播,在广播发出去之后,所有的广播接收器几乎是同一时接收到这条广播. 有序广播: 是一 ...
- Apache用户目录枚举工具apache-users
Apache用户目录枚举工具apache-users Apache服务器提供UserDir模块,允许在网站为不同的用户设置对应的目录.这样,用户可以使用http://example.com/~use ...
- [CF418E]Tricky Password
题意:有一个无限行$n$列的数表$a_{i,j}$,对于第$i\geq2$行,$a_{i,j}$为$a_{i-1,j}$在$a_{i-1,1\cdots j}$中出现的次数,要维护这个数表,支持修改第 ...
- 【二分答案】Codeforces Round #402 (Div. 2) D. String Game
二分要删除几个,然后暴力判定. #include<cstdio> #include<cstring> using namespace std; int a[200010],n, ...
- 【前缀和】【前缀MAX】洛谷 P1351 NOIP2014提高组 day1 T2 联合权值
不难发现,树中与某个点距离为2的点只可能是它的父亲的父亲.儿子的儿子 或者 兄弟,分类讨论一下即可. 只有对于兄弟我们不能暴力搞,维护一下每个节点的所有儿子的前缀和.前缀MAX就行了. #includ ...
- Matlab自带的曲线拟合程序
这个函数的功能是能自动搜索参数的取值,从而使得方程的误差最小. 效果如下 代码如下 %% Optimal Fit of a Non-linear Function % This is a demons ...
- t-sql 笔记(1)
Toad-for-SQL-Server-Freeware 1.查询哪些数据库对象使用了某个表 SELECT b.[name], a.[definition] FROM sys.all_sql_modu ...
- lsof/fuser卸载挂载文件
Linux如何卸载挂载文件 在我们进行远程文件操作的时候,我们经常会出现文件服务出现卸载掉哦情况.例如 umount /mnt/net1umount: /mnt/net1: device is b ...
- DEDECMS之0day入侵总结
1.查看dedecms最后升级版本:http://xxx.com/data/admin/ver.txt 2.利用网上公开之0day进行对应版本之入侵 ps:dedecms默认CMS后台:http:// ...
- fl2440 platform总线led字符设备驱动
首先需要知道的是,设备跟驱动是分开的.设备通过struct device来定义,也可以自己将结构体封装到自己定义的device结构体中: 例如:struct platform_device: 在inc ...