至于标题,我在谷歌上搜索了大约两个小时以寻找有效的答案,并反复阅读了官方文档,但考虑到我对这个框架还比较陌生,所以没有采取任何进一步的措施。在寻找在 Controller 之间共享一些代码的正确方法时出现了疑问,我偶然发现了服务提供商,所以:
我创建了一个
MyCustomServiceProvider
;我已将它添加到
app.php
文件中的providers
和aliases
数组;最后,我创建了一个自定义助手类并将其注册为:
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/