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

时间:2016-06-27 15:18:18

标签: php controller laravel-5.2 service-provider

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

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

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

    use App\Helpers\Commander;
    

    否则我得到一个很好的课程没有找到异常,显然我的控制器不是他的工作 我怀疑在服务提供商那里有一些东西逃脱了! : - )

1 个答案:

答案 0 :(得分:5)

  

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

`use App\Helpers\Commander;`
     

否则我找不到一个好的课程   例外,显然我的控制器不是他的工作。

是的,它是如何运作的。如果您不想使用全名,则可以使用Facade代替。

像这样创建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,
    //...
],

并将其用作Facade

\Commander::doStuff();

为什么你的代码仍然有效,即使你删除了绑定:

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