服务容器
<?php
// 类1
class Model1
{
public function model()
{
return __FILE__;
}
}
// 类2
class View1
{
public function view()
{
return __CLASS__;
}
}
// 服务容器
class Controller
{
// 装对象的容器
protected $instances = [];
// 绑定对象的方法:向对象容器中添加一个类实例
// $alias:要添加的对象
// \Closure:类型约束,闭包
// $process:实列化的过程
public function bank($alias, \Closure $process)
{
// 实列化对象
$this->instances[$alias] = $process;
}
// 取出对象的方法
// $alias:要取出的对象
// $params = []:构造函数所使用的参数,以数组的形式传递
public function make($alias,$params = [])
{
return call_user_func_array($this->instances[$alias],[]);
}
// 销毁对象的方法
// $alias:要销毁对象
public function unset($alias)
{
unset($this->instances[$alias]);
}
}
$facade = new Controller;
// 绑定方法
$facade->bank('model',function(){return new Model1;});
$facade->bank('view',function(){return new view1;});
// 控制器
class Controller1
{
// 把服务容器的实列化当成参数传递给控制器中方法
// facade:类型限定
// $facade:服务容器的实列化
public function index(controller $facade)
{
return $facade->make('model')->model();
}
}
// 客户端
$controllers = new Controller1;
echo $controllers->index($facade);
facade
<?php
// 类1
class Model1
{
public function model()
{
return __FILE__;
}
}
// 类2
class View1
{
public function view()
{
return __CLASS__;
}
}
// 服务容器
class Controller
{
// 装对象的容器
protected $instances = [];
// 绑定对象的方法:向对象容器中添加一个类实例
// $alias:要添加的对象
// \Closure:类型约束,闭包
// $process:实列化的过程
public function bank($alias, \Closure $process)
{
// 实列化对象
$this->instances[$alias] = $process;
}
// 取出对象的方法
// $alias:要取出的对象
// $params = []:构造函数所使用的参数,以数组的形式传递
public function make($alias,$params = [])
{
return call_user_func_array($this->instances[$alias],[]);
}
// 销毁对象的方法
// $alias:要销毁对象
public function unset($alias)
{
unset($this->instances[$alias]);
}
}
$controller = new Controller;
// 绑定方法
$controller->bank('model',function(){return new Model1;});
$controller->bank('view',function(){return new view1;});
// 4. Facade门面技术: 可以接管对容器中的对象的访问
class Facade
{
// 服务容器实例属性
protected static $containers = null;
// 数据
protected static $data = [];
// 初始化方法
// 初始化方法: 从外部接收一个依赖对象: 服务容器的实例
// $container:服务容器的实例
public static function initialize(controller $controller)
{
static::$containers = $controller;
}
public static function make()
{
static::$data = static::$containers->make('model')->model();
}
public static function view()
{
return static::$data = static::$containers->make('view')->view(static::$data);
}
}
// 控制器
class Controller1
{
// 构造方法: 调用门面的初始化方法
public function __construct(controller $controller)
{
Facade::initialize($controller);
}
public function index()
{
return facade::view();
}
}
// 客户端
$controllers = new Controller1($controller);
echo $controllers->index();
路由
<?php
// $_SERVER['QUERY_STRING']:查询字符串/URL/查询变量/GET变量
// ?action=edit&id=19&name=admin
// $_SERVER['PATH_INFO']:路径变量
// /user/getuser/id/200/name/admin
// 通过PATHINFO,解析url中控制器和方法
http://php.cn/php/0514/routs.php/user/getuser?id=200&name=adname
class user
{
public function getUser($id, $name)
{
return "id ==> $id, name ==> $name";
}
}
// 1. 解析出PATHINFO
// explode():把字符串分解为数组
// array_filter():过滤数组的空元素
// array_values():将数组中只从新排列
$pathinfo = array_values(array_filter( explode('/' , $_SERVER['PATH_INFO'])));
// print_r($pathinfo) ;
// 2. 解析控制器
// ucfirst():首字母转为大写
$controller = ucfirst($pathinfo[0]);
// echo $controller;
// 3. 解析控制器中的方法
$action = $pathinfo[1];
// echo $action;
// 4. 解析参数:返回值是数组
// $_SERVER['QUERY_STRING']:获取url后面的参数以及值的
// parse_str():把查询字符串解析到变量中:参数1:查询字符串,参数2:变量
parse_str($_SERVER['QUERY_STRING'],$params);
// print_r($params);
// 5. 调用控制器方法
$user = new $controller();
// 解构变量
echo $user->$action(...array_values($params));
总结
- 服务容器:通过把模型类实例和试图类实例放在服务容器中减少对外部对象的依赖。
- facade:静态化服务容器中的方法,使客户端代码更加简洁
- 路由原理:将URL中的控制器,方法解析出来,映射到对应的控制器类和方法上