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

2022-01-10 10:34:51 浏览数 (2)

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

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

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

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

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

  1. <?php
  2. use yiihelpersHtml;
  3. use yiihelpersHtmlPurifier;
  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'=>'yiicachingFileDependency',
  8. 'fileName'=>'hw.txt'
  9. ];
  10. //缓存的开关
  11. $enable=false;
  12. ?>
  13. <!--缓存开关的使用-->
  14. <?php
  15. if(this->beginCache('cache_div',['enabled'=>
  16. ?>
  17. <!--通过缓存时间来设置cache失效的时间-->
  18. <?php
  19. // if(this->beginCache('cache_div',['duration'=>
  20. ?>
  21. <!--通过缓存依赖来控制cache失效的时间-->
  22. <?php
  23. // if(this->beginCache('cache_div',['dependency'=>
  24. ?>
  25. <!--下面的内容会被添加到缓存,如果修改了里面的内容,那么显示的内容
  26. 还是原来的内容-->
  27. <div id='cache_div'>
  28. 这里会被缓存11
  29. </div>
  30. <?php
  31. $this->endCache();
  32. }
  33. ?>
  34. <div id='no_cache_div'>
  35. 这里不会被缓存
  36. </div>

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

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

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

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

0 人点赞