laravel框架中容器类简化代码-摘自某书

  1 <?php
  2
  3 //容器类装实例或提供实例的回调函数
  4 class Container {
  5
  6     protected $bindings = [];
  7
  8     //绑定接口和生成相应实例的回调函数
  9     public function bind($abstract, $concrete=null, $shared=false) {
 10
 11         //如果提供的参数不是回调函数,则产生默认的回调函数
 12         if(!$concrete instanceof Closure) {
 13             $concrete = $this->getClosure($abstract, $concrete);
 14         }
 15
 16         $this->bindings[$abstract] = compact(‘concrete‘, ‘shared‘);
 17     }
 18
 19     //默认生成实例的回调函数
 20     protected function getClosure($abstract, $concrete) {
 21
 22         return function($c) use ($abstract, $concrete) {
 23             $method = ($abstract == $concrete) ? ‘build‘ : ‘make‘;
 24             return $c->$method($concrete);
 25         };
 26
 27     }
 28
 29     public function make($abstract) {
 30         $concrete = $this->getConcrete($abstract);
 31
 32         if($this->isBuildable($concrete, $abstract)) {
 33             $object = $this->build($concrete);
 34         } else {
 35             $object = $this->make($concrete);
 36         }
 37
 38         return $object;
 39     }
 40
 41     protected function isBuildable($concrete, $abstract) {
 42         return $concrete === $abstract || $concrete instanceof Closure;
 43     }
 44
 45     //获取绑定的回调函数
 46     protected function getConcrete($abstract) {
 47         if(!isset($this->bindings[$abstract])) {
 48             return $abstract;
 49         }
 50
 51         return $this->bindings[$abstract][‘concrete‘];
 52     }
 53
 54     //实例化对象
 55     public function build($concrete) {
 56
 57         if($concrete instanceof Closure) {
 58             return $concrete($this);
 59         }
 60
 61         $reflector = new ReflectionClass($concrete);
 62         if(!$reflector->isInstantiable()) {
 63             echo $message = "Target [$concrete] is not instantiable";
 64         }
 65
 66         $constructor = $reflector->getConstructor();
 67         if(is_null($constructor)) {
 68             return new $concrete;
 69         }
 70
 71         $dependencies = $constructor->getParameters();
 72         $instances = $this->getDependencies($dependencies);
 73
 74         return $reflector->newInstanceArgs($instances);
 75     }
 76
 77     //解决通过反射机制实例化对象时的依赖
 78     protected function getDependencies($parameters) {
 79         $dependencies = [];
 80         foreach($parameters as $parameter) {
 81             $dependency = $parameter->getClass();
 82             if(is_null($dependency)) {
 83                 $dependencies[] = NULL;
 84             } else {
 85                 $dependencies[] = $this->resolveClass($parameter);
 86             }
 87         }
 88
 89         return (array)$dependencies;
 90     }
 91
 92     protected function resolveClass(ReflectionParameter $parameter) {
 93         return $this->make($parameter->getClass()->name);
 94     }
 95
 96 }
 97
 98
 99 class Traveller {
100
101     protected $trafficTool;
102
103     public function __construct(Visit $trafficTool) {
104         $this->trafficTool = $trafficTool;
105     }
106
107     public function visitTibet() {
108         $this->trafficTool->go();
109     }
110
111 }
112
113 interface Visit {
114     public function go();
115 }
116
117 class Train implements Visit {
118
119     public function go() {
120         echo "go to Tibet by train !!!";
121     }
122
123 }
124
125 $app = new Container();
126 $app->bind("Visit", "Train");
127 $app->bind("traveller", "Traveller");
128
129
130 $tra = $app->make("traveller");
131 $tra->visitTibet();
时间: 2024-10-03 14:02:04

laravel框架中容器类简化代码-摘自某书的相关文章

easywechat在laravel框架中的应用-代码参考

<?php namespace App\Http\Controllers; class WeChatController extends Controller{ //用户列表 public function userList() { $app = app('wechat.official_account.default'); return $app->user->list(); } //获取菜单 public function getMenu(){ $app = app('wechat.

三大框架中模糊查询代码

js获取查询条件,并去后台查询 function queryByName(){                    //获取查询条件的用户名                    var queryName=$("#queryName").val();                    alert(queryName);                    //进行后台跳转                    window.location.href="<%=

Laravel框架中的make方法详解

为什么网上已经有这么多的介绍Laravel的执行流程了,Laravel的容器详解了,Laravel的特性了,Laravel的启动过程了之类的文章,我还要来再分享呢? 因为,每个人的思维方式和方向是不一样的,所以就会出现这样的一个场景,当你遇到一个问题在网上寻求答案的时候,有很多文章都解释了你的这个问题,但是你只对其中一篇感兴趣,那是因为作者的思维方式和你的很接近而作者的文笔也可能是你喜欢的那种类型.正因如此,我也来分享一些我在研究Laravel框架时的一些观点和看法,希望给那些和我有类似思维方式

laravel框架中的任务调度corn

我们可以在服务器上通过 crontab -e 来新增或编辑 Cron 条目,通过 crontab -l 查看已存在的 Cron 条目.更多关于 Cron 的原理和使用细节请自行百度或 Google. Laravel 命令调度器允许你流式而又不失优雅地在 Laravel 中定义命令调度,并且服务器上只需要一个 Cron 条目即可.任务调度定义在 app/Console/Kernel.php 文件的 schedule 方法中,该方法中已经包含了一个示例. 开启调度器 * * * * * php /p

laravel框架中的session问题

这两天一直在鼓捣服务器,配置环境,在搭建laravel的过程之中,发现了laravel中的session的一些问题,这里总结一下: (1):我在服务器上搭建了多个sever,为了测试学习,分别使用不同的php框架,laravel,tp,原生,一开始发现session跨域的问题,就修改了php.ini中的session_cookie_domain参数, 设置为session_cookie_domain= .xxxx.top (注:php.ini中的cookie.path默认为 /,所以不需要进行修

Laravel框架中使用邮件发送功能

这里是演示的用户注册之后,进行邮件激活的功能. 点击注册之后,系统会自动发送一个份邮件到注册者的邮箱,注册者点击链接激活账号. 先配置laravel中的(.env)文件 MAIL_DRIVER=smtp//驱动 MAIL_HOST=smtp.sina.com//邮件服务器地址 MAIL_PORT=25//端口 MAIL_USERNAME=183****[email protected]//你的邮箱 MAIL_PASSWORD=**********hai//你的邮箱密码 MAIL_ENCRYPTI

Laravel框架中的event事件操作

有时候当我们单纯的看 Laravel 手册的时候会有一些疑惑,比如说系统服务下的授权和事件,这些功能服务的应用场景是什么,其实如果没有经历过一定的开发经验有这些疑惑是很正常的事情,但是当我们在工作中多加思考会发现有时候这些服务其实我们一直都见过.下面就事件.事件监听举一个很简单的例子你就会发现. ? 这个例子是关于文章的浏览数的实现,当用户查看文章的时候文章的浏览数会增加1,用户查看文章就是一个事件,有了事件,就需要一个事件监听器,对监听的事件发生后执行相应的操作(文章浏览数加1),其实这种监听

在laravel框架中使用模板继承来进行更方便的布局

html中有很多东西是重复的,这是需要用到laravel的模板继承,来完成这样的简化操作. 父模板 既然时模板继承,那么就首先有一个父模板,父模板类似网页html中的头部和尾部,但又有一些不一样. // parent.blade.php <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="

laravel框架中Email邮件配置

1.在composer.json加入下面一行代码"guzzlehttp/guzzle": "~4.0"2.发送邮件的RouteRoute::get('/mail',['as'=>'emails.index','uses'=>'[email protected]']);3.项目/app/mail.php<?phpreturn array(    'driver' => 'smtp',    'host' => 'smtp.163.com'