博客列表 >写一个简单的路由,将URL地址直接路由一个函数——2019年8月7日22时01分

写一个简单的路由,将URL地址直接路由一个函数——2019年8月7日22时01分

嘿哈的博客
嘿哈的博客原创
2019年08月11日 23:55:551023浏览

路由的原理与实现

1.从pathinfo分割出独立单元保存为数组;

2.从pathinfo解析出模块/控制器/操作;

3.从pathinfo解析出变量键值对;


实例

<?php

//print_r($_SERVER['REQUEST_URI']);
//演示地址:http://php.io/%E4%BD%9C%E4%B8%9A/0807/index.php/hello/id/1/name/hjc

//获取URL地址
$url = $_SERVER['REQUEST_URI'];

//分割成独立单元保存为数组
$request = explode('/',$url);

//echo '<pre>'.print_r($request,true);

//将键名action绑定变量方法名
$pathinfo['action'] = $request['4'];

//echo '<pre>'.print_r($pathinfo,true);

//offset偏移量,将偏移量之后的键值对另存为一个数组
$values = array_slice($request,5);

//echo '<pre>'.print_r($values,true);

//路由一个函数,闭包函数,use() 连接闭包和外界变量。
$pathinfo['action'] = function (...$values) use ($pathinfo)
{
//    echo '<pre>'.print_r($values,true);
    for ($i=0;$i<count($values);$i=$i+2)
    {
        if (isset($values[$i+1]))
        {
            $params[$values[$i]] = $values[$i+1];
        }
    }

    $res = '';
    foreach ($params as $key => $value)
    {
        $res .= $key . '='.$value.',';
    }

    return '方法名:'.$pathinfo['action'].'键值对:'.$res;
};

echo call_user_func_array($pathinfo['action'],$values);

运行实例 »

点击 "运行实例" 按钮查看在线实例


关于本节课其他笔记:

容器的原理:

是一个类,需至少提供2个功能,一个创建类实例,一个取出类实例;

步骤:

1.初始化一个空数组 protected $instance = [];

2.将某个类实例绑定在容器中 $this->instance[$alias]=$process

3.从容器中取出对象 return call_user_func_array($this->instance[$alias],$params);

4.将模型与视图的实例绑定到容器

5.创建控制器,实例化并打印出来;



实例

<?php

namespace demo1;

require 'Model1.php';
require 'View1.php';

class Container
{
//    类实力数组,对象池
    protected $instance = [];
//    将某个类绑定到容器中
    public function bind($alias, $process)
    {
        $this->instance[$alias] = $process;
    }
//    从容器中取出对象
    public function make($alias,$params = [])
    {
        return call_user_func_array($this->instance[$alias],$params);
    }
}
$container = new Container();
$container->bind('Model1',function (){return new \Model1();});
$container->bind('View1',function (){return new \View1();});

//控制器
class Controller
{
    public function index(Container $container)
    {
        $data = $container->make('Model1')->getData();

        return $container->make('View1')->fetch($data);
    }
}

$controller = new Controller();
echo $controller->index($container);

运行实例 »

点击 "运行实例" 按钮查看在线实例



门面原理:

1.创建容器类实例和模型数据

2.初始化方法对$container进行后期静态绑定

3.创建获取数据静态接口和渲染模板的静态接口

4.创建商品继承门面进行实例化


实例

<?php

require 'Model1.php';
require 'View1.php';

class Container
{
    //对象池
    protected $instance = [];
    //实例绑定到容器中
    public function bind ($alias , Closure $process)
    {
        //类实力保存到容器中
        $this->instance[$alias] = $process;
    }
    public function make($alias,$params=[])
    {
        return call_user_func_array($this->instance[$alias],$params);
    }
}
//将模型与视图的实例绑定到容器中
$container = new Container();
$container->bind('Model1',function (){return new Model1();});
$container->bind('View1',function (){return new View1();});

//门面
class Facade
{
    //容器类的实例
    protected static $container = null;
    //模型数据
    protected static $data = [];
    //初始化方法
    public static function initialize(Container $container)
    {
        static::$container = $container; //后期静态绑定
    }
    //获取模型数据静态接口
    public static function getData()
    {
        static::$data = static::$container->make('Model1')->getData();
    }
    //渲染模板的静态接口
    public static function fetch()
    {
        return static::$container->make('View1')->fetch(static::$data);
    }
}

//商品类
class Product extends Facade
{

}

//客户端控制器
class Controller
{
    public function __construct(Container $container)
    {
        Product::initialize($container);
    }
    public function index()
    {
        Product::getData();

        return Product::fetch();
    }
}

$controller = new Controller($container);
echo $controller->index();

运行实例 »

点击 "运行实例" 按钮查看在线实例

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议