ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
### 应用容器 控制反转(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(); ~~~