Php Laravel 5.2中控制器内服务提供商的使用

Php Laravel 5.2中控制器内服务提供商的使用,php,controller,laravel-5.2,service-provider,Php,Controller,Laravel 5.2,Service Provider,关于这个标题,我花了大约两个小时寻找一个有效的答案,并反复阅读了官方文档,但考虑到我对这个框架还比较陌生,我没有进一步阅读。在寻找控制器之间共享某些代码的正确方法时产生了疑问,我在服务提供商中遇到了一些问题,因此: 我创建了一个sayMyCustomServiceProvider 我已经将它添加到app.php文件中的提供者和别名数组中 最后,我创建了一个自定义助手类,并将其注册为: class MyCustomServiceProvider extends ServiceProvider {

关于这个标题,我花了大约两个小时寻找一个有效的答案,并反复阅读了官方文档,但考虑到我对这个框架还比较陌生,我没有进一步阅读。在寻找控制器之间共享某些代码的正确方法时产生了疑问,我在服务提供商中遇到了一些问题,因此:

  • 我创建了一个say
    MyCustomServiceProvider
  • 我已经将它添加到
    app.php
    文件中的
    提供者
    别名
    数组中
  • 最后,我创建了一个自定义助手类,并将其注册为:

    class MyCustomServiceProvider extends ServiceProvider
    {
        public function boot()
        {
            //
        }
    
        public function register()
        {
            $this->app->bind('App\Helpers\Commander', function(){
    
                return new Commander();
    
            });
        }
    }
    
  • 但是,到目前为止,如果我在控制器中使用该自定义类,我必须通过
    use
    语句向其添加路径:

    use App\Helpers\Commander;
    
    `use App\Helpers\Commander;`
    
    否则,我会得到一个很好的类not found exception,显然我的控制器不适合他的工作。
    我怀疑在服务提供商身上有什么东西逃过了我的眼睛!:-)

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

    use App\Helpers\Commander;
    
    `use App\Helpers\Commander;`
    
    否则我就找不到一个好班了 异常,显然我的控制器不负责他的工作

    是的,这就是它的工作原理。如果不想使用全名,可以使用

    按如下方式创建Facade类:

    class Commander extends Facade
    {
        protected static function getFacadeAccessor() { return 'commander'; }
    }
    
    注册服务:

    $this->app->singleton('commander', function ($app) {
        return new Commander();
    });
    
    将别名添加到您的
    config/app.php

    'aliases' => [
        //...
        'Commander' => Path\To\Facades\Commander::class,
        //...
    ],
    
    并将其用作
    门面

    \Commander::doStuff();
    

    关于为什么代码仍然有效,即使在删除绑定时:


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

    感谢您的清晰解释!这是我期待的答案,也是我找不到的答案!但真正不清楚的是,如果我将
    register
    方法保留为空,没有任何更改,那么如果我添加其路径,我的自定义
    Commander
    类仍然有效,那么注册服务提供商的原因是什么?@Vincent添加了一段