必须吃透MVC架构组织方式和四种URL访问模式:MVC要求APP_PATH路径正确、控制器命名规范(如IndexAction.class.php)、模型用D()方法驼峰调用、视图按约定路径存放;四种URL模式(普通模式0、PATHINFO模式1、REWRITE模式2、兼容模式3)需在config.php中显式配置URL_MODEL并匹配服务器重写规则,否则路由失效导致404或空白。

要快速掌握ThinkPHP 3.2开发,必须吃透官方手册中MVC架构组织方式和四种URL访问模式的配置逻辑与运行差异,否则连控制器都调用失败,页面直接报错404或空白。
MVC架构在ThinkPHP 3.2中的实际落地
第一步:确认应用目录结构是否符合约定——【APP_PATH必须指向包含Application(或自定义名)的绝对/相对路径,且该目录下必须存在Common、Home等模块子目录】。入口文件index.php里define('APP_PATH', './Application/')这行写错位置或路径拼写错误,整个MVC链就断了。
第二步:控制器文件必须放在Application/模块名/Controller/目录下,命名规则为“类名+Action.class.php”,比如IndexAction.class.php;类名必须与文件名一致,且继承Action基类。漏掉.class.php后缀或继承错类,框架加载时会抛出Fatal error。
第三步:模型层默认走Application/模块名/Model/目录,使用D('User')自动实例化UserModel.class.php。但注意:【D方法只识别首字母大写的驼峰命名,UserLoginLog对应UserLoginLogModel,不能写成userloginlog】。
立即学习“PHP免费学习笔记(深入)”;
第四步:视图文件默认存放在Application/模块名/View/控制器名/操作名.html,例如Index/index.html。模板中用
URL模式切换与路由生效条件
ThinkPHP 3.2支持四种URL模式,实际项目中必须根据服务器环境选择并显式配置,否则U()函数生成链接、表单提交、重定向全部失效。
方法一:普通GET模式(兼容性最强)
在Application/Common/Conf/config.php中添加:'URL_MODEL' => 0。此时所有URL形如index.php?m=Home&c=Index&a=index。Apache/Nginx/IIS全适配,但URL丑陋且暴露参数。
方法二:PATHINFO模式(开发调试首选)
设置'URL_MODEL' => 1,并确保Apache开启mod_rewrite且项目根目录存在.htaccess文件。Nginx需手动配置fastcgi_split_path_info指令,否则$_SERVER['PATH_INFO']为空,框架无法解析模块/控制器/操作。
方法三:REWRITE模式(生产环境推荐)
设置'URL_MODEL' => 2,同时删除URL中的index.php前缀。Apache下.htaccess必须包含RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L];Nginx则需location ~ \.php(.*)$ { fastcgi_split_path_info ^(.+?\.php)(/.*)$; },缺一不可。
方法四:兼容模式(过渡方案)
设置'URL_MODEL' => 3,URL形如index.php?s=/Home/Index/index。它不依赖服务器重写模块,但s参数易被WAF拦截,且不利于SEO。
控制器方法调用与URL参数解析
第一步:访问http://localhost/Home/Index/index时,框架按URL_MODEL=1解析出模块Home、控制器Index、操作index,自动实例化Home\Controller\IndexAction类并执行index方法。
第二步:若URL带参数如http://localhost/Home/Index/detail/id/123/name/test,PATHINFO模式下$id = I('get.id')可取到123,$name = I('get.name')取到test。I()函数自动过滤危险字符,比直接$_GET安全。
第三步:POST数据统一用I('post.')获取,文件上传用$_FILES或I('upload.'),但【I函数不处理数组嵌套,如name[title][id]需改用$_POST['name']['title']['id']】。
第四步:U('Home/User/profile', array('id'=>5, 'tab'=>'info'))生成对应URL,其格式完全由URL_MODEL决定——模式0输出?m=Home&c=User&a=profile&id=5&tab=info,模式2输出/Home/User/profile/id/5/tab/info。



















