Facade 的运行机制
打赏作者

dope2008
  • 我自已写了一个类是订单处理。起名/app/Libraries/Order.php
  • 新建一个/app/Providers/OrderServiceProvider.php
  • 现在我就是想问,我的Facades起什么名好。/app/Facades/Order.php 难道又叫Order.php??
  • 我调用的时候 Order::aa() 这样明了

我自已的类,和Facades怎么样起名字比较好

JellyBool 回复 dope2008

OrderFacade ?或者你改你的 /app/Libraries/Order.php ,OrderProcess?

zhangwei900808

群主能不能从新建一个Facades讲起阿,我想看看整个流程

laravel0304

2:29 额,呼出所有方法的key 在哪里设置呢,找了好久没找到 -。- 找到了 cmd + F12

JellyBool 回复 laravel0304

先看一下这个视频吧 https://www.laravist.com/series/phpstorm-the-best-php-ide-you-ever-met

这里的解决方案是:找 File Structure 这个配置

laravel0304 回复 JellyBool

恩 之前看过了 3q。 这个MAC 原生的 快捷键是 command+F12( 同时还得按fn键 )

JellyBool 回复 laravel0304

我自己设置过这个快捷键,command ctrl m

Jerda

这个系列太棒了,本来源码看得云里雾里的,现在终于能看懂了。

BigXia 回复 Jerda

确实,Service Container, Service Provider, Facade,层层递进

yuesir

Router 这个是在哪里绑定到 IOC 容器里面的,搜了下没有 RouterServiceProvider ?

JellyBool 回复 yuesir
App\Providers\RouteServiceProvider::class 

这个么?

BigXia 回复 JellyBool

Router关键字 是怎么注册到IoC容器中的

a359611223

原来这个facade读fəˈsɑ:d 我一直读的’fækeɪt 涨姿势了

BigXia 回复 a359611223

一起读 Facade,哈哈

578101804

站长我自己新建了一个Facade


namespace App\Facade;
use Illuminate\Support\Facades\Facade;

class Encrypt extends Facade{
    protected static function getFacadeAccessor(){
        return 'encrypt';
    }
}

然后 ServiceProvider 也创建了


public function register()
    {
        $this->app->bind('encrypt',function (){
            return new Encrypt();
        });
    }

也在app文件里面导入了


'Encrypt' => App\Facade\Encrypt::class,

现在问题来了:

我在路由文件里面调用


Route::get('/',function (){
        dd(Encrypt::encrypt('123'));
    });

正常打印结果

但是我在UserModel里面用就报错


public function setPasswordAttribute($password){
        $this->attributes['password'] = Encrypt::encrypt($password);
//        $this->attributes['password'] = app('encrypt')->encrypt($password);
    }


用下面的app(‘encrypt’)方式使用就正常

报错如下:

FatalErrorException in User.php line 27:
Class ‘App\Encrypt’ not found

我项目结构是
app/Encrypt/Encrypt.php
app/Facade/Encrypt.php

JellyBool 回复 578101804

命名空间没对,

Encrypt::encrypt($password);

这里使用没给对命名空间

578101804 回复 JellyBool

这里不是上面引入了命名空间么?

JellyBool 回复 578101804

UserModel 这里没有 use Encrypt 吧

f4cklangzi 回复 578101804

我也自己建了一个Facade用起来没毛病,贼洋气

Aaron-wlh

每次暂停一段时间,然后视频就不能看了。 还有能不能加上个 下一节视频的链接,原来都有的。

JellyBool 回复 Aaron-wlh

鼠标放到视频播放区域

BigXia 回复 JellyBool

视频有时,暂停就不能放了,刷新得从头看,建议刷新接着上一次的位置看

zhangwei

感觉再次看又有新的理解 门面模式给已经绑定的服务提供了一种静态调用方法,在日常开发中完全可以只使用在构造方法中类型提示 来实现依赖注入与解析绑定。当然用门面模式显得更加黑科技。

JellyBool 回复 zhangwei

阔以阔以!哈哈哈

BigXia 回复 JellyBool

但是门面获得的是一个对象,比如在调用,Mailer类中的raw()方法时,是静态调用,但raw方法不是静态方法,为什么可以这样调呢

BigXia 回复 JellyBool

因为 Facade类中的 __callStatic() 方法,不仅进行了实例化,还用实例访问了传参进来的方法,自问自答,不断精进,感谢Jelly提供的平台。

EagleKing

站长的方言口音影响人类进步的阶梯啊,facade 读的也不对啊

JellyBool 回复 EagleKing

哈哈哈。。。这个确实有点难改

liujun 回复 EagleKing

facade读的完全没问题

BigXia 回复 EagleKing

这话,听着不开心,Jelly的教程入门Laravel还是很棒的,看Laravel官方文档,根本看不懂Service Container, Service Provider和Facade是什么,也不清楚他们之间的联系,看了视频感觉蛮有用,算是入门了。

Flourishing

Jelly的课程讲的还是不错的 希望以后再百忙之中 抽出时间 给我们分享知识 让大家一起进步

BigXia 回复 Flourishing

你杂那么优秀咧