laravel门面和服务提供者使用

Posted brady-wang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了laravel门面和服务提供者使用相关的知识,希望对你有一定的参考价值。

    关于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.phpaliases属性中追加下面的代码:

 ‘Foo‘ => AppCustomFacadesFoo::class,

以上步骤就注册完成了,我们可以调用测试一下是否可用。
routesconsole.php里面添加下面的代码:

Artisan::command(‘testFacade‘,function(){
    dd(Foo::get());
});

然后在项目根目录的终端里面,调用下面的命令:

php artisan testFacade

如果输出 hello facade则说明都注册成功,接下来,我们可以在项目的任何地方使用该自定义门面啦。

结束语

本篇文章主要介绍了怎么在laravel中使用自定义的服务提供者和门面类,基本上都是参照的官方文档,如果有什么错误或者其他的地方,还望各位多指点指点。

 

 
 

以上是关于laravel门面和服务提供者使用的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 中 IoC 容器 服务提供者和门面的使用

Laravel服务/服务提供者/容器/契约和门面

laravel门面与服务提供者区别

laravel门面与服务提供者区别

laravel框架之门面(facades)

laravel 门面