至于标题我大约两个小时寻找一个有效的答案并反复阅读官方文档,但没有任何进一步的步骤,考虑到我相对较新的框架。在搜索控制器之间共享某些代码的正确方法时遇到了疑问,我偶然发现服务提供商,所以:
MyCustomServiceProvider
; providers
文件中的aliases
和app.php
数组中; 最后,我创建了一个自定义帮助程序类,并将其注册为:
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;
否则我得到一个很好的课程没有找到异常,显然我的控制器不是他的工作 我怀疑在服务提供商那里有一些东西逃脱了! : - )
答案 0 :(得分:5)
然而,到目前为止,如果我在控制器I中使用该自定义类 必须通过use语句添加路径:
`use App\Helpers\Commander;`
否则我找不到一个好的课程 例外,显然我的控制器不是他的工作。
是的,它是如何运作的。如果您不想使用全名,则可以使用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();
为什么你的代码仍然有效,即使你删除了绑定:
当您为函数键入提示参数时,Laravel不知道您想要的类型(通过绑定),Laravel将尽力为您创建该类(如果可能)。因此,即使你没有绑定课程,Laravel也会乐意为你创建一个类的实例。实际需要绑定的地方是使用 interfaces 时。通常,您不是键入提示特定类而是接口。但是Laravel 无法创建接口的实例并将其传递给您,因此Laravel需要知道如何构建实现所需接口的类。在这种情况下,您将类(或创建类的闭包)绑定到接口。