[TOC]
# 啟動Laravel基礎服務
我們不妨再詳細一點:
第一步注冊加載composer自動生成的class loader就是加載初始化第三方依賴,不屬于Laravel核心,到此為止。
第二步生成容器Container,并向容器注冊核心組件,這里牽涉到了容器Container和合同Contracts,這是Laravel的重點,下面將詳細講解。
重點是第三步處理請求,生成并發送響應。
首先Laravel框架捕獲到用戶發到public\index.php的請求,生成Illuminate\Http\Request實例,傳遞給這個小小的handle方法。在方法內部,將該$request實例綁定到第二步生成的$app容器上。然后在該請求真正處理之前,調用bootstrap方法,進行必要的加載和注冊,如檢測環境,加載配置,注冊Facades(假象),注冊服務提供者,啟動服務提供者等等。這是一個啟動數組,具體在Illuminate\Foundation\Http\Kernel中,包括:
~~~
protected $bootstrappers = [
'Illuminate\Foundation\Bootstrap\DetectEnvironment',
'Illuminate\Foundation\Bootstrap\LoadConfiguration',
'Illuminate\Foundation\Bootstrap\ConfigureLogging',
'Illuminate\Foundation\Bootstrap\HandleExceptions',
'Illuminate\Foundation\Bootstrap\RegisterFacades',
'Illuminate\Foundation\Bootstrap\RegisterProviders',
'Illuminate\Foundation\Bootstrap\BootProviders',
];
~~~
看類名知意,Laravel是按順序遍歷執行注冊這些基礎服務的,注意順序:Facades先于ServiceProviders,Facades也是重點,后面說,這里簡單提一下,注冊Facades就是注冊config\app.php中的aliases 數組,你使用的很多類,如Auth,Cache,DB等等都是Facades;而ServiceProviders的register方法永遠先于boot方法執行,以免產生boot方法依賴某個實例而該實例還未注冊的現象。
所以,你可以在ServiceProviders的register方法中使用任何Facades,在ServiceProviders的boot方法中使用任何register方法中注冊的實例或者Facades,這樣絕不會產生依賴某個類而未注冊的現象
# 將請求傳遞給路由
注意到目前為止,Laravel 還沒有執行到你所寫的主要代碼(ServiceProviders中的除外),因為還沒有將請求傳遞給路由。
在Laravel基礎的服務啟動之后,就要把請求傳遞給路由了。傳遞給路由是通過Pipeline(另開篇章講解)來傳遞的,但是Pipeline有一堵墻,在傳遞給路由之前所有請求都要經過,這堵墻定義在app\Http\Kernel.php中的$middleware數組中,沒錯就是中間件,默認只有一個CheckForMaintenanceMode中間件,用來檢測你的網站是否暫時關閉。這是一個全局中間件,所有請求都要經過,你也可以添加自己的全局中間件。
然后遍歷所有注冊的路由,找到最先符合的第一個路由,經過它的路由中間件,進入到控制器或者閉包函數,執行你的具體邏輯代碼。
所以,在請求到達你寫的代碼之前,Laravel已經做了大量工作,請求也經過了千難萬險,那些不符合或者惡意的的請求已被Laravel隔離在外

# 服務容器
服務容器就是一個普通的容器,用來裝類的實例,然后在需要的時候再取出來。用更專業的術語來說是服務容器實現了控制反轉(Inversion of Control,縮寫為IoC),意思是正常情況下類A需要一個類B的時候,我們需要自己去new類B,意味著我們必須知道類B的更多細節,比如構造函數,隨著項目的復雜性增大,這種依賴是毀滅性的。控制反轉的意思就是,將類A主動獲取類B的過程顛倒過來變成被動,類A只需要聲明它需要什么,然后由容器提供。
這樣做的好處是,類A不依賴于類B的實現,這樣在一定程度上解決了耦合問題。
在Laravel的服務容器中,為了實現控制反轉,可以有以下兩種:
依賴注入(Dependency Injection)。
綁定。
- 配置
- composer安裝
- composer用法
- composer版本約束表達
- phpstorm
- sftp文件同步
- php類型約束
- laradock
- 配置文件緩存詳解
- git
- 自定義函數
- 核心概念
- IOC
- 服務提供者
- Facade
- 契約
- 生命周期
- 路由
- 請求
- 命名路由
- 路由分組
- 資源路由
- 控制器路由
- 響應宏
- 響應
- Command
- 創建命令
- 定時任務
- console路由
- 執行用戶自定義的定時任務
- artisan命令
- 中間件
- 創建中間件
- 使用中間件
- 前置和后置
- 詳細介紹
- 訪問次數限制
- 為 VerifyCsrfToken 添加過濾條件
- 單點登錄
- 事件
- 創建
- ORM
- 簡介
- DB類
- 配置
- CURD
- queryScope和setAttribute
- 查看sql執行過程
- 關聯關系
- 一對一
- 一對多
- 多對多
- 遠程關聯
- 多態一對多
- 多態多對多
- 關聯數據庫的調用
- withDefault
- 跨模型更新時間戳
- withCount,withSum ,withAvg, withMax,withMin
- SQL常見操作
- 模型事件
- 模型事件詳解
- 模型事件與 Observer
- deleted 事件未被觸發
- model validation
- ORM/代碼片段
- Repository模式
- 多重where語句
- 中間表類型轉換
- Collection集合
- 新增的一些方法
- 常見用法
- 求和例子
- 機場登機例子
- 計算github活躍度
- 轉化評論格式
- 計算營業額
- 創建lookup數組
- 重新組織出表和字段關系并且字段排序
- 重構循環
- 其他例子
- 其他問題一
- 去重
- 第二個數組按第一個數組的鍵值排序
- 搜索ES
- 安裝
- 表單
- Request
- sessiom
- Response
- Input
- 表單驗證
- 簡介
- Validator
- Request類
- 接口中的表單驗證
- Lumen 中自定義表單驗證返回消息
- redis
- 廣播事件
- 發布訂閱
- 隊列
- 守護進程
- redis隊列的坑
- beanstalkd
- rabbitmq
- redis隊列
- 日志模塊
- 錯誤
- 日志詳解
- 數據填充與遷移
- 生成數據
- 數據填充seed
- migrate
- 常見錯誤
- Blade模板
- 流程控制
- 子視圖
- URL
- 代碼片段
- Carbon時間類
- 一些用法
- 郵件
- 分頁
- 加密解密
- 緩存
- 文件上傳
- 優化
- 隨記
- 嵌套評論
- 判斷字符串是否是合法的 json 字符串
- 單元測試
- 計算出兩個日期的diff
- 自定義一個類文件讓composer加載
- 時間加減
- 對象數組互轉方法
- 用戶停留過久自動退出登錄
- optional 輔助方法
- 文件下載
- Api
- Dingo api
- auth.basic
- api_token
- Jwt-Auth
- passport
- Auth
- Authentication 和 Authorization
- Auth Facade
- 授權策略
- Gates
- composer包
- debug包
- idehelp包
- image處理
- 驗證碼
- jq插件
- 第三方登錄
- 第三方支付
- log顯示包
- 微信包
- xss過濾
- Excel包
- MongoDB
- php操作
- 聚合查詢
- 發送帶附件郵件
- 中文轉拼音包
- clockwork網頁調試
- emoji表情
- symfony組件
- swooletw/laravel-swoole
- 常見問題
- 跨域問題
- Laravel隊列優先級的一個坑
- cache:clear清除緩存問題
- .env無法讀取
- 源碼相關基礎知識
- __set和__get
- 依賴注入、控制反轉和依賴倒置原則
- 控制反轉容器(Ioc Container)
- 深入服務容器
- call_user_func
- compact
- 中間件簡易實現
- array_reduce
- 中間件實現代碼
- Pipeline管道操作
- composer自動加載
- redis延時隊列
- 了解laravel redis隊列
- cli
- 源碼解讀
- Facade分析
- Facade源碼分析
- IOC服務容器
- 中間件原理
- 依賴注入淺析
- 微信
- 微信公眾號
- 常用接收消息
- 6大接收接口
- 常用被動回復消息
- 接口調用憑證
- 自定義菜單
- 新增素材
- 客服消息
- 二維碼
- 微信語音
- LBS定位
- 網頁授權
- JSSDK
- easywechat
- 小程序
- 小程序配置app.json