[TOC]
## 問題
* `php artisan migrate` 報錯問題
```
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long;
max key length is 767 bytes (SQL: alter table `users` add unique `users_email_unique`(`email`))
```
> * 跟數據庫編碼問題有關, `laravel 5.4`開始采用的是 `utf8mb4`編碼
> * ?解決辦法: 修改`/app/providers/AppServiceProvider.php`文件
> * `use Illuminate\Support\Facades\Schema;`
> * `Schema::defaultStringLength(191);` 添加至:`boot` 方法
## 服務容器問題
### 1.服務是什么?
>* 服務是提供了一些功能的類,比如發送郵件,寫日志.
### 2.Laravel服務提供者是什么?
>* 服務提供者中指明了這個提供者可以提供哪些服務(注冊服務),以及服務注冊后默認調用一些方法(`boot`).
### 3.能否不用服務提供者,直接調用服務?
>* 可以,依靠Laravel的依賴注入,你可以方便的調用任何一個服務,而不用服務提供者。
### 4.既然3成立,那么服務提供者有什么存在的必要?
>* 1. 利用服務提供者的`boot`方法,可以做一些全局性的設置,如在`boot`中對`view`的`composer`
>* 2. 服務提供者利用`bind`或`singleton`可以實現一個接口到實現類綁定,調用該服務對應的接口,會返回了一個具體的實現類。
>* 3. 這不是更復雜了么? 是的,是有點復雜,但好處是松耦合,更加靈活,調整服務也變的更加簡單。
### 5.服務容器是什么?
> * 服務容器是一個用于管理類依賴和執行依賴注入的強大工具。
> * 簡而言之就是,你將功能類(服務)作為參數傳遞到一個容器類中,以后直接調用容器類就可以。
> * 服務提供者的綁定就是向Laravel核心容器類,傳遞了一個服務類來做參數,核心容器類內部實現了綁定該服務作為容器類的一個屬性。
### 6.服務提供者在應用啟動時,就會注冊相應的服務,這會不會顯得沒有必要?因為有些情況下,不是應用開始就需要這個服務的.
> * 是的,所以你可以在服務提供者中延遲加載,只有在你需要的時候才加載這個服務。
> * 設置服務提供者的`defer`屬性和`provides`方法。
### 7.服務提供者功能之一是實現了一個接口到實現類的綁定,能否根據具體情況,比如A控制器中調用服務接口實現接口的A實現類,B控制器中調用接口的B實現類?
> * 可以,在服務提供者中綁定的時候實現依據上下文環境綁定。
> ```
> $this->app->when('App\\Handlers\\Commands\\CreateOrderHandler')
> ->needs('App\\Contracts\\EventPusher')
> ->give('App\\Services\\PubNubEventPusher');
> ```
### 8.有沒有一個服務提供者聚合多個服務的結果,對外使用一個統一的名稱來訪問?
> * 可以,使用服務提供者的標簽
### 9.能從服務容器中解析出一個對象嗎?
> * 可以.
> * 1. 使用`$this->app->make('xxx')`或`$this->app\['xxx'\]`,在控制器中使用幫助函數`app()->make('XXX')`
> * 2. 可以簡單的通過在類的構造函數中對依賴進行類型提示來從容器中解析對象,包括控制器、事件監聽器、隊列任務、中間件等都是通過這種方式
> ```
> public function __construct(UserRepository $users)
>{
> $this->users = $users;
>}
> ```
### 10.能否在從容器中解析對象的時候觸發一個事件?
> * 可以,在服務提供者中使用`$this->app->resolving`
### 11.門面和契約是什么?
> * 1. Laravel 的契約是指框架提供的一系列定義核心服務的接口,
> > * 比如, `Illuminate\\Contracts\\Queue\\Queue` 契約定義了隊列任務需要的方法,
> > * `Illuminate\\Contracts\\Mail\\Mailer` 契約定義了發送郵件所需要的方法。每一個契約都有框架提供的相應實現。
> > * 比如,Laravel 提供了多個驅動的隊列實現,郵件實現則由 SwiftMailer驅動。所有的 Laravel 契約都有其 GitHub 庫,這為所有有效的契約提供了快速入門指南,同時也可以作為獨立、解耦的包被包開發者使用。
> * 2. Laravel 的門面為 Laravel 服務的使用提供了一個簡便的方式——不再需要從服務容器中類型提示和解析契約.如`Auth::user()`,`Auth::check()` `Cache::get()`等
### 12.基本點
> * 服務提供者在項目根目錄下的Providers
> * 可以使用命令創建一個服務提供者
> * `php artisan make:provider TestProvider `
> * 每個服務提供者需要注冊在在`config/app.php`的`providers`數組中
- 簡介
- PHP
- 字符串函數
- 數組函數
- 正則
- 加密函數
- 面向對象
- 關鍵字
- 設計模式
- 魔術方法
- 機制擴展
- 會話機制
- PHP框架
- laravel
- 問題
- swoole
- easyswoole
- workerman
- 數據庫
- Sphinx
- MongoDB
- MemCache
- Redis
- 基礎操作
- 數據類型
- 持久化
- 分布式鎖
- 內存模型
- redis高級特性
- MySql
- 基礎操作
- 數據類型
- 數據表引擎
- 鎖機制
- 事務處理
- 存儲過程
- 觸發器
- 索引
- 關聯查詢
- 分析SQL語句-優化查詢
- 分區分表
- 主從復制
- MySql安全性
- 網絡協議
- HTTP
- header詳解
- 狀態碼
- nginx-配置
- 邏輯算法
- 時間和空間復雜度
- 常見算法
- 數據結構
- 核心
- 進程、線程、協程
- 存儲容量-計量單位
- 開發軟件及配置
- 版本控制器
- Git
- Fidder
- Fidder-Android7
- 自動化部署
- Jenkins
- supervisor
- Elasticsearch
- LogStash
- RabbitMQ
- AB測試
- JAVA-JDK
- FileBeat
- PhpStorm
- Composer
- Linux
- API安全
- 高并發及大流量相關概念
- 網站優化
- WEB
- Electron