image.png
根据URL地址去了解TP内部的实现机制。
学习: url->控制器下的方法->控制器—>方法—>url地址调用
控制器学习的问题:

  1. 控制器写在哪里?
  2. 控制器的文件的名称应该如何命名?
  3. 控制器里面的内容如何编写(内容:继承方法)?
  4. 控制器里面的方法如何被调用
  5. 控制器里面的方法里面是如何载入视图,变量和赋值,以及如何实例化模型,如何配置

    控制器的定义

    定义位置:Application\Home(前分组)\Controller\
    命名规则:控制器名+Controller(关键字,首字母大写)+.class.php(类文件后缀EXT变量)
    示例:定义user控制器 UserController.class.php
    image.png
    访问效果
    image.png
    Admin下
    image.png
    效果
    image.png

    URL访问模式

    通过我们上面的控制器的编写,以及URL地址的调用。我们发现可以使用index.php?m-Home&c=User&a-lst 这种方式可以调用某个模块下的控制器里面对应的方法
    但是我们需要考虑的时候,难道之后上面的这种方式进行调用吗?
    m c a这些信息很明显,直接暴露了模块的含义、控制器含义、方法含义。
    源码里面定义四种URL模式(源码中显示)
    image.png

  6. 普通模式(get模式)

示例:域名/index.phpm=Home&c=Test&a=index&id=123&page=100
格式:http://域名/入口文件?m=分组名&c=控制器名&a=方法名&参数名=参数值
image.png
最常见的模式

  1. pathinfo 模式(全部以斜线做为分隔符)

示例:域名/index.php/Home/Test/index/id/123/page/100
格式:http://域名/入口文件/分组名/控制器名/方法名/参数名1/参数值/参数名2/参数值
image.png

  1. rewrite 模式

对于上面的操作总是出现一个index.php 入口文件,但是对于URL地址过长,这部分信息完全可以省略,让用户看不见
示例:域名/Home/Test/index/id/123/page/100
格式:http://域名/分组名/控制器名/方法名/参数名1/参数值/参数名2/参数值
特点,在pathinfo基础上去掉了index.php入口文件
这种模式使用需要先做一个配置:
1)如果rewrite模块没有打开,需要打开注释
image.png
2) 配置虚拟主机的AllowOverride这项为All
image.png
3)在项目的根目录下创建一个.htaccess

  1. <IfModule mod_rewrite.c>
  2. Options +FollowSymlinks -Multiviews
  3. RewriteEngine On
  4. RewriteCond %{REQUEST_FILENAME} !-d
  5. RewriteCond %{REQUEST_FILENAME} !-f
  6. RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1]
  7. </IfModule>

效果
image.png

  1. 兼容模式

示例:域名/index.php?s=/Home/Test/index&id=123&page=100
格式:http://域名/入口文件?s=/分组名/控制器名/方法名&参数名=参数值
特点:使用s字母参数表示整个分组控制器方法整体
这四种访问模式都可以正常使用,互不影响。
在主配置文件中,有一项配置针对这四种访问模式:
默认设置为pathinfo模式,但是并不影响这四种模式的使用。
这个配置影响一个系统的动态生成URL的函数的返回结果。
image.png
这四种访问模式都可以正常使用,互不影响。建议使用的第二种(pathinfo模式,对SEO很有好)
在惯例配置文件中,有一项配置针对这四种访问模式:但是需要注意的,用户在地址栏可以使用上面的任何方式进行范围,但是这个配置项主要是针对TP内的U函数进行使用的。
image.png

U函数动态生成URL

TP框架在公共函数库文件functions.php中提供了很多内置函数,其中U函数用来动态生成url。会根据配置项中的UTL_MODEL的设置,生成不同格式的URL
如果修改配置中的URL_MODEL 可以改变U函数的输出结果的格式
注意:如果修改配置项,不要在主配置文件直接修改,在应用层级和分组层级的配置文件中配置一个相同的项,可以对主配置文件中的配置作一个覆盖。

  1. public function add(){
  2. //载入一个添加用户的信息视图
  3. // var_dump($_GET['id']);
  4. $url=U('lst');//生成地址的格式,取决于配置文件
  5. $url1=U('lst',array('id'=>22));
  6. $url2=U('lst','id=2');
  7. $url3=U('lst','id=2&type=1');
  8. $url4=U('lst',array('id'=>22),'shtml');
  9. $url5=U('lst',array('id'=>22),false);
  10. var_dump($url);
  11. echo '<hr>';
  12. var_dump($url1);
  13. echo '<hr>';
  14. var_dump($url2);
  15. echo '<hr>';
  16. var_dump($url3);
  17. echo '<hr>';
  18. var_dump($url4);
  19. echo '<hr>';
  20. var_dump($url5);
  21. }

效果
image.png
image.png
image.png