本文为joshua317原创文章,转载请注明:转载自joshua317博客 在Laravel项目中,如果你在本地安装了 PHP, 并且你想使用 PHP 内置的服务器来为你的应用程序提供服务,则可以使用...接下来我们来分析下laravel的命令:php artisan serve 2.1 源文件ServeCommand.php 注意:此次laravel项目是基于6.20.26版本 源文件是src/Illuminate...() 代码的 publicPath() 来的,这个方法的源码位于 Illuminate\Foundation\Application 中 function public_path($path = '')...php namespace Illuminate\Foundation; use Closure; use Illuminate\Container\Container; use Illuminate...\Contracts\Container\Container::class, \Illuminate\Contracts\Foundation\Application::class, \Psr\Container
)来动态创建类中未定义或不可见的静态方法。...出的name值是'PHP',访问未定义的age()方法并不报错。...3、当在类中定义魔术方法__isset()时,当对未定义或不可见属性调用isset()或empty()方法时,就会先触发__isset()魔术方法: class Person { private...Laravel中方法重载使用 在使用Laravel的Facade这种模式时,是通过Facade帮我们代理从容器Container中取出所需要的服务Service,就不需要通过$app['config']...*/ protected static function getFacadeAccessor() { return 'config'; } } 利用上面知识,当调用一个类中未定义或不可见的静态方法时
,将对数据表的 SQL 执行转化为对模型类的方法调用。...Eloquent 提供的模型事件功能,还可以下载 Laravel 提供的独立事件扩展包: composer require illuminate/events 上述扩展包下载完成后,就可以在博客项目根目录下的...\Dispatcher; use Illuminate\Container\Container as IlluminateContainer; function initDatabase(Container...最后不要忘了在 bootApp 方法中调用这个方法: function bootApp(Container $container) { ......,这里为了避免重构视图层代码,直接在查询结果上调用 toArray 方法将其转化为数组格式。
前言 因为一些原因,我准备选用yaf框架作为我们的主力开发框架,但是我还想要将Laravel的数据库迁移功能给挪过来。所以就研究了一天相关功能。终于让我实现了。...php use Illuminate\Container\Container; use Illuminate\Support\Facades\Schema; use Illuminate\Database...的迁移文件是一样的。...php use Illuminate\Config\Repository; use Illuminate\Console\OutputStyle; use Illuminate\Container\Container...总结 通过此次的重现,我对于Laravel的容器理解更加深刻了。对于Laravel的所有都注入到容器中的想法表示敬佩。 同时对于提取了这一套迁移方法表示可以同样用在基础框架中,非常实用。
先关注Illuminate\Foundation\Application类的定义Illuminate\Foundation\Application继承了Illuminate\Container\Container...,作为依赖注入容器需要的功能基本都在Container里,其余实现的接口我们在后面用到时再讨论来到Illuminate\Foundation\Application的构造方法从这里开始我们把构造方法里的每一个调用拆分开解读...'path.xxx'此时方法调用来到了Illuminate/Container/Container,由此方法注释可知这方法是Laravel的IOC容器对外开放的注册实例的入口(之一)。...Illuminate\Container\Container的实例注册Illuminate\Foundation\Mix单例到容器注册Illuminate\Foundation\PackageManifest...一个对应Provider实例 接着是调用Provider的register()方法,后续我们会分别来看这三个Provider的register()方法687~697行为Provider提供了方便的依赖注入方式
所以,我们仅需要将目光集中到 RouteServiceProvider 的 boot 方法中就可以了,其实在它方法体中只是去调用父类的 boot 方法完成服务启动处理。...*/ protected function loadRoutes() { // 加载应用的路由通过执行服务容器的 call 方法调用相关加载类 // 这里既是调用子类...没错它是通过实现 __call 魔术方法动态的执行反射功能,完成调用 middleware 方法,并返回 RouteRegistrar 实例。 的方法调用。...简短截说,最终在 RouteRegistrar::group 方法内部完成对 Illuminate\Routing\Router::group 方法的调用,实现载入路由文件处理。
/container/Container.php(794): ReflectionClass->newInstanceArgs(Array) #7 /home/web/vendor/illuminate...', Array) #8 /home/web/vendor/laravel/lumen-framework/src/Application.php(211): IlluminateContainerContainer...', Array) #9 /home/web/vendor/illuminate/container/Container.php(231): LaravelLumenApplication->make(...', Array) #10 /home/web/vendor/illuminate/container/Container.php(746): IlluminateContainerContainer-...653行对应的方法 /** * Register the aliases for the application
好了现在我们来看看 Facade::__callStatic 是如何获取实际的服务并调用响应的方法的吧。...首先,通过 getFacadeRoot 静态方法获取实际服务的实例对象; 然后,调用实例对象的相关方法并返回处理结果。 调用实现「外观」的 getFacadeAccessor 方法获取到组件(服务或者说接口)的名称;然后从 Laravel 服务容器 static::$app[$name](app 是在 RegisterFacades...这是因为我们的服务容器 Illuminate\Container\Container 实现了 ArrayAccess 接口。.../** *@link https://github.com/laravel/framework/blob/5.6/src/Illuminate/Container/Container.php */
一、Laravel ORM 概要 Illuminate database(Laravel ORM) 组件 在 GitHub 的地址 1.1 Laravel ORM 简介 Illuminate database...使用方法也很简单: use Illuminate\Database\Capsule\Manager as Capsule; $capsule = new Capsule; $capsule->addConnection...(optional) use Illuminate\Events\Dispatcher; use Illuminate\Container\Container; $capsule->setEventDispatcher...单复数转换器组件 |---- illuminate Laravel ORM 系统 |---- container Laravel 容器组件 |-...二、 Laravel ORM 核心组件目录结构 前面我们大致了解了 Laravel ORM 系统整体的目录结构,本节我们重点走进 illuminate/database 文件夹,即 Laravel ORM
说明:本文主要以Laravel的容器类Container为例做简单说明Composer的自动加载机制。...这次先一起聊聊Composer的自动加载机制,并以Laravel的Container为例举例。...Composer的自动加载机制 1、初始化一个composer项目 在一个空目录下composer安装Laravel的容器Container包: composer require illuminate...从上图中能看出这个composer初始化路径的流程,重点是ClassLoader这个类的loadClass(class)这个方法,是通过spl_autoload_register这个PHP自动加载函数来注册到...从第二个序列图就可看出,首先调用ClassLoader中的loadClass()这个函数来找文件路径,传入的class变量值是“IlluminateContainerContainer”这个字符串,然后又继续调用
目录结构 序章 依赖注入基本概念 什么是依赖注入 什么是依赖注入容器 什么是控制反转(IoC) Laravel 服务容器是什么 小结 Laravel 服务容器的使用方法 管理待创建类的依赖 常用绑定方法...接下来才是今天的正餐,我将从以下几个角度讲解 Laravel 服务容器的相关内容: Laravel 服务容器是什么; Laravel 服务容器的使用方法; Laravel 服务容器技术原理。...我们知道绑定方法定义在 Laravel 服务容器 Illuminate\Foundation\Application 类内,而 Application继承自 Illuminate\Container\Container...这些与服务容器绑定相关的方法便直接继承自 Container 类。 bind 方法执行原理 bind 绑定作为最基本的绑定方法,可以很好的说明 Laravel 是如何实现绑定服务处理的。...下面摘出 Container 容器中 bind 方法及其相关联的方法。
,依旧是Illuminate\Routing\Router 内有你所使用的所有路由相关方法,例如get、post、put、patch等等,他们都调用了统一的方法 addRoute public function...$domainAndUri] = $route; } 添加后的结果如下图所示 调用 通过 Illuminate\Routing\Router 方法开始运行路由实例化的逻辑 protected function...run方法 ); }); } 在 Illuminate\Routing\Route 下 run 方用于执行控制器的方法...,下面将通过url访问指定方法,一般控制器都会继承父类 Illuminate\Routing\Controller,laravel为其设置了别名 BaseController public function...通过controller继承的callAction去调用子类的指定方法,也就是我们希望调用的自定义方法。
在实例化内核时,构造函数内将在 HTTP 内核定义的「中间件组」注册到 路由器,注册完后就可以在实际处理 HTTP 请求前调用这些「中间件」实现 过滤 请求的目的。...// 启动 「引导程序」 $this->bootstrap(); ... } 上面的代码块说明在 $this->bootstrap(); 方法内部有实际调用...最终还是要看 Illuminate\Foundation\Application 的 bootstrapWith() 方法究竟如何来启动这些引导程序的。...); }); } 执行 $route->run() 的方法定义在 Illuminate\Routing\Route 类中,最终执行「在 routes...,会完成控制器实例化并执行指定方法;如果是一个匿名函数则直接调用这个匿名函数。
开发环境:Laravel5.3 + PHP7 + OS X10.11 Laravel的入口文件是public/index.php文件,首先第一步加载composer的autoload文件: // bootstrap...另一个重要的函数,如果这么调用call(EventServiceProvider@register),那就通过Container::callClass()来解析出class和method,然后在调用call...这里是通过[(new EventServiceProvider(app)), 'boot']类似这种方式来调用的。在调用boot()时有依赖怎么办?...上文说过,Application中register()会调用service provider中的register()方法,看下\Illuminate\Routing\RoutingServiceProvider...总结:本文主要学习了Application的实例化过程,主要学习了实例化过程中向这个IoC(Inversion of Control) Container绑定了哪些service,并讨论了绑定的三个方法
解析出Http Kernel后Laravel将进入应用的请求对象传递给Http Kernel的handle方法,在handle方法负责处理流入应用的请求对象并返回响应对象。...getSlice方法,他返回的也是一个闭包,在闭包会里解析出中间件对象、中间件参数(无则为空数组), 然后把$passable(请求对象), $stack和中间件参数作为中间件handle方法的参数进行调用...(), $firstSlice), $this->passable); 这样就能依次执行中间件handle方法,在handle方法里又会去再次调用之前说的reduce包装的洋葱闭包剩余的部分,这样一层层的把洋葱剥开直到最后...,所以只有反转后才能保证初始定义的中间件数组中第一个中间件的handle方法会被最先调用。...,依然是利用Pipeline对象来传送请求对象通过收集上来的这些中间件然后到达最终的目的地,在那里会执行目的路由的run方法,run方法里面会判断路由对应的是一个控制器方法还是闭包然后进行相应地调用,最后把执行结果包装成
前言 PHP的反射类与实例化对象作用相反,实例化是调用封装类中的方法、成员,而反射类则是拆封类中的所有方法、成员变量,并包括私有方法等。就如“解刨”一样,我们可以调用任何关键字修饰的方法、成员。...当然在正常业务中是建议不使用,比较反射类已经摒弃了封装的概念。 本章讲解反射类的使用及Laravel对反射的使用。..../') ); laravel开始加载它的核心类,所有的实现从 Illuminate\Foundation\Application 开始。...make方法的存在,它加载了服务提供者随后调用了父类的方法make,要知道作为独立的模块 “服务容器”是绝对不能写在核心类的。...Illuminate\Container\Container 以$api = $this->app->make('HelpSpot\API',['id'=>1]); 为例来讲解 // 真正的make方法
上一节老高零(瞎)散(扯)的讲了一下laravel的基本知识,不知道你现在搞清楚symfony vs laravel的关系了吗?...\Http\Request::capture() ); # 调用send方法,返回header和content $response->send(); # 完成收尾工作,其实最终调的是$app的terminate...直接继承了Container,并实现了ApplicationContract, HttpKernelInterface两个契约(接口) # 在初始化的时候,该类做了很多事情。...这个share值会影响make的时候的某一步逻辑,具体代码如下,针对singleton的实例化之后会被$app缓存起来,提高了性能,而通过bind方法绑定的类被实例化时每次返回的都是不同的对象。...laravel的启动过程中服务容器——laravel真正的核心一节。
Pipeline、中间件和路由的原理了,接下来就看看当请求最终找到了路由对应的控制器方法后Laravel是如何为控制器方法注入正确的参数并调用控制器方法的。...在拿到控制器和方法的名称字符串后,路由对象将自身、控制器和方法名传递给了 Illuminate\Routing\ControllerDispatcher类,由 ControllerDispatcher来完成最终的控制器方法的调用...下面我们详细看看 ControllerDispatcher是怎么来调用控制器方法的。...,而这里resolveClassMethodDependencies解决的是具体某个方法的参数依赖,它是Laravel对method dependency injection概念的实现。...解决完method的参数依赖后就该调用方法了,这个很简单, 如果控制器有callAction方法就会调用callAction方法,否则的话就直接调用方法。
在处理请求之前需要先初始化请求,这个通过Illuminate\Http\Request的静态方法capture()完成。...调用response的send()方法将缓冲区的响应数据发送出去。 最终调用kernel的terminate()方法进行程序的收尾工作,如上下文清理、统计上报等。...接下来就是build函数,这里使用到了反射(ReflectionClass),也是整个服务容器中最核心的部分: // Illuminate\Container\Container.php public...2.3 请求响应 程序调用kernel的handle()方法来处理上面部分中捕捉到的请求对象request,并生成相应的响应对象response。...最后调用原生的fastcgi_finish_request()函数或自定义的closeOutputBuffers()方法冲刷所有响应的数据给客户端并结束请求。
Laravel的核心是IocContainer, 文档中称其为“服务容器”,服务容器是一个用于管理类依赖和执行依赖注入的强大工具,Laravel中的功能模块比如 Route、Eloquent ORM、Request...本篇就来探讨一下Laravel中的服务绑定和解析是如何实现的 服务绑定 常用的绑定服务到容器的方法有instance, bind, singleton, alias。下面我们分别来看一下。...绑定接口和实现 $this->app->bind('Illuminate\Tests\Container\IContainerContractStub', 'Illuminate\Tests\Container...\Tests\Container\IContainerContractStub' => [//接口实现绑定 'concrete' => 'Illuminate\Tests\Container...bind方法的变种,绑定一个只需要解析一次的类或接口到容器,然后接下来对于容器的调用该服务将会返回同一个实例 alias 把服务和服务别名注册到容器: public function alias($abstract