### 應用容器
控制反轉(IoC)容器是用于管理類依賴性的工具。依賴注入是一種刪除硬編碼類依賴的方法。相反,依賴項是在運行時注入的,因為可以輕松交換依賴項實現,因此具有更大的靈活性。
#### 將類型綁定到容器
IoC容器可以通過兩種方式來解決依賴關系:通過閉包回調或自動解析。首先,我們將探討Closure回調。首先,可以將“類型”綁定到容器中:
~~~
App::bind('foo', function($app) {
return new FooBar;
});
~~~
#### 從容器解析類型
~~~
$value = App::make('foo');
~~~
`App::make`調用該方法時,將執行Closure回調并返回結果。
#### 將“共享”類型綁定到容器中
有時,您可能希望將某些內容綁定到容器中,而該內容只能被解析一次,并且在隨后對該容器的調用中應返回相同的實例:
~~~
App::singleton('foo', function() {
return new FooBar;
});
~~~
#### 將現有實例綁定到容器
您還可以使用以下`instance`方法將現有對象實例綁定到容器中:
~~~
$foo = new Foo;
App::instance('foo', $foo);
~~~
#### 將接口綁定到實現
在某些情況下,類可能取決于接口實現,而不是“具體類型”。在這種情況下,`App::bind`必須使用該方法來通知容器要注入的接口實現:
~~~
App::bind('UserRepositoryInterface', 'DbUserRepository');
~~~
現在考慮以下代碼:
~~~
$users = App::make('UserRepositoryInterface');
~~~
由于我們已將綁定`UserRepositoryInterface`到具體類型,因此`DbUserRepository`將在創建控制器時自動將注入。
### [](https://octobercms.com/docs/services/application#where-to-register)在哪里注冊綁定
IoC綁定(如[事件處理程序](https://octobercms.com/docs/services/events))通常屬于“引導程序代碼”類別。換句話說,它們使您的應用程序準備好實際處理請求,并且通常需要在實際調用路由或控制器之前執行該應用程序。最常見的地方是[插件注冊文件](https://octobercms.com/docs/plugin/registration#registration-methods)的`boot`方法。另外,插件可以在插件目錄中提供一個名為**init.php**的文件,您可以使用該文件放置IoC注冊邏輯。[](https://octobercms.com/docs/plugin/registration#registration-methods)
### [](https://octobercms.com/docs/services/application#service-providers)服務供應商
服務提供商是在單個位置創建庫并執行與組相關的IoC注冊的好方法。在服務提供商內部,您可以注冊自定義身份驗證驅動程序,向IoC容器注冊應用程序的存儲庫類,甚至設置自定義Artisan命令。
實際上,[插件注冊文件](https://octobercms.com/docs/plugin/registration)繼承了服務提供者,并且大多數核心組件都包括服務提供者。配置文件的`providers`陣列中列出了您的應用程序的所有已注冊服務提供商`config/app.php`。
#### 定義服務提供商
要創建服務提供者,只需擴展`October\Rain\Support\ServiceProvider`類并定義一個`register`方法:
~~~
use October\Rain\Support\ServiceProvider;
class FooServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->bind('foo', function() {
return new Foo;
});
}
}
~~~
請注意,在該`register`方法中,可以通過`$this->app`屬性使用應用程序IoC容器。創建了提供程序并準備將其注冊到您的應用程序后,只需將其添加到配置文件中的`providers`陣列中即可`app`。
#### 在運行時注冊服務提供商
您還可以在運行時使用以下`App::register`方法注冊服務提供商:
~~~
App::register('FooServiceProvider');
~~~
### [](https://octobercms.com/docs/services/application#application-events)應用事件
#### 請求事件
您可以使用`before`和`after`方法在路由請求之前注冊特殊事件:
~~~
App::before(function ($request) {
// Code to execute before the request is routed
});
App::after(function ($request) {
// Code to execute after the request is routed
});
~~~
#### 集裝箱事件
服務容器在每次解析對象時都會觸發一個事件。您可以使用以下`resolving`方法監聽此事件:
~~~
App::resolving(function ($object, $app) {
// Called when container resolves object of any type...
});
App::resolving('foo', function ($fooBar, $app) {
// Called when container resolves objects using hint "foo"...
});
App::resolving('Acme\Blog\Classes\FooBar', function ($fooBar, $app) {
// Called when container resolves objects of type "FooBar"...
});
~~~
如您所見,要解析的對象將傳遞給回調,使您可以在將對象提供給使用者之前設置該對象的所有其他屬性。
### [](https://octobercms.com/docs/services/application#application-helpers)應用助手
#### 查找應用程序環境
您可以使用該`environment`方法來發現由[環境配置](https://octobercms.com/docs/setup/configuration#environment-config)確定的應用程序環境。
~~~
// production
App::environment();
~~~
#### 確定執行上下文
使用該方法可以知道當前請求是否正在管理后端區域中執行`runningInBackend`。
~~~
App::runningInBackend();
~~~
您還可以使用該`runningInConsole`方法來檢查執行代碼是否在[命令行界面內進行](https://octobercms.com/docs/console/commands):
~~~
App::runningInConsole();
~~~
- 基本說明
- 基本操作
- October cms 安裝
- 后臺控制器路徑
- 圖標
- 獲取安裝網上的插件/主題
- 插件構造器使用
- 定時任務
- October后臺控制器
- vscode編輯器
- ajax操作
- 使用
- ajax更新組件
- ajax屬性API
- JavaScript API
- ajax綜合使用
- 主題
- 多語言主題
- 安裝市場主題
- 主題程序處理
- 主題
- 頁面
- 部件
- 布局
- 內容
- 組件
- 媒體
- 主題表單操作
- 表單使用
- 表單后端程序處理
- 插件
- 自定義插件
- 插件說明
- 插件導航條
- 插件數據庫設置
- 插件的設置管理
- 插件的配置文件config
- 組件
- app服務
- app容器
- 擴展行為
- 緩存
- Collection類
- Lazy Collections
- Collection方法
- 助手函數
- 數組助手函數
- 路徑助手函數
- 玄樂助手函數
- 其他助手函數
- 錯誤與記錄
- 事件處理
- HTML頁面
- 文件與目錄操作
- 散列和加密
- 郵件
- 郵件內容
- 郵件發送
- 分頁
- 模板解析器
- 動態解析器語法
- 隊列消息
- 請求與輸入
- 響應
- 視圖
- 路由器
- 配置
- 驗證操作
- 處理錯誤消息
- 錯誤消息與視圖
- 可用的驗證規則
- 有條件的驗證規則
- 驗證數組
- 錯誤消息
- 自定義驗證規則
- 模型操作
- 定義模型與其屬性
- 檢索模型
- 插入與更新
- 刪除模型
- 查詢范圍
- 事件操作
- 關聯操作
- 定義關系
- 關系類型
- 多肽關系
- 關系查詢
- 渴望加載
- 插入模型
- 數據庫操作
- 基本用法
- 數據表結構
- 查詢連貫操作
- 結果檢索
- select子句
- 插入更新
- where子句
- 排序,分組,限制和偏移
- 文件附件
- Collection操作
- 屬性操作
- 系列化json
- 數據庫屬性
- 數據庫行為
- 控制器
- 后臺控制器定義
- 后臺頁面
- 后臺組件
- 后臺表單
- 表單組件
- 表單視圖
- 表單行為
- 后臺列表
- 列表行為
- 列表過濾器
- 可用列類型
- 關系行為
- 關系行為類型
- 擴展關系行為
- 列表排序操作
- 導入導出操作
- 用于與權限
- corlate模板修改
- 修改頂部導航
- laravel問題
- 控制器不存在
- 控制器
- 路由組
- laravel筆記
- laravel 安裝
- 偽靜態配置
- 依賴注入 & 控制器
- 中間件
- 路由文件
- 視圖