博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Laravel服务容器
阅读量:6710 次
发布时间:2019-06-25

本文共 3290 字,大约阅读时间需要 10 分钟。

laravel框架底层解析

本文参考陈昊《Laravel框架关键技术解析》,搭建一个属于自己的简化版服务容器。

其中涉及到反射、自动加载,还是需要去了解一下。

laravel服务容器

  1. 建立项目空文件夹(如 mylaravel)

  2. 添加composer.json,执行composer install

{    "name": "laravel/laravel",    "description": "The Laravel Framework.",    "keywords": ["framework", "laravel"],    "license": "MIT",    "type": "project",    "autoload": {        "classmap": [        ],        "psr-4": {            "App\\": "app/"        }    }}

目的是为了学习、利用composer的自动加载。

  1. 文件路径如下所示

  • mylaravel

    • app

      • Traveller

        • Traveller.php

      • Visit

        • Leg.php

        • Visit.php

      • Container.php

      • Index.php

    • vendor

    • composer.json

  1. 简化版Container.php

getClosure($abstract, $concrete); } $this->bindings[$abstract] = compact('concrete', 'shared'); } //默认的回调函数 protected function getClosure($abstract, $concrete) { //生成实例的回调函数, $c一般为ioc容器对象 return function($c) use ($abstract, $concrete) { $method = ($abstract == $concrete) ? 'build' : 'make'; return $c->$method($concrete); }; } //生成实例对象,首先解决接口和要实例化类之间的依赖 public function make($abstract) { $concrete = $this->getConcrete($abstract); if ($this->isBuildable($concrete, $abstract)) { $object = $this->build($concrete); } else { $object = $this->make($concrete); } return $object; } protected function isBuildable($concrete, $abstract) { return $concrete === $abstract || $concrete instanceof \Closure; } //获取绑定的回调函数 protected function getConcrete($abstract) { if ( ! isset($this->bindings[$abstract])) { return $abstract; } return $this->bindings[$abstract]['concrete']; } //实例化对象 public function build($concrete) { if ($concrete instanceof \Closure) { return $concrete($this); } $reflector = new \ReflectionClass($concrete); if ( ! $reflector->isInstantiable()) { echo $message = "Target [$concrete] is not instantiable."; } $constructor = $reflector->getConstructor(); if (is_null($constructor)) { return new $concrete; } $dependencies = $constructor->getParameters(); $instances = $this->getDependencies($dependencies); return $reflector->newInstanceArgs($instances); } protected function getDependencies($parameters) { $dependencies = []; foreach ($parameters as $parameter) { $denpendency = $parameter->getClass(); if (is_null($denpendency)) { $dependencies[] = NULL; } else { $dependencies[] = $this->resolveClass($parameter); } } return (array) $dependencies; } protected function resolveClass(\ReflectionParameter $parameter) { return $this->make($parameter->getClass()->name); }}

Visit.php接口

Leg.php接口的一种实现

Traveller.php相当于Controller下的方法

trafficTool = $visit; } public function visitTibet() { $this->trafficTool->go(); }}

Index.php

bind('App\Visit\Visit', '\App\Visit\Leg'); $app->bind('Traveller', '\App\Traveller\Traveller'); //通过容器实现依赖注入,完成类的实例化 $tra = $app->make("\App\Traveller\Traveller"); $tra->visitTibet(); }}$b = new Index;$b->index();

转载地址:http://pralo.baihongyu.com/

你可能感兴趣的文章
监控linux系统cpu硬盘网络io等资源脚本
查看>>
如何解决Windows 7英文版操作系统显示简体中文程序乱码的问题
查看>>
当“大系统”遇上“小末梢”
查看>>
go 交换两个变量的值 忒带劲了
查看>>
China官方NTP server
查看>>
JVM调优总结
查看>>
Linux 6下yum方式安装配置LAMP平台
查看>>
OpenCASCADE Coordinate Transforms
查看>>
loadrunner安装
查看>>
pt-query-digest查询日志分析工具
查看>>
张明贵-Linux基础命令学习-5
查看>>
模拟Linux开机故障与解决方案
查看>>
三大范式和五大约束
查看>>
vmware DELL定制
查看>>
&nb
查看>>
lombok的builder设置默认值的问题
查看>>
lvs的nat模式
查看>>
Java 数组 之 一维数组 追加 元素
查看>>
Keil uVision4复杂运用教程
查看>>
OSPF 基本配置
查看>>