本学习课程以学习为目的一周三篇持续更新,学习代码更新在码云公开仓库,不足之处欢迎朋友们前来指导,写作不易请多多支持,本人创作新手写的不好,不喜勿喷,谢谢大家。
学习目标
码云编号:d3d526f18ec814574ae88504a08d0eda5bafd0b3
6.0的URL访问受路由影响,如果在没有定义或匹配路由的情况下(并且没有开启强制路由模式的话),则是基于: http://serverName/index.php(或者其它入口文件)/控制器/操作/参数/值… 如果使用自动多应用模式的话,URL一般是 http://serverName/index.php/应用/控制器/操作/参数/值...
我们的实际操作是
index.php
(也可以是其它的入口文件,但URL重写通常只能设置一个入口文件),下面是相关服务器的配置参考:
在httpd.conf
配置文件中加载了
mod_rewrite.so
模块
将AllowOverride None
将选项
None
改为
All
;
.htaccess
文件放到应用入口文件的同级目录下(一般来说如果你是通过Composer安装,这些配置是框架默认配置,无需修改
) <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>
码云编号:c0ce7020f8d0db4eb1d9fd20badaacf6b60d87a4
http://tp.com/?s=admin/hello/name/worid
解决办法是打开public下的.htaccess文件, 把:RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] 改为:RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1]
// 访问控制器层名称 'controller_layer' => 'controller', //例如修改为 'controller_layer' => 'controllersite',
<?php namespace app\controller; class Site { public function index(){ return "hello worid"; } }
<?php namespace app\controller; class Site { public function index(){ return "hello worid"; } public function hello(){ return "123"; } }
http://tp.com/site (由于每个控制器的index方法是默认方法,此时访问index方法可以免写) http://tp.com/site/hello
<?php namespace app\controller; class HelloWorid { public function index(){ return 'hello worid'; } }访问方式如下
http://tp.com/helloworid http://tp.com/hello_worid
// 操作方法后缀 'action_suffix' => '', //打开设置 'action_suffix' => 'true',设置此选项是因为,后边使用模型的时候模型名和控制器名相同,为了避免混淆使用,此设置打开后就需要为控制器增加Controller后缀,比如前面的Site控制器就需要更名为SiteController.php
码云编号:85a21c00bab259b23287fe8e63595e4456a3da59
public function index(){ return 'hello worid'; }
<?php namespace app\controller; class HelloWorid { public function index(){ return 'hello worid'; } public function date(){ $date = array('a'=>1, 'b'=>2, 'c'=>3); return json($date); } }
<?php namespace app\controller; class HelloWorid { public function index(){ return 'hello worid'; } public function date(){ $date = array('a'=>1, 'b'=>2, 'c'=>3); $data = 'abc'; halt('测试'); return json($date); } }
码云编号:6196cdf6fb1987b3b8757763889720b4a77bafd4
<?php namespace app\controller; use app\BaseController; class Basics extends BaseController { public function index() { //返回实际路径 return $this->app->getBasePath(); } }
返回当前方法名
<?php namespace app\controller; use app\BaseController; class Basics extends BaseController { public function index() { //返回实际路径 //return $this->app->getBasePath(); // //返回当前方法名 return $this->request->action(); } }
控制器验证,我们来写一个test方法
<?php namespace app\controller; use app\BaseController; use think\exception\ValidateException; class Basics extends BaseController { public function index() { //返回实际路径 // return $this->app->getBasePath(); // //返回当前方法名 return $this->request->action(); } //验证方法,验证定义值是否合法 public function test(){ try { $this->validate( [ 'name' => 'thinkphp', 'email' => 'thinkphp@qq.com', ], 'app\validate\User'); } catch (ValidateException $e) { // 验证失败 输出错误信息 dump($e->getError()); } } }
访问地址:http://tp.com/Basics/test 提示错误,那是因为我没有设置验证器
在app目录下创建 validate目录,并创建user验证器user.php文件
<?php namespace app\validate; use think\Validate; class User extends Validate { protected $rule = [ //设置规则 //name 不能为空,长度为25 'name' => 'require|max:25', 'age' => 'number|between:1,120', 'email' => 'email', ]; }
我们在次访问:http://tp.com/Basics/test,没有报错,也没有输出,我们把test方法的name设置为空再试一下,页面输出“^ "name不能为空"”
我们可以再完善一下自定义错误提示信息
<?php namespace app\validate; use think\Validate; class User extends Validate { protected $rule = [ //设置规则 //name 不能为空,长度为25 'name' => 'require|max:25', 'age' => 'number|between:1,120', 'email' => 'email', ]; protected $message = [ 'name.require' => '名字都不填,食屎呀雷', 'name.max' => '名称最多不能超过25个字符', 'age.number' => '年龄必须是数字', 'age.between' => '年龄只能在1-120之间', 'email' => '邮箱格式错误', ]; }
我们刷新一下,错误信息提示“^ "名字都不填,食屎呀雷"”
码云编号:3619d2600402ba36b3581ead7a4b168f42735fb5
Error
)类,利用这个机制我们可以用来定制错误页面和进行URL的优化<?php namespace app\controller; class Error { public function index(){ return '当前控制器不存在'; } }
http://tp.com/user
系统会自动跳转到Error控制器,并执行返回定义的内容,
码云编号:8c1e63cbf1ca598014d514e23464e21e770edc8f
<?php namespace app\controller\user; class UserName { public function user(){ return 'index'; } }
http://tp.com/user.username/user
只需用点连接controlle下的user目录和user目录的username控制器即可