简单响应式网站设计代码,设计说明万能模板200字,机加工如何用网站开发客户,苏州模板网站建站路由是一个框架中必不可少的组件#xff0c;其作用是把 URL 按照预定规则解析到特定控制器中。我们在这里定义了两种路由规则#xff1a;查询字符串。在路径后面使用问号加参数#xff0c;多个参数用 分隔。在配置文件使用 querystring 表示#控制器/方法?参数1值1其作用是把 URL 按照预定规则解析到特定控制器中。我们在这里定义了两种路由规则查询字符串。在路径后面使用问号加参数多个参数用 分隔。在配置文件使用 querystring 表示#控制器/方法?参数1值1参数2值2http://domain/user/info?namephpchapter10路径以路径的形式将参数和值添加到后面中间用 / 分隔。配置中使用 restful#控制器/方法/参数1/值1/参数2/值2https://domain/user/info/name/php/chapter/100主控制器在目录 core 创建 Controller.php该类继承 Containernamespace core;class Controller extends Container{}主控制器可以添加控制器公共方法如页面渲染 render()错误代码等所有控制器必须继承主控制器。由于主控制器继承 Container因此控制器也是分发器的子类可以通过 register() 获取实例。控制器类类命名规则控制器命名遵循大写开头的驼峰命名规则并且默认添加后缀 Controller控制器文件命名和类命名一样如控制器类 UserController其文件命名为 UserController.php。方法命名规则方法命名遵循小写开头的驼峰命名规则并且默认添加请求方式(如getpostput等)前缀如 getIndex()postUpdate()。以上例 UserController 为例namespace controller;use core\Controller;class UserController extends Controller{/*** HTTP 请求方式为 GET 时有效* url 为 /user/info**/public function getInfo(){}/*** HTTP 请求方式为 POST 时有效* url 为 /user/update**/public function postUpdate(){}}路由解析在 core 目录下创建 Router.php$ cd tinyphp/core$ touch Router.php在构造函数中定义变量namespace core;use dispatcher\Container;class Router extends Container{public $method;public $uri;public $path;public function __construct(){$this-method $_SERVER[REQUEST_METHOD] ?? GET;$this-uri $_SERVER[REQUEST_URI];$this-path $_SERVER[PATH_INFO];}}常见 $_SERVER 字段$_SERVER[PATH_INFO] URL的路径信息如 /user/info$_SERVER[REQUEST_METHOD] 请求方法如 POSTGET$_SERVER[REQUEST_URI] 完整 URL如 /user/info?id1nameLucy在 start() 方法中解析 URLprotected function start(){/*** 也可以写成 Config::get(default.route,querystring);**/$route Config::get(default.route) ?? querystring;//解析 controller 和 action$path explode(/,trim($this-path,/));if (empty($path[0])) {$path[0] Config::get(default.controller,index);}$controller ucfirst($path[0]).Controller;//获取请求方法$method strtolower($this-method);$action $method.ucfirst($path[1] ?? Config::get(default.action,index));//获取参数$args [];if (method_exists($this,$route)) {$args call_user_func_array([$this,$route],[$this-uri]);}return [controller$controller,action$action,args$args];}querystring() 参数解析private function querystring($url){$urls explode(?, $url);if (empty($urls[1])) {return [];}$param_arr [];$param_tmp explode(, $urls[1]);if (empty($param_tmp)) {return [];}foreach ($param_tmp as $param) {if (strpos($param, )) {list($key,$value) explode(, $param);//变量名是否复合规则if (preg_match(/^[A-Za-z_][A-Za-z0-9_]*$/, $key)) {$param_arr[$key] $value;}}}return $param_arr;}querystring 的参数为 ? 后面的部分多个参数用 分隔。restful() 参数解析private function restful($url){$path explode(/, trim(explode(?, $url)[0], /));$params [];$i 2;while (1) {if (!isset($path[$i])) {break;}$params[$path[$i]] $path[$i1] ?? ;$i $i2;}return $params;}restful 的参数为方法后面的路径。完整代码如下namespace core;use dispatcher\Container;class Router extends Container{public $method;public $uri;public $path;public function __construct(){$this-method $_SERVER[REQUEST_METHOD] ?? GET;$this-uri $_SERVER[REQUEST_URI];$this-path $_SERVER[PATH_INFO];}protected function start(){$route Config::get(default.route) ?? querystring;//解析 controller 和 action$path explode(/,trim($this-path,/));if (empty($path[0])) {$path[0] Config::get(default.controller,index);}$controller ucfirst($path[0]).Controller;//获取请求方法$method strtolower($this-method);$action $method.ucfirst($path[1] ?? Config::get(default.action,index));//获取参数$args [];if (method_exists($this,$route)) {$args call_user_func_array([$this,$route],[$this-uri]);}return [controller$controller,action$action,args$args];}/*** 查询字符串参数* 后参数通过分隔**/private function querystring($url){$urls explode(?, $url);if (empty($urls[1])) {return [];}$param_arr [];$param_tmp explode(, $urls[1]);if (empty($param_tmp)) {return [];}foreach ($param_tmp as $param) {if (strpos($param, )) {list($key,$value) explode(, $param);//变量名是否复合规则if (preg_match(/^[A-Za-z_][A-Za-z0-9_]*$/, $key)) {$param_arr[$key] $value;}}}return $param_arr;}/*** 路径参数* 控制器/方法/参数1/值1/参数2/值2**/http://domain/user/info/name/entner?namephpchapter10private function restful($url){$path explode(/, trim(explode(?, $url)[0], /));$params [];$i 2;while (1) {if (!isset($path[$i])) {break;}$params[$path[$i]] $path[$i1] ?? ;$i $i2;}return $params;}}路由调用方式为$router Rouer::start();测试路由在配置文件 app/conf/config.php 中设置默认路由为 querystringreturn [default [controller index,action index,route querystring,//还可以设置为 restful],view [dir layout,file base,]];在 core/Application.php 文件中 run() 方法实现路由调用...public function run(){$router Router::start();echo ;print_r($router);}...启动 PHP 内置服务器$ cd tinyphp/public$ php -S localhost:8080在浏览器中输入 http://localhost:8080/course/document?namephpchapter10输出结果为Array([controller] CourseController[action] getDocument[args] Array([name] php[chapter] 10))同理可以测试 restful 路由规则。调用控制器方法路由解析后获得需要调用的控制器名方法和参数。由于控制器继承分发器后可以通过 register() 获取实例编辑 core/Applicaiton.php...public function run(){$router Router::start();//注意使用命名空间$controller controller\\.$router[controller];$action $router[action];$args $router[args];echo call_user_func_array([$controller::register(),$action],$args);}...通过这种方式可以实现方法调用但是无法控制方法参数比如有时候我们需要在方法参数中使用某个对象实例术语称为依赖注入即把需要使用的实例注入到方法中那么可以通过PHP的高级特性反射来实现。