Laravel 5 与 Laravel 4.2 的主要差异和新功能(2)

在 Laravel 5.0 中的使用,你可以简单理解为 Laravel 4.2 的过滤器换成了中间件,但是中间件远比 Laravel 4.2 的过滤器强大并且用处更广了。

「服务提供者」将给你更多帮助

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

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

// 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() 方法中来进行一些监听事件的绑定。

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

上下文绑定

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

在 Laravel 5.0 中可以根据上下文灵活注入了,例如

$this->app->when('App\Handlers\Commands\CreateOrderHandler') ->needs('App\Contracts\EventPusher') ->give('App\Services\PubNubEventPusher');

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

controller的依赖注入

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

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

更多好用的「帮助函数」

由于程序中使用了命名空间,所以你在 controller 中使用一些常用的类操作的话,会不方便,因为会引用很多的类命名空间,例如, \View \Response \Config 等等,或者你在 PHP 文件上面使用 use 来依次引入。

Laravel 5.0 中建议你使用 view() response() config() 等方法来优雅完成你的操作。你想知道所有的这类函数或者实现方法的话,你看这里

能将你的逻辑封装起来的「命令commands」

注意:这里的 commands 和 console command 是两码事啊。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/97f8ccdc0ee04e1648228a93834308cb.html