URL到控制器方法的映射
用到的函数
- $_SERVER[‘PATH_INFO’] 解析访问地址
- array_filter 获取数组中的空值
- array_values 将数组从0开始重新排列
- array_slice 获取数组中的任意值 参数1:数组,参数2:位置,参数3:取出的数量
- array_shift 取出数组第一个键值
- array_pop 获取数组最后一个键值
- ucfirst 将首字母转换大写
示例
<?php
namespace Url;
class MyurlController
{
public function index()
{
return '调用了index方法!';
}
}
// $pathinfo = explode('/',$_SERVER['PATH_INFO']);
// //PATH_INFO取出网址/admin/admin888/action/index用explode转为数组
// $pathinfo = array_filter($pathinfo);
// //array_filter过滤数组中的空值
// $pathinfo = array_values($pathinfo);
// //array_values对数组从0重新排列
$pathinfo = array_values(array_filter(explode('/',$_SERVER['PATH_INFO'])));
// 将网址转换返回一个数组
// $pathinfo = array_pop($pathinfo);
// 取出数组最后一个键值
// $pathinfo =array_slice($pathinfo,-2,1);
//array_slice取出数组中倒数第二键值,参数1:数组,参数2:取出的位置,参数3:取出几个值
// $pathinfo = array_shift($pathinfo);
//取出数组的值
// $pathinfo = ucfirst($pathinfo);
//ucfirst将键值第一个字母转换大写
$pathinfo = ucfirst(array_shift(array_slice($pathinfo,-2,1)));
//取出网址中的myurl将首字母转换大写
$controller = __NAMESPACE__.'\\'.$pathinfo.'Controller';
//取出的网址数组中的值和命名空间作为调用的类(生成解析控制器的类名称)
$action = array_pop(explode('/',$_SERVER['PATH_INFO']));
//取出网址数组中最后一个值,作为调用的方法(生成解析控制器的类方法)
echo (new $controller)->$action();
//使用生成的控制器类名称及方法调用类
示例图:
地址通过url传值
示例:
<?php
namespace Url;
class Myurl
{
public function index($id,$name,$age,$mobile)
{
return '您的ID是:'.$id.'您的用户名是:'.$name.'您的年龄是:'.$age.'您的手机是:'.$mobile;
}
}
$pathinfo = array_values(array_filter(explode('/',$_SERVER['PATH_INFO'])));
$controller = __NAMESPACE__ .'\\'.ucfirst(array_shift($pathinfo));
$action = array_shift($pathinfo);
// print_r($pathinfo);
$params =[];
for($i = 1 ; $i < count($pathinfo);$i+=2)
{
$params[$pathinfo[$i]] = $pathinfo[$i];
}
echo call_user_func_array([(new $controller),$action],$params);、
示例图:
解析Url值
<?php
namespace Url;
class MyurlController
{
public $pathinfoClass;
public $pathinfoMethod;
public $params = [];
public function index($id,$name,$age,$mobile)
{
return 'Url传值无键调用类:用户ID:'.$id.' 用户姓名:'.$name.' 用户年龄:'.$age.' 用户手机:'.$mobile;
}
public function getClass($pathinfo)
{
$this->pathinfoClass = array_shift(array_splice($pathinfo,-2,1));
$this->pathinfoClass = __NAMESPACE__.'\\'. ucfirst($this->pathinfoClass).'Controller';
return $this->pathinfoClass;
}
public function getMethod($pathinfo)
{
$this->pathinfoMethod = array_pop($pathinfo);
return $this->pathinfoMethod;
}
public function getDate($pathinfo)
{
$pathinfo =array_slice($pathinfo,0,4);
for($i = 0 ;$i < count($pathinfo);$i++)
{
$this->params[$pathinfo[$i]] = $pathinfo[$i];
}
return $this->params;
}
}
$pathinfo = array_values(array_filter(explode('/',$_SERVER['PATH_INFO'])));
$pathinfoClass = (new MyurlController)->getClass($pathinfo);
$pathinfoMethod = (new MyurlController)->getMethod($pathinfo);
$params =(new MyurlController)->getDate($pathinfo);
echo call_user_func_array([(new $pathinfoClass),$pathinfoMethod],$params);
示例图: