Home >php教程 >php手册 >yii2实战教程之第一个Yii程序

yii2实战教程之第一个Yii程序

WBOY
WBOYOriginal
2016-05-30 16:59:431045browse

之前考虑过要不要砍掉该章节,直接上手教你搭建简单的博客系统。出于实战基础加之自C语言的书籍出版以来,几乎所有的编程书籍都讲述了一个Hello World的例子作为开始。虽然我们仅仅是学习Yii2,但是好歹我们这也是高大上的Yii嘛,我们也尊重传统,来一段Hello World快速入门!
我将学会什么

  • 了解到MVC设计模式中的V和C是什么
  • 如何创建一个操作(action)
  • 如何创建对应的视图文件(模板)
  • 简单了解到操作的命名规范
  • 什么是路由

开始之前的准备
Yii是什么?为什么要学Yii呢?是啥,就是一个框架,如果要加一些形容词,我觉得高性能、易扩展等词最适合不过了。

MVC相信就不用多说了,Yii2无疑更好的基于MVC对代码进行了一定的组织。简洁优雅不说......我们还是不拍yii马屁了,说重点。

我们知道,客户端像服务端发起一个请求,服务端是必须要有对应的响应地址才是可以的。这个响应的地址在Yii2中又是怎么进行描述的呢?先来介绍下什么是操作。

操作,其实就是一个action(action是动作的意思),也可以描述为我们前面说的响应地址。TA是控制器(controller)的组成部分,再说白了其实就是类(class)的操作方法(function)。

如何创建一个操作呢?给类创建一个方法你会不,非要说的那么白才明白不是太好,对吧。

也就是说我们需要先有一个类(控制器)呗,没错!如下示例就是包含了两个操作 index 和create的控制器test。

<span style="color: #000000;">namespace frontend\controllers; 
</span><span style="color: #0000ff;">use</span><span style="color: #000000;"> yii\web\Controller; 
</span><span style="color: #0000ff;">class</span> TestController <span style="color: #0000ff;">extends</span><span style="color: #000000;"> Controller 
{ 
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> actionIndex () { 
    } 
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> actionCreate () { 
    } 
} </span>

 

有同学要较真了,控制器不是test吗,为啥你的是TestController?还有啊,说好的操作名是index和create为啥你的都有前缀action?controller跟action去掉可不可以?答:不可以,必须带上!Yii2规定:声明的控制器必须带上Controller后缀,同时操作必须带上前缀action!

通常情况下,控制器用来处理请求有关的资源类型,其实就是做一些操作的,比如我们要处理文章之类的数据,控制器应命名为Article恰当些,尽量做到见名知意。Action当然也是如此,比如我们要创建一篇文章,action理应为add或者create为妙。

那有同学要说了,我就想叫操作名为createArticle怎么办?天儿热,先凉拌着,慢慢说。

yii2中操作名(action)遵循驼峰式命名,也就是说如果你是多个单词,请保证你的命名规则是actionCreateArticle而不是actionCreatearticle!当然,这只是一种规范,你不这样做也没人拦你。需要提醒注意的是多个单词驼峰式命名,访问操作的时候,多个单词需要像create-article这样用连接符连接而不是createArticle哦

接下来我们访问已经创建好的操作:

首先我们先配置下域名advanced.dev指向\frontend\web目录,我们后文所指的该域名均指向这里
在frontend\controllers\目录下新建TestController.php文件,内容参考上面我们创建Test控制器的代码
地址栏输入 http://advanced.dev/index.php?r=test/index 访问看看结果,我们会发现一片空白,什么也没有!很明显,我们的的操作方法index里空空如也,没做任何输出。要不我们做点什么?别急,我们先来看看这个地址,TA究竟做了什么,为什么能请求到我们指定的操作。

这就需要我们引入一个新的概念-路由。感觉挺好哈,这名字都没听过。不过不要紧,我换个说法你就明白了,访问地址,路由就是我们的访问地址!明白了吧,TA就是用于定位控制器操作的地址!我们这里重点是讲明白概念,不做深究,具体细节需要的可以去查看官方文档。

输出Hello World!
该明白的该说的都说了,饶了一大圈终于该说本篇文章的重点了-输出Hello World。艾玛,可把我憋坏了。

<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> actionIndex () { 
    </span><span style="color: #0000ff;">echo</span> "Hello World!"<span style="color: #000000;">; 
}</span>

 

现在在回过来看看,是不是很简单!

我们改变点什么,看看如何动态的输出Hello Ketty,Hello Anmy?

<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> actionIndex (<span style="color: #800080;">$name</span><span style="color: #000000;">) { 
    </span><span style="color: #0000ff;">echo</span> "Hello {<span style="color: #800080;">$name</span>}!"<span style="color: #000000;">; 
}</span>

 

该操作方法接收一个参数name,理应程序上会输出Hello, xxx的字样。

现在我们依然访问 http://advanced.dev/index.php?r=test/index 会发现页面报错了,提示错误缺少参数:name!也就是说,我们访问该操作时应该传进来一个参数name!我们把地址修改为 http://advanced.dev/index.php?r=test/index&name=Kitty ,这个时候页面正常输出了Hello Kitty!手动修改地址栏的name值,页面上输出的内容也会随之进行改变!

我们知道,操作其实就类似MVC中的C层,C层也就是处理业务逻辑的一层,如此一来,像上面在控制器的操作方法中输出内容明显就不太合适了。

既然要输出内容,我们看看Yii2的V层又是如何进行操作(此操作非彼操作,不要妄加揣摩)的呢?

我们引入新的概念-视图。视图是啥?说白了就是我们的模版文件。我们先在frontend\views\新建文件夹test,然后在test下创建一个视图文件index.php,文件内容如下

<div style="color: #0000ff;">class="test-index"> 
    <h1>Hello World!</h1> 
</div>

 

说明一点:frontedn\views下面创建的文件夹应与控制器保持一致,如此一来才方便我们对很多文件进行管理。

接下来看看如何才能对视图index.php进行操作?

<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> actionIndex (<span style="color: #800080;">$name</span><span style="color: #000000;">) { 
    </span><span style="color: #008000;">//</span><span style="color: #008000;"> echo "Hello {$name}!"; </span>
    <span style="color: #0000ff;">return</span> <span style="color: #800080;">$this</span>->render('index'<span style="color: #000000;">); 
}</span>

 

仅仅是在之前的操作index内写了一行代码,用于操作视图文件。此时我们很有必要在视图文件内动态输出Hello xxx!这个时候只需要在render方法传递参数即可。

<span style="color: #008000;">//</span><span style="color: #008000;"> controller </span>
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> actionIndex (<span style="color: #800080;">$name</span><span style="color: #000000;">) { 
    </span><span style="color: #008000;">//</span><span style="color: #008000;"> echo "Hello {$name}!"; </span>
    <span style="color: #0000ff;">return</span> <span style="color: #800080;">$this</span>->render('index',<span style="color: #000000;"> [ 
        </span>'name' => <span style="color: #800080;">$name</span>,<span style="color: #000000;"> 
    ]); 
} 


</span><span style="color: #008000;">//</span><span style="color: #008000;">view </span>
<div style="color: #0000ff;">class="test-index"> 
    <h1>Hello = <span style="color: #800080;">$name</span> ?>!</h1> 
</div> 

 

如此一来,我们既掌握了视图,又实现了我们想要输出的Hello xxx!

但是,这个时候,如果我们地址栏输入的参数name值等于,我们想要的结果是Hello !实际上并非如此!如此一来,就难免会遭遇XSS攻击!为了安全起见,页面上输出的信息我们很有必要安全地处理一下!

<div style="color: #0000ff;">class="test-index"> 
    <h1>Hello = yii\helpers\Html::encode(<span style="color: #800080;">$name</span>) ?>!</h1> 
</div>

 

实际上这里我们也仅仅是简单的谈了一下如何避免XSS跨站攻击。

下一节我们将要直接开讲简单的博客管理系统,本篇我们主要涉及的基本概念 操作、视图、路由等,希望你能掌握透彻,有任何问题下方均可留言交流!

[考虑目前国内网站大部分采集文章十分频繁,更有甚者不注明原文出处,原作者更希望看客们查看原文,以防有任何问题不能更新所有文章,避免误导!]

查看原文

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn