【问题标题】:Use of service providers within controllers in Laravel 5.2在 Laravel 5.2 的控制器中使用服务提供者
【发布时间】:2016-10-29 16:25:21
【问题描述】:

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

  1. 我创建了一个MyCustomServiceProvider;
  2. 我已将其添加到 app.php 文件中的 providersaliases 数组中;
  3. 最后我创建了一个自定义助手类并像这样注册它:

    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;

否则我会得到一个不错的类未找到异常,显然我的控制器没有他的工作。
我怀疑在服务提供商身上有什么东西让我漏掉了! :-)

【问题讨论】:

    标签: php controller laravel-5.2 service-provider


    【解决方案1】:

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

    `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,
        //...
    ],
    

    并像 Facade 一样使用它:

    \Commander::doStuff();
    

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

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

    【讨论】:

    • 感谢清晰的解释!这是我期待的答案,也是我找不到的答案!但不太清楚的是,如果我将register 方法留空,则没有任何变化,如果我添加其路径,我的自定义Commander 类仍然有效,那么注册服务提供者的原因是什么?
    • @Vincent 添加了一段
    猜你喜欢
    • 2016-08-23
    • 2016-12-21
    • 1970-01-01
    • 2017-01-11
    • 2019-05-29
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    相关资源
    最近更新 更多