关于laravel门面和服务提供者使用的一点见解,门面之词,不足之处,还请多多指教。
在laravel中,我们可能需要用到自己添加的类时,可以建立一个文件夹专门存放类文件,也可以使用laravel的服务提供者的方式来使用。
这两者其实区别不大,主要是前者使用的话,会跟业务代码产生依赖,想象一下,如果一个控制器之中引用了很多自定义的类文件的话,那么可以想像会产生多少依赖,所以我们可以使用服务提供者的方式,向laravel的容器内注册类,这样的话,就能够在一个单独的配置文件里面来管理依赖,逻辑和后期维护也会方便不少。
使用门面主要是可以不需要去实例化类,可以使用静态方法的方式去访问类的方法,用起来也比较方便,不过这样其实也有缺点,比如不能够直接跳转到对应的方法内部,也不能直观的去了解这个方法的用法,个人开发可能影响不大,不过如果团队开发的,其实用起来可能会让人有点晕晕的吧。
好了,话不多说,还是用代码来说话吧。
此代码是建立在laravel5.3的基础上
一、建立一个需要用到类
在app
目录下面见一个libToolsFooBar.php
文件,这是我们的工具类,里面是我们定义的代码。
<?php
namespace AppLibTools;
class FooBar
{
public function get()
{
return ‘hello facade‘;
}
}
二、建立一个服务提供者
使用php artisan make:provider FooServiceProvider
创建一个服务提供者,并将我们刚才编写的工具类注册到容器里面,
<?php
namespace AppProviders;
use IlluminateSupportServiceProvider;
use AppLibToolsFooBar;
class FooServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
$this->app->bind(‘foo‘,function(){
return new FooBar();
});
}
}
如果需要慢加载的话,则需要添加在改服务提供者中添加一个$defer
属性。并定义一个provides方法。如下所示:
protected $defer = true;
public function provides()
{
return [FooBar::class];
}
三、注册服务提供者
在configapp.php
文件中的providers
属性里面注册我们刚添加的服务提供者,如下所示:
/*
* Application Service Providers...
*/
AppProvidersAppServiceProvider::class,
AppProvidersAuthServiceProvider::class,
// AppProvidersBroadcastServiceProvider::class,
AppProvidersEventServiceProvider::class,
AppProvidersRouteServiceProvider::class,
AppProvidersFooServiceProvider::class,
这样我们就可以在项目中的任何地方使用我们刚才定义的工具类,可以直接在某个类的方法里面注入,然后就可以直接调用了。如果想要使用门面的话,可以往下看。
四、创建一个门面类
在app
目录下面创建一个门面类,AppCustomFacadesFoo.php
,目录这里是我自己建立的,这个可以随便创建。只要在后面注册的时候一致就可以。代码如下:
<?php
namespace AppCustomFacades;
use IlluminateSupportFacadesFacade;
class Foo extends Facade
{
protected static function getFacadeAccessor()
{
return ‘foo‘;
}
}
五、注册门面
在configapp.php
的aliases
属性中追加下面的代码:
‘Foo‘ => AppCustomFacadesFoo::class,
以上步骤就注册完成了,我们可以调用测试一下是否可用。
在routesconsole.php
里面添加下面的代码:
Artisan::command(‘testFacade‘,function(){
dd(Foo::get());
});
然后在项目根目录的终端里面,调用下面的命令:
php artisan testFacade
如果输出 hello facade
则说明都注册成功,接下来,我们可以在项目的任何地方使用该自定义门面啦。
结束语
本篇文章主要介绍了怎么在laravel中使用自定义的服务提供者和门面类,基本上都是参照的官方文档,如果有什么错误或者其他的地方,还望各位多指点指点。