YII 框架学习-第二波

时间:2024-03-20 08:48:42

入口文件

YII框架入口文件有两个,一个是 web application的入口文件,一个是console application的入口文件。

  

Web application的入口文件是 index.php,用户通过url访问后台的时候的入口文件。

Console application的入口文件是 yii(是php文件), 这个文件是通过yii.bat启动的时候调用的。

  

如果YII框架安装成功之后的话,那么我们访问YII框架的URL为(以我的环境为准):

http://localhost/DemoPage/Yii/basic/web/index.php

这个index.php 文件就是入口文件。在这个index.php 中加载了环境所有需要的文件,并且启动整个框架。

  

YII 框架学习-第二波

  

  

接下来我们要做一个简单的Hello World程序,

  • 创建一个Action
    • Action简单定义
      • Action定义于Controller之中。
      • Action对应着一个方法
      • Action是直接处理用户请求的逻辑的地方
    • 为了简单,可以直接在框架里面已经存在的SiteController里面定义。

        

        

      YII 框架学习-第二波

        

        

        

      该方法接受一个参数message,如果message为空,默认为"Hello World"。 最后,会返回给用户一个say视图,并且会把参数也传递过去。(注意方法命名,YII通过action前缀区分action方法和普通方法。这个是一种约定。然后action后缀后面的部分,作为我们的具体的action名字)

  • 创建一个View
    • 每个Controller对应着一个view目录。比如我们使用的这个框架自带的SiteController,views目录中有个site目录。里面存放着对应的view
    • 我们需要在views/site/目录中创建一个say.php. view文件的命名需要和action中的render方法传递的say参数对应。里面的内容如下:

      YII 框架学习-第二波

        

      view将会展示传递过来的message信息。注意这里使用encode方法,是因为这个参数是从用户那边传递过来的。如果直接展示容易受到跨站攻击。比如用户在传递过来的参数中植入恶意的JavaScript代码。通过这个encode方法编码之后,可以有效地防止这个问题。

  • 访问ActionView
    • index.php 后面加上路由和参数信息,见下面:
    • 页面结果如下:

        

      YII 框架学习-第二波

      有个很有趣的现象,View自动继承了yii框架的页面结构。请看页头~

      这个是通过什么方式得到的呢?

       

       下面是官网的解释:

      Thenew page shares the same header and footer as other pages because the render() methodwill automatically embed the result of the say viewin a so-called layoutwhich inthis case is located at views/layouts/main.php.

      其实在render方法中,会自动把我们返回的结果嵌入到下面的文中:views/layouts/main.php 然后作为一个整体,返回给用户。

      我们也可以为自己的项目创建自己的的main.php,替换掉默认的就可以了。

  • 关于跨站攻击
    • 如果我们在URL中传递参数,message=<script type="text/javascript">alert(1);</script>,请看结果:

        

      YII 框架学习-第二波

        

        

        

        

      是直接把值给展示出来了。那如果不是用encode方法的话,结果呢?

        

      YII 框架学习-第二波

        

        

      备注:Google浏览器貌似可以自动屏蔽跨站攻击,所以我使用了IE浏览器测试。

        

      可以看出encode方法的重要性了吧。