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 加载并初始化自定义助手类的主要内容,如果未能解决你的问题,请参考以下文章