理解Laravel IOC容器

理解Laravel IOC容器 IOC容器是Laravel框架一个非常重要的概念 依赖注入 理解IOC容器首先要从依赖注入开始。依赖注入和控制反转是差不多因果关系,通过使用依赖注入这种手段实现功能模块对其依赖组件的控制反转。 拿一个使用OAuth登录应用场景举例: interface Login { public function login(); } //微信账号登录 class WechatLogin implements Login { public function __construct(){} public function login() {} } //新浪微博登录 class WeiboLogin implements Login { public function __construct(){} public function login() {} } //QQ登录 class QQLogin implements Login { public function __construct(){} public function login() {} } //站点登录 class SiteLogin { protected $oauthClient; public function setOauthClient($oauthClient) { $this->oauthClient = $oauthClient } public function appLogin() { $this->oauthClient->login(); } } 一般可以使用两种方法实现注入...

November 25, 2017 · 2 min

PHP反射机制

PHP反射机制 介绍 reflection is the ability of a computer program to examine, introspect, and modify its own structure and behavior at runtime — wikipedia 反射的关键点就是在运行时分析类或者对象的状态,导出或提取出关于类,方法,属性,参数等信息。 代码例子 Reflection/Profile.php namespace codetest\Reflection; /** * Class Profile * * @package codetest\Reflection */ class Profile { public function getUserName() { return 'Foo'; } } $reflectionClass = new ReflectionClass('codetest\Reflection\Profile'); //当然也可以 $reflectionClass = new ReflectionClass(codetest\Reflection\Profile::class); var_dump($reflectionClass->getName()); // output: codetest\Reflection\Profile var_dump($reflectionClass->getDocComment()); // output: /** // * Class Profile // * // * @package codetest\Reflection // */ 应用场景 PHP的反射API,一般用到ReflectionClass和ReflectionMethod,...

November 21, 2017 · 2 min

Composer Autoload 配置说明

Composer Autoload 配置说明 谈到现代PHP,肯定离不开Composer。对于库的自动加载信息,Composer 生成了一个 vendor/autoload.php 文件。你可以简单的引入这个文件,你会得到一个免费的自动加载支持。(注意⚠️:php5.3之后才有namespace) require 'vendor/autoload.php'; namespace的应用大大的给开发提供的便利。autoload 是composer.json中的一个配置参数。autoload利用命名空间进行对应规则或标准的路径映射,从而找到最终的类文件。 四种Autoload模式 1. PSR-0 在 psr-0 key 下你定义了一个命名空间到实际路径的映射(相对于包的根目录)。注意,这里同样支持 PEAR-style 方式的约定(与命名空间不同,PEAR 类库在类名上采用了下划线分隔)。 请注意,命名空间的申明应该以 \\ 结束,以确保 autoloader 能够准确响应。 在 install/update 过程中,PSR-0 引用都将被结合为一个单一的键值对数组,存储至 vendor/composer/autoload_namespaces.php 文件中。 { "autoload": { "psr-0": { "Monolog\\": "src/", "Vendor\\Namespace\\": "src/", "Vendor_Namespace_": "src/" } } } ⚠️下划线 _ 对 psr-0 是有特殊意义的。psr-0 的加载器会将类名中的 _ 解析成目录分隔符。 即 Foo_Bar_Test 类会去加载 Foo/Bar/Test.php 文件。 2. PSR-4 将实际路径定义为命名空间。 { "autoload": { "psr-4": { "Monolog\\": "src/", "Vendor\\Namespace\\": "" } } } 3....

November 18, 2017 · 1 min

Laravel 生命周期

Laravel 生命周期 生命周期概述 入口 publuc/index.php是一个Laravel应用程序的入口,是整个框架的起点。index.php代码不多,主要的阶段就是: 加载Composer项目依赖 创建一个app实例容器 接收并且处理http请求 生命周期详解 加载项目依赖 Laravel使用Composer进行包的管理,所有组件的加载工作,仅需要一行代码 require __DIR__.'/../vendor/autoload.php'; 创建App实例 接下来便是创建应用实例(Illuminate\Foundation\Application),也叫服务容器 $app = require_once __DIR__.'/../bootstrap/app.php'; 整个初始化的过程包括:注册项目基础的ServiceProvider,注册SerciveProvider的Alias,注册目录路径等。 bootstrap/app.php中也完成了内核绑定。 Laravel会依据http请求的运行环境不同,将请求发送至相应的内核HTTP内核 或 Console内核。无论哪个内核,它们作用都是处理http请求。 最终,HTTP内核用handlemethod,单纯的接收一个Request以及返回一个Response。 HTTP内核 HTTP内核继承了Illuminate\Foundation\Http\Kernal类,它定义了在执行请求之前运行的 bootstrappers 数组。包含完成环境检测,配置加载,异常处理,Facades注册,ServiceProvider注册,启动服务这6个引导程序。 HTTP内核定义了所有被请求应用程序处理之前必须经过的HTTP中间件列表。 这些中间件可以处理 HTTP session 的读写, 可以判断服务器当前是否处于维护模式, 验证 CSRF token ( 为了保护服务器不受 CSRF 攻击 ) 等等功能. ServiceProvider 最重要的引导操作之一就是加载应用程序的ServiceProvider。应用程序的所有ServiceProvider都在config/app.php配置文件的providers数组中配置。所有的provider都会调用register方法,由boot方法负责调用所有的被注册provider。 ServiceProvider负责引导所有框架的各种组件,如数据库、队列、验证和路由组件。也就是说,框架提供的每个功能都它们来引导并配置。因此也可以说,ServiceProvider是整个 Laravel 引导过程中最重要的方面。 接收并处理请求 处理请求包含两个阶段: 创建请求实例 处理请求 创建请求实例 请求实例`Illuminate\Http\Request`的`capture() `方法,内部通过Symfony实例创建一个Laravel请求实例 /** * Create a new Illuminate HTTP request from server variables....

November 8, 2017 · 2 min