为了账号安全,请及时绑定邮箱和手机立即绑定

在 Laravel 的命名空间之前添加 Facades,它是如何工作的?

在 Laravel 的命名空间之前添加 Facades,它是如何工作的?

PHP
墨色风雨 2022-07-22 17:15:22
好的,以前有关于同一主题的问题,但它们无助于完全理解这个主题SO SuggestionFirstSO Suggestion Second所有代码只是为了说明情况,所以这是结构一个辅助函数,它做一些事情namespace App\Helpers;class Pets{    public function limit($string,$limit,$start = 0){        return substr($string,$start,$limit);    }}现在为了使用这个助手,因为它是一个类,所以我需要创建一个像这样的对象代码示例优先namespace App\Objects;use App\Helpers\Pets;class User{    public function getShortUserName(){        $name = auth()->user()->first_name.' '.auth()->user()->last_name;        $pet = new Pets;        return $pet->limit($name,10);    }}但是在某个地方我知道,如果您在命名空间之前添加外观,即使它们是像这样的非静态函数,您也可以静态调用该函数代码示例二namespace App\Objects;use Facades\App\Helpers\Pets;class User{    public function getShortUserName(){        $name = auth()->user()->first_name.' '.auth()->user()->last_name;        return Pets::limit($name,10);    }}现在我想知道的是我有 2 个带有命名空间的示例代码,如下所示use App\Helpers\Pets;use Facades\App\Helpers\Pets;通过添加门面,我可以静态调用该函数,但是如何,这不是我的应用程序中的验证命名空间 laravel 在幕后做什么,我很困惑感谢您的时间 ;)
查看完整描述

2 回答

?
慕容708150

TA贡献1831条经验 获得超4个赞

您所描述的是 Laravel 实时外观。

您可以在此处找到该功能的文档: https ://laravel.com/docs/6.x/facades#real-time-facades


查看完整回答
反对 回复 2022-07-22
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

我不会详细介绍,但这是对在 laravel 中使用外观时幕后发生的事情的简单解释。


假设您使用一些公共方法定义了一个自定义类:


namespace Test;


class Foo

{

    public function test()

    {

        return 'test';

    }

}

然后你必须为这个类定义一个外观:


namespace Test1;


class BarFacade

{

    // In laravel this is called in the Facade abstract class but it is actually implemented

    // by all the facades you add across the application

    public static function getFacadeAccessor()

    {

        // In laravel you can also return a string which means that the object 

        // will be retrieved from the container.


        return new \Test\Foo();

    }


    // In laravel this method is defined in the Facade abstract class

    public static function __callStatic($method, $args)

    {

        $object = self::getFacadeAccessor();


        return call_user_func_array([$object, $method], $args);

    }

}

$aliases然后,您必须在文件的数组中定义别名config.app。这些别名由 laravel 解析并使用 php 内置函数class_alias 注册(参见 Illuminate/Foundation/AliasLoader.php)


class_alias('Test\Foo', 'BarFacade', true);

// You can also create an alias for the facade itself

class_alias('Test1\BarFacade', 'FooBar', true);

然后你可以简单地调用门面:\


var_dump(BarFacade::test());

var_dump(\Test1\BarFacade::test());

var_dump(\FooBar::test());

结果显然是:


string(4) "test"

string(4) "test"

string(4) "test"


查看完整回答
反对 回复 2022-07-22
  • 2 回答
  • 0 关注
  • 93 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信