在Laravel 5.2中的控制器内使用服务提供者

wir*_*hin 2 php controller service-provider laravel-5.2

至于标题,我花了大约两个小时的时间来寻找有效的答案,并反复阅读了官方文档,但考虑到我对框架相对较新,则没有任何进一步的改进。在寻找一种在控制器之间共享一些代码的正确方法时,我产生了疑问,我偶然发现了服务提供商,因此:

  1. 我创建了一个MyCustomServiceProvider;
  2. 我已将其添加到文件中的providersaliases数组中app.php
  3. 最后,我创建了一个自定义帮助程序类,并将其注册为:

    class MyCustomServiceProvider extends ServiceProvider
    {
        public function boot()
        {
            //
        }
    
        public function register()
        {
            $this->app->bind('App\Helpers\Commander', function(){
    
                return new Commander();
    
            });
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

但是到目前为止,如果我在控制器中使用该自定义类,则必须通过以下use语句向其添加路径:

use App\Helpers\Commander;
Run Code Online (Sandbox Code Playgroud)

否则,我得到一个很好的类,未发现异常,显然我的控制器没有执行他的工作。
我怀疑在服务提供商中有些事情对我不利!:-)

tka*_*usl 6

但是,到目前为止,如果我在控制器中使用该自定义类,则必须通过use语句为其添加路径:

`use App\Helpers\Commander;`
Run Code Online (Sandbox Code Playgroud)

否则,我得到一个很好的类,未发现异常,显然我的控制器没有执行他的工作。

是的,就是这样。如果您不想使用全名,则可以使用一个全名Facade

像这样创建Facade类:

class Commander extends Facade
{
    protected static function getFacadeAccessor() { return 'commander'; }
}
Run Code Online (Sandbox Code Playgroud)

注册服务:

$this->app->singleton('commander', function ($app) {
    return new Commander();
});
Run Code Online (Sandbox Code Playgroud)

将别名添加到您的config/app.php

'aliases' => [
    //...
    'Commander' => Path\To\Facades\Commander::class,
    //...
],
Run Code Online (Sandbox Code Playgroud)

并像这样使用它Facade

\Commander::doStuff();
Run Code Online (Sandbox Code Playgroud)

关于为什么即使删除绑定也仍然可以使用代码的原因:

当您向函数键入参数提示时,Laravel不知道想要的类型(通过绑定),Laravel会尽力为您创建该类。因此,即使您没有绑定该类,Laravel也会为您愉快地创建该类的实例。您真正需要绑定的地方是使用接口时。通常,您不是类型提示特定的类,而是接口。但是Laravel 无法创建接口的实例并将其传递给您,因此Laravel需要知道它如何构造一个实现所需接口的类。在这种情况下,您可以将类(或创建类的闭包)绑定到接口。