Php Laravel 5.2中控制器内服务提供商的使用
关于这个标题,我花了大约两个小时寻找一个有效的答案,并反复阅读了官方文档,但考虑到我对这个框架还比较陌生,我没有进一步阅读。在寻找控制器之间共享某些代码的正确方法时产生了疑问,我在服务提供商中遇到了一些问题,因此:Php Laravel 5.2中控制器内服务提供商的使用,php,controller,laravel-5.2,service-provider,Php,Controller,Laravel 5.2,Service Provider,关于这个标题,我花了大约两个小时寻找一个有效的答案,并反复阅读了官方文档,但考虑到我对这个框架还比较陌生,我没有进一步阅读。在寻找控制器之间共享某些代码的正确方法时产生了疑问,我在服务提供商中遇到了一些问题,因此: 我创建了一个sayMyCustomServiceProvider 我已经将它添加到app.php文件中的提供者和别名数组中 最后,我创建了一个自定义助手类,并将其注册为: class MyCustomServiceProvider extends ServiceProvider {
MyCustomServiceProvider
李>
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;
`use App\Helpers\Commander;`
否则,我会得到一个很好的类not found exception,显然我的控制器不适合他的工作。我怀疑在服务提供商身上有什么东西逃过了我的眼睛!:-) 然而,到目前为止,如果在控制器中使用该自定义类,则 必须通过use语句向其添加路径:
use App\Helpers\Commander;
`use App\Helpers\Commander;`
否则我就找不到一个好班了
异常,显然我的控制器不负责他的工作
是的,这就是它的工作原理。如果不想使用全名,可以使用
按如下方式创建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,
//...
],
并将其用作门面:
\Commander::doStuff();
关于为什么代码仍然有效,即使在删除绑定时:
当您为一个函数键入一个提示参数,而Laravel不知道您想要的类型(通过绑定),如果可能的话,Laravel会尽力为您创建该类。因此,即使您没有绑定该类,Laravel也会很乐意为您创建该类的实例。实际需要绑定的地方是在使用接口时。通常,您不会键入特定于提示的类,而是键入一个接口。但是Laravel无法创建接口的实例并将其传递给您,因此Laravel需要知道如何构造一个实现您所需接口的类。在这种情况下,您需要将类(或创建类的闭包)绑定到接口。感谢您的清晰解释!这是我期待的答案,也是我找不到的答案!但真正不清楚的是,如果我将register
方法保留为空,没有任何更改,那么如果我添加其路径,我的自定义Commander
类仍然有效,那么注册服务提供商的原因是什么?@Vincent添加了一段