Facade---Laravel学习笔记

Laravel中的Facade提供了对于类的更简便的访问方法。在经过Facade访问类时,是不须要手动对类进行实例化的,对于类的全部可访问的方法(无论是是静态仍是非静态方法),均可以采用访问静态方法的方式进行访问,即SomeObjectFacade::someMethod($parameters)php

其实某个类的facade能够看做是具体的相关的类的实例的一个代理,而这个实例是在服务容器中注册的。数组

如今有一个类App\LearningTest\Bar:app

<?php
namespace App\LearningTest;
class Bar
{
  public function test ()
  {
    echo 'Mes from Bar::test';
    return 'Mes from Bar::test';
  }
}

如下是这个类的facade的实现:ide

<?php

namespace App\Facades;

use Illuminate\Support\Facades\Facade;

class Bar extends Facade
{
    protected static function getFacadeAccessor()
    {
      return 'bar';
    }
}

在经过App\Facades\Bar访问相应的类时,其实是经过getFacadeAccessor返回的字符串'bar'去容器中查询该字符串绑定的所注册的类的实例。即this

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
        $this->app->bind('bar', function () {
            return new \App\LearningTest\Bar();
        });

        $this->app->alias('bar', 'App\LearningTest\Bar');
    }
}

可见,字符串'bar'经过中间的容器将facade与具体的类的实例联系了起来。spa

最好,经过在config/app.php中将App\Facades\Bar注册到aliases数组中,即代理

'Bar' => App\Facades\Bar::class

就能够在Laravel应用中经过该别名而不须要特别引入就能够访问App\LearningTest\Bar实例的相关方法了,好比在某个类中调用test方法:Bar::test(),但不须要明显的引入App\LearningTest\Bar。code

相关文章
相关标签/搜索