gpt4 book ai didi

php - 在 Laravel 5.2 的 Controller 中使用服务提供者

转载 作者:行者123 更新时间:2023-12-02 07:22:56 25 4
gpt4 key购买 nike

至于标题,我在谷歌上搜索了大约两个小时以寻找有效的答案,并反复阅读了官方文档,但考虑到我对这个框架还比较陌生,所以没有采取任何进一步的措施。在寻找在 Controller 之间共享一些代码的正确方法时出现了疑问,我偶然发现了服务提供商,所以:

  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();

    });
    }
    }

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

use App\Helpers\Commander;

否则我会得到一个很好的类未找到异常,显然我的 Controller 没有他的工作。
我怀疑服务提供商有什么东西让我逃避了! :-)

最佳答案

So far, however, if I use that custom class within a controller I necessarily need to add the path to it through the use statement:

`use App\Helpers\Commander;`

otherwise I get a nice class not found exception and obviously my controller does not his job.

是的,这就是它的工作原理。如果不想使用全名,可以使用 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();

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

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

关于php - 在 Laravel 5.2 的 Controller 中使用服务提供者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38057630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com