wir*_*hin 2 php controller service-provider laravel-5.2
至于标题,我花了大约两个小时的时间来寻找有效的答案,并反复阅读了官方文档,但考虑到我对框架相对较新,则没有任何进一步的改进。在寻找一种在控制器之间共享一些代码的正确方法时,我产生了疑问,我偶然发现了服务提供商,因此:
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();
});
}
}
Run Code Online (Sandbox Code Playgroud)但是到目前为止,如果我在控制器中使用该自定义类,则必须通过以下use语句向其添加路径:
use App\Helpers\Commander;
Run Code Online (Sandbox Code Playgroud)
否则,我得到一个很好的类,未发现异常,显然我的控制器没有执行他的工作。
我怀疑在服务提供商中有些事情对我不利!:-)
但是,到目前为止,如果我在控制器中使用该自定义类,则必须通过use语句为其添加路径:
Run Code Online (Sandbox Code Playgroud)`use App\Helpers\Commander;`否则,我得到一个很好的类,未发现异常,显然我的控制器没有执行他的工作。
是的,就是这样。如果您不想使用全名,则可以使用一个全名Facade。
像这样创建Facade类:
class Commander extends Facade
{
protected static function getFacadeAccessor() { return 'commander'; }
}
Run Code Online (Sandbox Code Playgroud)
注册服务:
$this->app->singleton('commander', function ($app) {
return new Commander();
});
Run Code Online (Sandbox Code Playgroud)
将别名添加到您的config/app.php:
'aliases' => [
//...
'Commander' => Path\To\Facades\Commander::class,
//...
],
Run Code Online (Sandbox Code Playgroud)
并像这样使用它Facade:
\Commander::doStuff();
Run Code Online (Sandbox Code Playgroud)
关于为什么即使删除绑定也仍然可以使用代码的原因:
当您向函数键入参数提示时,Laravel不知道想要的类型(通过绑定),Laravel会尽力为您创建该类。因此,即使您没有绑定该类,Laravel也会为您愉快地创建该类的实例。您真正需要绑定的地方是使用接口时。通常,您不是类型提示特定的类,而是接口。但是Laravel 无法创建接口的实例并将其传递给您,因此Laravel需要知道它如何构造一个实现所需接口的类。在这种情况下,您可以将类(或创建类的闭包)绑定到接口。
| 归档时间: |
|
| 查看次数: |
6197 次 |
| 最近记录: |