文档章节

Yii2学习笔记(二):慕课教程笔记

botkenni
 botkenni
发布于 2017/02/23 14:18
字数 2305
阅读 19
收藏 0
点赞 0
评论 0

1、下图是框架的目录结构

其中:controllers存放控制器文件、models存放数据库的模型文件、views存放视图文件,web下面的index.PHP是入口文件

在页面中运行http://localhost/basic/web/index.php?r=hello/hello:

   (1)下面是controllers里面的HelloController.php文件:

 

  1. <?php  
  2. //如何启动这个控制文件:运行web/index.php?r=hello/hello即可  
  3. //其中r代表参数,第一个hello是控制器的名字,第二个是动作的名字  
  4. namespace app\controllers;  
  5. use yii\web\Controller;  
  6. use yii\web\Cookie;  
  7. use app\models\test;//数据模型的命名空间  
  8.   
  9. class HelloController extends Controller  
  10. {  
  11.     public $layout='comm';  
  12.     //服务器在响应时可以在头部加个lastModified和etag,当浏览器器再次发送请求时,  
  13.     //会带上这两个参数,然后服务器进行比对,如果lastModified一致,那么etag肯定一致  
  14.     //如果lastModified不一致,就会判断etag是否一致,再决定是否重新生成响应内容  
  15.     //一般情况下,lastModified是时间戳,etag是业务处理方面的一些内容  
  16.     public function behaviors()  
  17.     {  
  18.         return   
  19.         [  
  20.             [  
  21.             'class'=>'yii\filters\HttpCache',  
  22.             'lastModified'=>function()  
  23.             {  
  24.                 return filemtime('hw.txt');  
  25.                   
  26.             },  
  27.             'etagSeed'=>function()  
  28.             {  
  29.                 $fp = fopen('hw.txt','r');  
  30.                 $title = fgets($fp);  
  31.                 fclose($fp);  
  32.                 return $title;  
  33.             }  
  34.                 ]  
  35.   
  36.     ];  
  37.     }  
  38.   
  39.         public function actionHello()  
  40.         {  
  41.     //四、http缓存实例  
  42.     $content=file_get_contents('hw.txt');  
  43.   
  44.         return $this->renderPartial('test2',['new'=>$content]);  
  45.   
  46.     //三、页面缓存  
  47.   
  48.   
  49.     //二、片段缓存:详情在cache.php中  
  50.     //  return $this->renderpartial('cache');  
  51.   
  52.   
  53.   
  54.   
  55.     //一、数据缓存  
  56.         //1、获取缓存组件  
  57.         $cache=\YII::$app->cache;  
  58. /*      //往缓存中写数据  
  59.         $cache->add('key1','hello');//如果添加的key值相等,那么缓存就会忽略  
  60.         $cache->add('key1','hello3');//后面的添加,以第一个添加的为准,  
  61.                                     //比如这个就会显示key1为hello                                  
  62.         //读缓存  
  63.         $data=$cache->get('key1');  
  64.         //修改缓存  
  65.         //$cache->set('key1','hello2');  
  66.         //删除数据  
  67.         //$cache->delete('key1');  
  68.         //清空所有数据  
  69.         //$cache->flush();  
  70.         var_dump($data);//显示boolean false;  
  71.   
  72.         //2、缓存有效期设置  
  73.         //测试的时候,先运行add,并注释掉echo,运行页面;  
  74.         //然后注释掉add,运行echo,过5s后再次刷新,会发现没有显示  
  75.         //$cache->add('key2','hello2',5);  
  76.         //set也可以  
  77.         //$cache->set('key2','hello2',5);  
  78.         //echo $cache->get('key2');  
  79.   
  80.         //3、缓存中的依赖关系  
  81.         //(1)文件依赖  
  82.         //如果修改文件hw的内容,那么缓存就会立即失效,hw文件在web目录下  
  83.         //$dependency=new \yii\caching\FileDependency(['fileName'=>'hw.txt']);  
  84.         //$cache->add('key3','hello3',3000,$dependency);  
  85.         //var_dump($cache->get('key3'));   
  86.         //(2)表达式依赖  
  87.         //下面的表达式是URL的请求参数,如果修改请求参数name的值,cache就失效  
  88.         //$dependency=new \yii\caching\ExpressionDependency(['expression'=>'\YII::$app->request->get("name")']);  
  89.         //$cache->add('key4','hello4',3000,$dependency);  
  90.         //var_dump($cache->get('key4'));   
  91.         //(3)DB依赖  
  92.         //通过sql语句来依赖,如果sql语句返回的值有变化,那么cache就失效  
  93.         //$dependency=new \yii\caching\DbDependency([  
  94.         //  'sql'=>'select count(*) from db_bcty365.test']);  
  95.         //$cache->add('db_key','hello db',3000,$dependency);  
  96.         //var_dump($cache->get('db_key'));  
  97.   
  98.     //类的映射机制:减少系统查询类的时间       
  99.         //  \YII::$classMap['app\models\test']='G:\PHP\basic\models\test.php';  
  100.         //  $test=new Test;<span style="font-family: Arial, Helvetica, sans-serif;">会跳到autoLoad($class)函数,</span><span style="font-family: Arial, Helvetica, sans-serif;">并赋值'命名空间+test类名'给$class,如果没有上面的映射语句,系统会将$class转换成对应的绝               <span style="white-space:pre">            </span>//<span style="white-space:pre">     </span>对路径来查找test类,这个过程也是很消耗时间的;但是如果用了上面的映射语句,</span>此时系统就会直接使用映射的绝对路径,从而减少了系统开销  
  101.       
  102. */  
  103.     //数据模型的操作  
  104.     /*  //查询语句  
  105.             //下面是四种方式,主要用第四种  
  106.             //1、最常用的查询方式  
  107.             $sql="select * from test where id=1";  
  108.             $results=Test::findBySql($sql)->all();//返回一个数组  
  109.               
  110.             //2、根据用户提交的变量来查询  
  111.             $id=1;  
  112.             $sql="select * from test where id=".$id;  
  113.             $results=Test::findBySql($sql)->all();//返回一个数组  
  114.               
  115.             //3、因为2存在SQL注入问题,所以出现了3这种方法  
  116.             $sql="select * from Test where name=:name1";  
  117.             //下面这个做法是为了防止SQL注入,比如一个用户输入了'a or name=b',那么执行查询语句就会查找a和b两个用户的内容  
  118.             //这样显然是不安全的,因此YII提供了一种方法,就是在findBySql的第二个参数出添加一个数组,然后sql语句中  
  119.             //使用如上所示的:name1的表示形式,这样就会把name1的内容当成一个整体来执行,而不会当成部分sql代码  
  120.             $results=Test::findBySql($sql,array('name1'=>'a or name=b'))->all();//返回一个数组,这个语句返回一条name为'a or name =b'的内容  
  121.               
  122.       
  123.             //4、因为3比较繁琐,因此出现了4  
  124.                 //name='a'的数据  
  125.         //  $results=Test::find()->where(['name'=>'a'])->all();  
  126.                 //id>0的数据  
  127.         //  $results=Test::find()->where(['>','id',0])->all();  
  128.                 //id>=1和id<=2的数据  
  129.         //  $results=Test::find()->where(['between','id',1,2])->all();  
  130.                 //name like "%a%"  
  131.         //  $results=Test::find()->where(['like','name','a'])->all();  
  132.         //降低内存开销的方式:  
  133.             //1、将结果从对象转化成数组  
  134.             $results=Test::find()->where(['between','id',1,2])->asarray()->all();//此时显示结果为数组形式   
  135.                 print_r($results);        
  136.             //2、批量查询      
  137.             foreach(Test::find()->batch(10) as $array)//batch(10)就是每次从数据库中拿10条数据放到内存中,保存到变量array中  
  138.             {  
  139.                 print_r($array);  
  140.             }  
  141. */  
  142.         //删除语句  
  143.             //1、单个删除  
  144.     //  $results=Test::find()->where(['id'=>1])->all();  
  145.     //  $results[0]->delete();  
  146.             //2、多个删除  
  147.     //  Test::deleteAll('id>:id',array(':id'=>2));  
  148.       
  149.         //添加数据  
  150.             //插入数据时有个验证的过程,验证规则rules写在test.php类里面  
  151.     /*  $test=new Test;  
  152.         $test->id=5;  
  153.         $test->name='hh';  
  154.         $test->validate();  
  155.         if($test->hasErrors())  
  156.         {  
  157.             echo 'data is error';  
  158.             die;  
  159.         }  
  160.         $test->save();//保存到数据库中  
  161.     */    
  162.           
  163.         //修改数据  
  164.         //$test=Test::find()->where(['id'=>5])->one();//通过one()返回一个对象  
  165.         //$test->name="aa";  
  166.         //$test->save();  
  167.           
  168.     //数据块的使用      
  169.             //return $this->render('about');   
  170.               
  171.               
  172.         //  return $this->renderPartial('about');  
  173.               
  174. /*  
  175.         //公共文件    
  176.                 render方法干两件事情:  
  177.                 一、把后面的参数存到$content变量中  
  178.                 二、会把布局文件显示出来,这个布局文件就是公共属性$layout的值  
  179.                 return $this->render('about');  
  180.   
  181.   
  182.               
  183.               
  184.   
  185.         //视图之间的数据传递:从控制器传到视图index.php  
  186.             总共有三步  
  187.             一、定义要传递的数据  
  188.             //1、传递字符串变量  
  189.             $str='hello<script>alert(3);<script>';  
  190.             //2、传递数组  
  191.             $str_array=array(1,2);  
  192.             二、定义一个数组,用来存放要传递的数据  
  193.             $data=array();  
  194.             $data['view_str']=$str;  
  195.             $data['view_str_array']=$str_array;  
  196.             三、将数组放到renderPartial()的第二个参数  
  197.             return $this->renderPartial('index',$data);  
  198.               
  199.               
  200.               
  201.               
  202.             $request=\YII::$app->request;  
  203.             echo $request->get('id',20);  
  204.             if($request->isGet)  
  205.             {  
  206.                 echo "this is a get";  
  207.             }  
  208.             echo $request->userIp;  
  209.             echo "hello world!";  
  210.           
  211.         //  $response=\YII::$app->response;  
  212.         //  $response->headers->add('param','no-cache');  
  213.         //  $response->headers->set('param','max-age');  
  214.         //  $response->headers->add('location','http://www.baidu.com');  
  215.         //  $this->redirect('http://www.baidu.com');  
  216.         //  $response->sendFile('./robots.txt');  
  217.           
  218. //session  
  219.           
  220.             $session = \YII::$app->session;  
  221.             $session->open();  
  222.             if($session->isActive)  
  223.             {  
  224.                 echo "session is active";  
  225.             }  
  226.               
  227.         //  $session->set('user','3');  
  228.         //  echo $session->get('user');  
  229.         //  $session['user']=4;  
  230.         //  echo $session->get('user');  
  231.         //  unset($session['user']);  
  232.         //  echo $session->get('user');  
  233.           
  234. //cookie  
  235.     //  $cookie=\YII::$app->response->cookies;  
  236.     //  $cookie_data=array('name'=>'1','value'=>'2');  
  237.     //  $cookie->add(new Cookie($cookie_data));  
  238.     //  echo $cookie->get('1');  
  239.       
  240.     //  $cookie->remove('id');     
  241.       
  242.     //  $cookie=\YII::$app->request->cookies;  
  243.     //  echo $cookie->getValue('1',20);  这个有问题,显示不出来cookie为1的值  
  244.         */    
  245.     }  
  246. }  

(2)models/test.php,数据模型文件

  1. <?php  
  2. namespace app\models;  
  3. use yii\db\ActiveRecord;  
  4. //1、文件名必须和类名一致  
  5. //2、文件名必须为表名  
  6. //也就是说:文件名、表名和类名都要一致  
  7. class Test extends ActiveRecord  
  8. {  
  9.       
  10. }  
  11.   
  12. ?>  

(3)views/layout/comm.php公共文件,即一些常用的顶部和底部代码

  1. <html>  
  2. <head>  
  3. </head>  
  4. <body>  
  5.     <?=$content?>  
  6.     <!--进行判断:如果存在block,就显示block;  
  7.         不存在,就显示comm原先的内容  
  8.         注意:if和else后面都有冒号:  
  9.         最后还有个endif-->  
  10.     <?php if(isset($this->blocks['block1'])):?>  
  11.         <?=$this->blocks['block1']?>  
  12.     <?php else:?>  
  13.         <h1>hello comm</h1>   
  14.     <?php endif;?>  
  15.     </body>  
  16. </html>  

(4)views/hello/about.php:视图之数据块的使用,和comm.php结合使用,在comm.php中调用这个block来覆盖原有的内容

  1. <h1>hello about!</h1>  
  2. <!--视图之数据块-->  
  3. <?php $this->beginBlock('block1');?>  
  4. <h1>this is block</h1>  
  5. <?php $this->endBlock();?>  
  6.   
  7. <!--1、在一个视图中显示另一个视图  
  8.     2、同时,还可以给test.php传参,通过给render方法添加第二个参数,这个参数只能是关联数组  
  9.     然后再test.php调用$v_test就可以显示了  
  10.     3、注意:可以render多次,即添加多个页面  
  11.     4、不能使用renderPartial()方法  
  12.     -->  
  13. <?php echo $this->render('test',array('a'=>'hello world'));?>  
  14. <?php echo $this->render('test2');?>  

(5)views/hello/index.php,这个hello文件夹是hello动作执行时要查找的对应的文件夹,用来显示页面

  1. <?php  
  2. use yii\helpers\Html;  
  3. use yii\helpers\HtmlPurifier;  
  4. ?>  
  5. <!--显示从控制器传过来的数据,$view_str存在数组中的值-->  
  6. <h1><?=$view_str?></h1>  
  7. <!--encode对变量中存在的js脚本进行转义,使其不运行,只是单纯的显示-->  
  8. <h1><?=Html::encode($view_str);?></h1>  
  9. <!--process方法彻底清除变量中存在的js脚本,连显示都没有了-->  
  10. <h1><?=HtmlPurifier::process($view_str_array[0]);?></h1>  

(6)views/hello/cache.php,片段缓存文件

  1. <?php   
  2.     //缓存时间  
  3.     //过了15,缓存就会失效,从而显示修改后的值  
  4.     $duration=15;  
  5.     //缓存依赖,跟数据缓存依赖一样  
  6.     $dependency=[  
  7.         'class'=>'yii\caching\FileDependency',  
  8.         'fileName'=>'hw.txt'  
  9.     ];  
  10.     //缓存的开关  
  11.     $enable=false;  
  12. ?>  
  13. <!--缓存开关的使用-->  
  14. <?php  
  15.      if($this->beginCache('cache_div',['enabled'=>$enable])){  
  16.  ?>  
  17. <!--通过缓存时间来设置cache失效的时间-->  
  18. <?php  
  19.     // if($this->beginCache('cache_div',['duration'=>$duration])){  
  20.  ?>  
  21.   
  22. <!--通过缓存依赖来控制cache失效的时间-->  
  23. <?php  
  24.     // if($this->beginCache('cache_div',['dependency'=>$dependency])){  
  25.  ?>  
  26.   
  27. <!--下面的内容会被添加到缓存,如果修改了里面的内容,那么显示的内容  
  28. 还是原来的内容-->  
  29. <div id='cache_div'>  
  30.     这里会被缓存11  
  31. </div>  
  32. <?php   
  33.     $this->endCache();  
  34.     }  
  35. ?>  
  36.   
  37. <div id='no_cache_div'>  
  38.     这里不会被缓存  
  39. </div>  


(7)views/hello/test.php,测试文件

  1. <h2>hello test</h2>  
  2. <h1><?=$a?></h1>  

(8)views/hello/test2.php,测试文件

  1. <h1><?=$new?></h1>  

© 著作权归作者所有

共有 人打赏支持
botkenni
粉丝 15
博文 377
码字总数 378586
作品 0
西城
程序员
Yii学习笔记:利用setFlash和runController打造个性化的提示信息页面

在实现Yii::success()这样的调用方式之前,你可能需要阅读我的这篇博文: 《Yii学习笔记:扩展YiiBase入口类》 之后请继续往下看: 首先我们在yii.php的Yii类里面添加两个方法: /** 成功提示...

吾爱
2013/12/28
0
0
实用的Laravel Debug调试工具

转载请注明: 转载自Yuansir-web菜鸟 | LAMP学习笔记 本文链接地址: 实用的Laravel Debug调试工具 主要推荐laravel几个适合开发调试用的工具 1.Clockwork 首先Chrome 插件 Clockwork 安装 Co...

Yuansir
2015/01/19
0
2
技术积累笔记概要

2015年11月24日 1、rest 速率限制,写属于自己的方法。 2、actions方法深刻了解。 3、YII技术博客:http://blog.csdn.net/terrywater/article/category/2565815。 4、静态方法传递参数的习惯...

风清扬-深圳
2015/11/24
78
0
来自IOS开发工程师的零基础自学HTML5经验分享

移动互联网的火爆,而Html具有跨平台、开发快的优势,越来越受到开发者的青睐。感谢IOS开发工程师“小木_Boy”’带来的HTML5学习经验分享。 一、学习途径 1、很多视频网站 比如慕课、和极客学...

inw3cschool
2017/03/21
0
0
yii2学习笔记--修改css和js文件(未完成)

(未完成,陆续添加内容) 一、通过模板文件添加的js和css如何修改: 1.1 修改AppAsset.php之中的css、js 假设模板文件为 views/layouts/main.php,观测可知其中有一句: AppAsset::register...

路过暴风
2016/01/06
813
1
Yii整合mongodb和mysql 使用mongodb gii

目前相关资料不是很完整。作此笔记。 一、上yii官网下载 YiiMongoDbSuite套件, 然后解压后改名为YiiMongoDbSuite 复制到你的webapp文件夹下面的extensions下面 二、在main.php文件进行添加 ...

feek
2013/06/14
0
5
Go语言学习资料整理

整理网上找到的Golang语言学习资料 基础 基础教程 书籍在线版 Go 指南-A Tour of Go Go语言圣经(中文版) Effective Go中文版 Go Web编程 build-web-application-with-golang Go入门指南 Th...

nothingfinal
2017/11/28
0
0
程序员最经常用的5大编程学习网站,你用过几个?

编程现在越来越受人们的欢迎。Python居然成了高考项目,纳入浙江省信息技术高考范畴。 有些新手程序员可能并不清楚在哪个网站学编程,下面我们不妨来看下程序员必须收藏的5大网站(适用于PHP...

W3Cschool
2017/12/13
0
0
Yii学习笔记:扩展YiiBase入口类

通过yiic.php自动创建一个应用后,入口文件初始代码如下: <?php// change the following paths if necessary$yii=dirname(FILE).'/../yii/framework/yii.php';$config=dirname(FILE).'/prot......

吾爱
2013/12/27
0
1
从小白到程序员的攻略(适合自学编程的网站)

随着信息时代、大数据时代、人工智能的发展,程序员这个行业也被推到了社会的浪尖上。人们对程序员的评价褒贬不一,而且各个程序员的编程水平和能力也参差不齐。程序员这个行业是一个要求自我...

室长
2017/12/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring Cloud Gateway 接口文档聚合实现

在微服务架构下,通常每个微服务都会使用Swagger来管理我们的接口文档,当微服务越来越多,接口查找管理无形中要浪费我们不少时间,毕竟懒是程序员的美德。 由于swagger2暂时不支持webflux 走...

冷冷gg
30分钟前
12
0
流利阅读笔记30-20180719待学习

1.今日导读 2.带着问题听讲解 3.新闻正文(中英文对照) 4.重点词汇 5.拓展内容

aibinxiao
33分钟前
1
0
OSChina 周五乱弹 —— 我们是食物链的最底层

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @温家成 :分享谢安琪的单曲《姿色份子》 《姿色份子》- 谢安琪 手机党少年们想听歌,请使劲儿戳(这里) @贪吃飒:最近p2p怎么了、半个月爆了...

小小编辑
46分钟前
6
1
Android Studio 3.0 之后打包apk出现应用未安装问题

1、废话 出现这个问题的原因,并不是只有一个,而是有多个原因,不懂的估计会被搞得一头雾水,下面我列举的是我遇到的几种问题和网友遇到的几种问题,但不一定是全部,也有可能有些莫名其妙的...

她叫我小渝
今天
0
0
前端基础

1. get请求传参长度的误区 误区:我们经常说get请求参数的大小存在限制,而post请求的参数大小是无限制的。 实际上HTTP 协议从未规定 GET/POST 的请求长度限制是多少。对get请求参数的限制是...

wenxingjun
今天
0
0
拦截SQLSERVER的SSL加密通道替换传输过程中的用户名密码实现运维审计(一)

工作准备 •一台SQLSERVER 2005/SQLSERVER 2008服务 •SQLSERVER jdbc驱动程序 •Java开发环境eclipse + jdk1.8 •java反编译工具JD-Core 反编译JDBC分析SQLSERVER客户端与服务器通信原理 SQ...

紅顏為君笑
今天
9
0
jQuery零基础入门——(六)修改DOM结构

《jQuery零基础入门》系列博文是在廖雪峰老师的博文基础上,可能补充了个人的理解和日常遇到的点,用我的理解表述出来,主干出处来自廖雪峰老师的技术分享。 在《零基础入门JavaScript》的时...

JandenMa
今天
0
0
linux mint 1.9 qq 安装

转: https://www.jianshu.com/p/cdc3d03c144d 1. 下载 qq 轻聊版,可在百度搜索后下载 QQ7.9Light.exe 2. 去wine的官网(https://wiki.winehq.org/Ubuntu) 安装 wine . 提醒网页可以切换成中...

Canaan_
今天
0
0
PHP后台运行命令并管理运行程序

php后台运行命令并管理后台运行程序 class ProcessModel{ private $pid; private $command; private $resultToFile = ''; public function __construct($cl=false){......

colin_86
今天
1
0
数据结构与算法4

在此程序中,HighArray类中的find()方法用数据项的值作为参数传递,它的返回值决定是否找到此数据项。 insert()方法向数组下一个空位置放置一个新的数据项。一个名为nElems的字段跟踪记录着...

沉迷于编程的小菜菜
今天
1
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部