通过归档文件安装或者通过composer下载放在自己的项目中,接下来开始使用yii2。
认识yii2.0
-
什么是yii框架?
快速,安全,专业的php框架。
-
yii框架有什么用?
非常适合开发web2.0网站,博客,社区网站,sns,分享服务,内容管理系统,电子商务网站,restful web服务这些应用,yii框架都是不错的选择。
-
为什么要用yii框架
-
开发快
-
代码优雅
-
yii框架严格按照MVC设计代码,清晰分离逻辑层,代码严谨优雅,可维护性高
-
安全可靠
yii框架的措施包括了输入验证,输入过滤,sql注入和跨站点脚本的预防。
yii2.0运行原理初探
yii请求道响应的生命周期
用户通过入口脚本index.php,加载配置文件,启动应用(application),解析路由,请求处理组件,创建控制器,创建动作执行过滤,通过模型(从数据库)加载数据,通过视图方法渲染视图,响应处理组件,响应给用户。
- 用户向入口脚本 web/index.php
发起请求。 - 入口脚本加载应用配置 并创建一个应用实例去处理请求。
- 应用通过请求组件 解析请求的路由。
- 应用创建一个控制器实例去处理请求。
- 控制器创建一个动作实例并针对操作执行过滤器。
- 如果任何一个过滤器返回失败,则动作取消。
- 如果所有过滤器都通过,动作将被执行。
- 动作会加载一个数据模型,或许是来自数据库。
- 动作会渲染一个视图,把数据模型提供给它。
- 渲染结果返回给响应组件。
- 响应组件发送渲染结果给用户浏览器。
应用主体
1.应用主体 - 是管理Yii应用系统整体结构和生命周期的对象
- 是yii\web\Application类的实例
- 可以用\Yii::$app来访问应用
视图
- 视图是mvc模式中view这一部分。
- 视图实在yii\web\view应用组件的帮助下,依据视图模板文件,进行构造和渲染完成的。
- 习惯上称视图模板文件为视图。
- 视图模板文件主要是通过html代码和展示类php代码组成的。
-
视图的布局layout
<?php
/* @var $this \yii\web\View */
/* @var $content string */
use yii\helpers\Html;
use yii\bootstrap\Nav;
use yii\bootstrap\NavBar;
use yii\widgets\Breadcrumbs;
use frontend\assets\AppAsset;
use common\widgets\Alert;
AppAsset::register($this);
?>
<?php $this->beginPage() ?>
<!DOCTYPE html>
<html lang="<?= Yii::$app->language ?>">
<head>
<meta charset="<?= Yii::$app->charset ?>">
<meta name="viewport" content="width=device-width, initial-scale=1">
<?= Html::csrfMetaTags() ?>
<title><?= Html::encode($this->title) ?></title>
<?php $this->head() ?>
</head>
<body>
<?php $this->beginBody() ?>
<div class="wrap">
<?php
NavBar::begin([
'brandLabel' => 'My Company',
'brandUrl' => Yii::$app->homeUrl,
'options' => [
'class' => 'navbar-inverse navbar-fixed-top',
],
]);
$menuItems = [
['label' => 'Home', 'url' => ['/site/index']],
['label' => 'About', 'url' => ['/site/about']],
['label' => 'Contact', 'url' => ['/site/contact']],
];
if (Yii::$app->user->isGuest) {
$menuItems[] = ['label' => 'Signup', 'url' => ['/site/signup']];
$menuItems[] = ['label' => 'Login', 'url' => ['/site/login']];
} else {
$menuItems[] = '<li>'
. Html::beginForm(['/site/logout'], 'post')
. Html::submitButton(
'Logout (' . Yii::$app->user->identity->username . ')',
['class' => 'btn btn-link']
)
. Html::endForm()
. '</li>';
}
echo Nav::widget([
'options' => ['class' => 'navbar-nav navbar-right'],
'items' => $menuItems,
]);
NavBar::end();
?>
<div class="container">
<?= Breadcrumbs::widget([
'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [],
]) ?>
<?= Alert::widget() ?>
<?= $content ?>
</div>
</div>
<footer class="footer">
<div class="container">
<p class="pull-left">© My Company <?= date('Y') ?></p>
<p class="pull-right"><?= Yii::powered() ?></p>
</div>
</footer>
<?php $this->endBody() ?>
</body>
</html>
<?php $this->endPage() ?>
1.什么是布局
布局是一种特殊的视图,表现多个视图的公共部分。
2.如何创建布局
布局也是视图,它可像普通视图一样创建布局默认存储在@app/view/layouts里
3. 如何变换布局
-
更改布局
$this->layout = 'wx';
-
禁用布局
$this->layout = false;
4.布局文件的数据
$this 和 $content
- $this指向 yii\web\view 来管理和渲染这个视图文件。
- $content是视图模板文件渲染出来的结果
应用主体
1.应用主体
- 是管理yii应用系统整体结构和生命周期的对象
- 是yii\web\application类的实例
- 可以用\yii::$app来访问应用
2.应用主体的配置
- $config变量给应用主体这个对象的属性进行初始化赋值。
- $config变量是从配置文件web.php加载而来的
3.应用主体的属性
- id 用来区分其他应用主体的标识id
- basePath 应用根目录
- defaultRoute 默认打开的路由
表单
1.表单的创建
在yii 中主要是通过 yii\widgets\ActiveForm 类来创建表单。
- ActiveForm::begin()不仅创建了一个表单实例,同时也标志着表单的开始。
- 放在ActiveForm::begin() 与 ActiveForm::end()之间的所有内容都被包裹在Html的<form>标签中。
<?php
/* @var $this yii\web\View */
/* @var $form yii\bootstrap\ActiveForm */
/* @var $model \frontend\models\ContactForm */
use yii\helpers\Html;
use yii\bootstrap\ActiveForm;
use yii\captcha\Captcha;
$this->title = 'Contact';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="site-contact">
<h1><?= Html::encode($this->title) ?></h1>
<p>
If you have business inquiries or other questions, please fill out the following form to contact us. Thank you.
</p>
<div class="row">
<div class="col-lg-5">
<?php $form = ActiveForm::begin(['id' => 'contact-form']); ?>
<?= $form->field($model, 'name')->textInput(['autofocus' => true]) ?>
<?= $form->field($model, 'email') ?>
<?= $form->field($model, 'subject') ?>
<?= $form->field($model, 'body')->textArea(['rows' => 6]) ?>
<?= $form->field($model, 'verifyCode')->widget(Captcha::className(), [
'template' => '<div class="row"><div class="col-lg-3">{image}</div><div class="col-lg-6">{input}</div></div>',
]) ?>
<div class="form-group">
<?= Html::submitButton('Submit', ['class' => 'btn btn-primary', 'name' => 'contact-button']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
</div>
</div>
2.ActiveField对象的使用
<?= $form->field($model, 'password')->passwordInput() ?>
<?= $form->field($model, 'username')->textInput(['autofocus' => true])->hint('please enter your name')->label('Name') ?>
<?= $form->field($model, 'email')->input('email') ?>
3. 额外的标签处理
表单中,存在一些和模型对象没有关系的,额外的HTML标签,比如submitButton我们可以:
- 使用纯HTML
- 使用yii\helpers\Html 帮助类中的方法来添加到表单中
<?= Html::submitButton('Submit', ['class' => 'btn btn-primary', 'name' => 'contact-button']) ?>
4. 块赋值
input中的name,实际是以对象名来命名一个数组,数组的键对应模型的属性。
模型执行load方法,就是对每个属性执行这样一句赋值。
$model->name = isset($ContactForm['name']) ? $contactForm['name'] : null;