查看: 575|回复: 0

[PHP学习] Facade---Laravel学习笔记

发表于 2017-9-30 10:25:19
尚学堂AD

Laravel中的Facade提供了对于类的更简便的访问方法。在通过Facade访问类时,是不需要手动对类进行实例化的,对于类的所有可访问的方法(不管是是静态还是非静态方法),都可以采用访问静态方法的方式进行访问,即SomeObjectFacade::someMethod($parameters)

其实某个类的facade可以看作是具体的相关的类的实例的一个代理,而这个实例是在服务容器中注册的。

现在有一个类App\LearningTest\Bar:

  1. <?php
  2. namespace App\LearningTest;
  3. class Bar
  4. {
  5. public function test ()
  6. {
  7. echo 'Mes from Bar::test';
  8. return 'Mes from Bar::test';
  9. }
  10. }
复制代码

以下是这个类的facade的实现:

  1. <?php
  2. namespace App\Facades;
  3. use Illuminate\Support\Facades\Facade;
  4. class Bar extends Facade
  5. {
  6. protected static function getFacadeAccessor()
  7. {
  8. return 'bar';
  9. }
  10. }
复制代码

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

  1. <?php
  2. namespace App\Providers;
  3. use Illuminate\Support\ServiceProvider;
  4. class AppServiceProvider extends ServiceProvider
  5. {
  6. /**
  7. * Bootstrap any application services.
  8. *
  9. * @return void
  10. */
  11. public function boot()
  12. {
  13. //
  14. }
  15. /**
  16. * Register any application services.
  17. *
  18. * @return void
  19. */
  20. public function register()
  21. {
  22. //
  23. $this->app->bind('bar', function () {
  24. return new \App\LearningTest\Bar();
  25. });
  26. $this->app->alias('bar', 'App\LearningTest\Bar');
  27. }
  28. }
复制代码

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

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

  1. 'Bar' => App\Facades\Bar::class
复制代码

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



回复

使用道具 举报