Yii2.0 学习
Composer
+ PHP
+ Object Oriented Programming OOP面向对象编程
安装
通过 Composer 安装
win
下载
在 Web 可访问的文件夹下运行以下命令来 , 安装Yii应用程序模板:
composer create-project --prefer-dist yiisoft/yii2-app-basic basic
通过归档文件安装
通过归档文件安装 Yii 包括三个步骤:
1 从 yiiframework.com 下载归档文件。
2 将下载的文件解压缩到 Web 访问的文件夹中。
3 修改 config/web.php 文件,给 cookieValidationKey 配置项 添加一个密钥(若你通过 Composer 安装,则此步骤会自动完成):
// !!! 在下面插入一段密钥(若为空) - 以供 cookie validation 的需要
'cookieValidationKey' => '在此处输入你的密钥',
安装 Assets
Yii依靠 Bower 和/或 NPM 软件包来安装 asset(CSS 和 JavaScript)库。
用Composer来获取这些库,允许 PHP 和 CSS/JavaScript 包版本同时解析。
这可以通过使用 asset-packagist.org 或 composer asset plugin 来实现。 有关更多详细信息,请参阅 Assets 文档。
通过本地 Bower/NPM 客户端管理您的 assets,使用 CDN 或完全避免 assets 的安装。
防止通过 Composer 安装 assets,请将以下几行添加到您的 'composer.json' 中:
"replace": {
"bower-asset/jquery": ">=1.11.0",
"bower-asset/inputmask": ">=3.2.0",
"bower-asset/punycode": ">=1.3.0",
"bower-asset/yii2-pjax": ">=2.0.0"
},
验证启动
通过内置的web server 或者 配置好的web 服务器
在项目 web 目录下可以通过下面的命令:
php yii serve --port=8888
目录机构
basic/ 应用根目录
composer.json Composer 配置文件, 描述包信息
config/ 包含应用配置及其它配置
console.php 控制台应用配置信息
web.php Web 应用配置信息
commands/ 包含控制台命令类
controllers/ 包含控制器类
models/ 包含模型类
runtime/ 包含 Yii 在运行时生成的文件,例如日志和缓存文件
vendor/ 包含已经安装的 Composer 包,包括 Yii 框架自身
views/ 包含视图文件
web/ Web 应用根目录,包含 Web 入口文件
assets/ 包含 Yii 发布的资源文件(javascript 和 css)
index.php 应用入口文件
yii Yii 控制台命令执行脚本
应用中的文件可被分为两类:在 basic/web 下
( 可以直接通过 HTTP 访问(例如浏览器) )和 在其它目录下
( 不能也不应该被直接访问 )的。
Yii 了模型-视图-控制器 (MVC)设计模式
models 目录包含了所有模型类,
views 目录包含了所有视图脚本,
controllers 目录包含了所有控制器类。
请求生命周期
用户向入口脚本 web/index.php 发起请求。
入口脚本加载应用配置并创建一个应用 实例去处理请求。
应用通过请求组件解析请求的 路由。
应用创建一个控制器实例去处理请求。
控制器创建一个动作实例并针对操作执行过滤器。
如果任何一个过滤器返回失败,则动作取消。
如果所有过滤器都通过,动作将被执行。
动作会加载一个数据模型,或许是来自数据库。
动作会渲染一个视图,把数据模型提供给它。
渲染结果返回给响应组件。
响应组件发送渲染结果给用户浏览器。
简单的实现 controller + view + model
// controllers/SiteController.php
<?php
namespace app\controllers;
use yii\web\Controller;
class SiteController extends Controller
{
// ...现存的代码...
// action say ==> 对应对应的 view
public function actionSay($message = 'Hello')
{
return $this->render('say', ['message' => $message]);
}
}
?>
// views/site/say.php
接受从controller action中传过来的参数
<?php
use yii\helpers\Html;
?>
<?= Html::encode($message) ?>
访问 http://hostname/index.php?r=site/say&message=Hello+World
入口文件 http://hostname/index.php
?r=site 控制器
/say action
&message=hello action参数
创建模型model
yii\base\Model
被用于普通模型类的父类并与数据表无关
yii\db\ActiveRecord
通常是普通模型类的父类但与数据表有关联
(译注:yii\db\ActiveRecord 类其实也是继承自 yii\base\Model,增加了数据库处理)
// /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']
];
}
}
?>
// /controllers/SIteController.php
<?php
public function actionEntry()
{
$entry_model = new EntryForm;
if($entry_model->load(Yii::$app->request->post()) && $entry_model->validate()){
// 验证 $model 收到的数据
// 表达式 Yii::$app 代表应用实例,它是一个全局可访问的单例。
return $this->render('entry-confirm', ['model'=>$entry_model]);
}else{
return $this->render('entry', ['model'=>$entry_model]);
}
}
?>
表达式 Yii::$app
代表 应用实例
,它是一个全局可访问的单例。
同时它也是一个服务定位器
, 能提供 request,response,db 等等特定功能的组件。
在上面的代码里就是使用 request 组件来访问应用实例收到的 $_POST 数据。
// 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>
?>
// 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(); ?>
视图使用了一个功能强大的小部件 ActiveForm
去 生成 HTML 表单
。
其中的 begin() 和 end() 分别用来渲染表单的开始和关闭标签。
在这两个方法之间使用了 field() 方法去创建输入框。 第一个输入框用于 “name”,第二个输入框用于 “email”。
之后使用 yii\helpers\Html::submitButton()
方法生成提交按钮
。
访问 http://localhost:8080/index.php?r=site/entry
客户端验证是提高用户体验的手段。 无论它是否正常启用,服务端验证则都是必须的
使用数据库
安装对应数据库的
PDO驱动
修改配置
config/db.php
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=yii2basic',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
// Schema cache options (for production environment)
//'enableSchemaCache' => true,
//'schemaCacheDuration' => 60,
//'schemaCache' => 'cache',
];
配置的数据库连接
可以在应用中通过 Yii::$app->db
表达式访问
$db = require __DIR__ . '/db.php';
config/db.php 将被包含在应用配置文件 config/web.php
中, 指定了整个应用如何初始化
创建活动记录
不用在里面写任何代码 Yii 就能根据类名去猜测对应的数据表名
。
如果类名和数据表名不能直接对应, 可以覆写 tableName() 方法
去显式 指定相关表名
。
// /models/Country.php
<?php
/**
* Created by PhpStorm.
* User: Domob
* Date: 2019/1/9
* Time: 14:45
*/
namespace app\models;
use yii\db\ActiveRecord;
class Country extends ActiveRecord
//如果类名和数据表名不能直接对应, 可以覆写 tableName() 方法去显式指定相关表名。
{
}
?>
country controller
index 操作调用了活动记录 Country::find() 方法,去生成查询语句并从 country 表中取回所有数据。
为了限定每个请求所返回的国家数量,查询在 yii\data\Pagination 对象的帮助下进行分页。
Pagination 对象的使命主要有两点:
为 SQL 查询语句设置 offset 和 limit 从句, 确保每个请求只需返回一页数据(本例中每页是 5 行)。
在视图中显示一个由页码列表组成的分页器, 这点将在后面的段落中解释。
<?php
/**
* Created by PhpStorm.
* User: Domob
* Date: 2019/1/9
* Time: 14:51
*/
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,
]);
}
}
?>
使用gii 生成代码
gii
是 yii中的一个模块
配置应用的 modules 属性开启它。通常来讲在 config/web.php 文件中会有以下配置代码:
$config = [ ... ];
if (YII_ENV_DEV) {
// 在开发环境下 应用会包含 gii 模块
$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = [
'class' => 'yii\gii\Module',
];
}
访问 http://localhost:8080/index.php?r=gii
生成活动模型
+ 整套的GRUD
代码