服务提供者有没有人用的比较多,能帮忙讲一下嘛?

文档的内容看起来云里雾里。。

大神救我-、-
已邀请:

zhuzhichao

赞同来自: Usual FiveSay

其实服务提供者在 L4 是有使用的,特别是在一些依赖
laravel framework
的扩展包中,不过在我们写程序中使用不怎么广泛。而在 L5 中,更加强调并且提高了这一块的实用性。甚至用新的
app/Providers
目录取代了 L4 的
app/start
里面的文件。这些服务提供者有很多启动应用程序相关的方法,像是错误处理,日志记录,路由加载,以及更多。当然,你可以自由的建立新的服务提供者到应用程序。

简单来说,服务提供者是做一些关于启动应用程序以及注册的事情。还不明白的话,这里有个典型的例子,就是根据环境来加载相应的扩展

```php
// AppServiceProvider.php

public function register()
{
$this->app->bind(
'Illuminate\Contracts\Auth\Registrar',
'App\Services\Registrar'
);

if ($this->app->environment('production')) {
$this->app->register('App\Providers\ProductionErrorHandlerServiceProvider');
} else {
$this->app->register('App\Providers\VerboseErrorHandlerServiceProvider');
}
}
```

而我们平常写程序中更加广泛的应用就是在
provider
register()
中进行依赖注入的绑定操作,以及
boot()
方法中来进行一些监听事件的绑定。

在 L5 中,对依赖注入更是加强了,让大家用起来更顺手方便了。下面的「
上下文绑定
」以及「
controller的依赖注入
」是新的功能。

上下文绑定

在 L4 中,如果你将一个类绑定到一个接口上之后,那么每次根据接口的提示注入的永远是这个类的实现,当你在不同的控制器中想实现 依靠同样的接口注入不同类 的话,那就是不可能的事情了,因为 L4 中只允许一个接口的实现绑定到该接口,除非你放弃把类绑定到接口,直接把注入的类名明确指定,但是这样又违背了依赖注入的灵活性了。

在 L5 中可以根据上下文灵活注入了,例如
php
$this->app->when('App\Handlers\Commands\CreateOrderHandler')
->needs('App\Contracts\EventPusher')
->give('App\Services\PubNubEventPusher');

这样你就可以
CreateOrderHandler
中根据提示的接口
EventPusher
来注入
PubNubEventPusher

controller的依赖注入

如果你想在在 L4 中创建一个新上传的视频的时候,想
controller
create($id)
方法中注入
MoiveCreater
对象的话(举例的
MoiveCreater
这个类包含了视频服务器连接以及创建目录,获取缩略图,视频转换等方法),这是不可能的,因为根据
route
绑定的是一个参数,你不可能写到这个方法里的,解决办法是你注入到
__construct
方法并赋值给类中的变量。

L5 中你可以这样来写,
create(MoiveCreater $moveCreater, $id)
。这样是不是看起来很酷?哈哈

以上内容来自我的博客文章 Laravel 5 与 Laravel 4.2 的主要差异和新功能,如果有什么问题可以继续交流 ^^

Usual

赞同来自:

刚刚去拜读了博客。

其实是看了好几遍还有点迷茫。。

我对于服务提供者的理解是使用一种类似于插件的形势向框架内部提供一种服务(所以叫服务提供者),原文档中又说服务提供者与应用启动相关,这样说来是不是可以认为现在的service provider替代了之前的start功能?

在Laravel 5.0的认证机制中有一个register的service,这个又怎么理解呢?

要回复问题请先登录注册