Thinkphp5.0快速入门笔记(2)
学习来源与说明
https://www.kancloud.cn/thinkphp/thinkphp5_quickstart
测试与部署均在windows10下进行学习。
示例建立新的模块和控制器
在application模块下,建立新的模块,取名为new_controller,则建立新的文件夹,取名new_controller,然后在之下建立文件夹controller,模块在controller之下创建,建立模块blog,则创建Blog.php如图所示。
Blog.php中的内容如下:
<?php namespace app\new_controller\controller; class Blog { public function get($id=10) { return \'查看id=\' . $id . \'的内容\'; } public function read($name) { return \'查看name=\' . $name . \'的内容\'; } public function archive($year, $month) { return \'查看\' . $year . \'/\' . $month . \'的归档内容\'; } }
其中的namespace app\new_controller\controller中,new_controller和创建的模块(目录)一致,
其中的class Blog中,Blog控制器和创建的文件Blog.php一致。
而控制器中可访问的方法即为public function部分。
ThinkPHP的URL访问
URL访问的完整路径为:
http://serverName/index.php/模块/控制器/操作。
例如访问:http://127.0.0.1/index.php/new_controller/blog/get/id/4(和上一段中的配置有关系)
另外说明:控制器和操作名不区分大小写。如:http://127.0.0.1/index.php/new_controller/BLOG/GET/Id是合法的。
可设置:如果希望严格区分大小写访问。// 关闭URL自动转换(支持驼峰访问控制器)\’url_convert\’ => false(application中的config.php)
URL传递参数
访问:http://127.0.0.1/index.php/new_controller/blog/get/id/4
对应到了new_controller模块,blog控制器,get方法,id参数设置为4进行传递。
效果如下:(不传递参数默认id10传递)
访问:http://127.0.0.1/index.php/new_controller/blog/archive/year/2019/month/12两个参数传递。
当设置application下的config.php文件中的约92行处的url_param_type为1,则参数传递变为:http://127.0.0.1/index.php/new_controller/BLOG/Archive/2019/12。
效果如下:
隐藏URL中的index.php
原始地址为:http://serverName/index.php/模块/控制器/操作。这里的index.php是指代根目录中public下的index.php文件,其内容指定了application路径
隐藏index.php是否需要,可以先试试直接去掉index.php,如:http://127.0.0.1/new_controller/blog/archive/year/2019/month/12,访问成功则OK。
而入门教程中认为:在apache中,需要.htaccess 文件下写入以下代码完成:(其它的类型的都在教程里了)
<IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] </IfModule>
URL路由缩减
在application下的route.php定义了路由信息,如修改其为如下:
<?php return [ \'__pattern__\' => [ \'name\' => \'\w+\', ], \'[hello]\' => [ \':id\' => [\'index/hello\', [\'method\' => \'get\'], [\'id\' => \'\d+\']], \':name\' => [\'index/hello\', [\'method\' => \'post\']], ], \'blog/:id\' => \'new_controller/blog/get/\', ];
即增加了一行路由信息,那么访问:http://127.0.0.1/blog/123,即等价于访问:http://127.0.0.1/new_controller/blog/get/id/123。效果如下:
更改以上代码中第10行为:
\'blog/[:id]\' => \'new_controller/blog/get/\',
则id参数的传递可以成为可选,则访问地址http://127.0.0.1/blog/正常输出不报错,否则报错。
针对index模块(以上都在说new_controller模块),则路由中可以省略为:
\'blog/[:id]\' => \'/blog/get/\',
默认index模块,直接写了控制器。index/blog/get/
路由规则
如:\’hello/[:name]\’ => [\’index/hello\’, [\’method\’ => \’get\’, \’ext\’ => \’html\’]],
定义了路由规则限制了必须是get 请求,而且后缀必须是html 的,
路由简化
相同的部分路由可以简化,如以下路由信息:
\'[blog]\' => [ \':year/:month\' => [\'blog/archive\', [\'method\' => \'get\'], [\'year\' => \'\d{4}\', \'month\' => \'\d{2}\']], \':id\' => [\'blog/get\', [\'method\' => \'get\'], [\'id\' => \'\d+\']], \':name\' => [\'blog/read\', [\'method\' => \'get\'], [\'name\' => \'\w+\']], ],
可以简化为:
\'[blog]\' => [ \':year/:month\' => [\'blog/archive\', [\'method\' => \'get\'], [\'year\' => \'\d{4}\', \'month\' => \'\d{2}\']], \':id\' => [\'blog/get\', [\'method\' => \'get\'], [\'id\' => \'\d+\']], \':name\' => [\'blog/read\', [\'method\' => \'get\'], [\'name\' => \'\w+\']], ],
其它
在__pattern__ 中定义的变量规则我们称之为全局变量规则,
同时定义了全局规则和局部规则的话,当前的局部规则会覆盖全局规则
剩余复杂路由见说明书。