Laravel 加载并初始化自定义助手类

Posted

技术标签:

【中文标题】Laravel 加载并初始化自定义助手类【英文标题】:Laravel load and initialize custom helper class 【发布时间】:2018-04-03 13:44:17 【问题描述】:

关于在 Laravel 中加载自定义助手类有很多问题。但是,它们都没有专注于通过适当的初始化加载它们。

从 Laravel 5.3 版开始,我们可以使用 psr-4 自动加载,它会自动加载整个 app/ 目录。但是,类正在加载但从未初始化。

我在app/helpers/support.php 中有我的助手类。这个类有一个构造函数,我想在其中加载一些重要的配置以使助手可用。

那么我怎样才能在 Laravel 中正确地加载我的助手,但同时 初始化它呢?现在我只是通过在AppServiceProvider.php 中使用new \App\Helper\Support(); 来解决这个问题。


编辑:我正在使用以下方法来维护我的助手类:

Best practices for custom helpers on Laravel 5

【问题讨论】:

你能提供更多关于你的助手做什么的背景吗?每次请求都需要初始化吗?实例创建后你还在使用吗? 我不需要在每个页面请求上都初始化它,因为我没有在每条路线上都使用这个助手。但是,为了简单起见,我希望它准备好完成这项工作,而不是每次我需要它时都对其进行初始化,这就是我希望它自动初始化的原因。这个类基本上是根据构造函数中加载的站点/语言配置转换一些字符串。 您可以查看 laravel 的 Service Container 以及如何在 this article 中使用它 【参考方案1】:

您所拥有的似乎是一项服务。无需创建实例,您可以在应用服务提供程序中声明它,并在需要时将其作为依赖项注入。

在您的register 方法中:

$this->app->bind(\App\Helper\Support::class);

您现在可以使用依赖注入来获取您的类的实例。你也可以像这样创建一个实例:

app()->make(\App\Helper\Support::class);

如果您只想在任何给定时间存在一个实例,请使用singleton 而不是bind

我建议阅读服务容器文档:

https://laravel.com/docs/5.5/container

【讨论】:

快速说明:您可以将实例创建为$support = app(\App\Helper\Support::class);(不带->make() 另外,Automatic Injection 部分值得一提:) @ljubadr 这是一个好点。我故意不使用自动注入,我宁愿在我的应用服务提供者中明确声明我的所有服务。 我不太确定这是否是我需要的。几乎所有的类方法都是静态的(显然是一个助手),而这个需要我让它们成为动态的(?)。而不是Support::doSomething(..) 我必须app(\App\Helper\Support::class)->doSomething() 我不认为我喜欢那样。 @DonaldDuck 如果你有一个依赖于构造函数的静态方法,那么它不应该是静态的。

以上是关于Laravel 加载并初始化自定义助手类的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.6 中的自定义助手

Laravel Blade - 自定义助手

codeigniter 中的自定义助手

使用netty编写第一个hello netty服务器

如何在车把 ember 中定义自定义助手

如何在自定义助手中访问排毒元素匹配器?