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

Adding Facades before namespace in Laravel , How it works?

好的,之前有关于同一主题的问题,但它们无助于完全理解这个主题




所有的代码只是为了说明情况,所以是这样的结构

做某事的辅助函数

namespace App\Helpers;

class Pets{

    public function limit($string,$limit,$start = 0){
        return substr($string,$start,$limit);
    }
}

现在为了使用这个助手,因为它是一个 class 所以我需要创建一个像这样的对象


代码示例优先

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);
    }
}

但是我在某个地方了解到,如果您在命名空间之前添加 Facades,即使它们是非静态函数,您也可以静态调用该函数


第二个代码示例

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;

通过添加 Facades,我可以静态调用该函数,但是,这不是我应用程序中的 valida 命名空间 laravel在幕后做了什么,我很困惑

感谢您的宝贵时间 ;)

我不会输入太多细节,但这是对在 laravel.

中使用 facades 时幕后情况的简单解释

假设您使用一些 public 方法定义自定义 class:

namespace Test;

class Foo
{
    public function test()
    {
        return 'test';
    }
}

然后你必须为此定义一个门面 class:

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);
    }
}

然后,您必须在 config.app 文件的 $aliases 数组中定义别名。这些别名由 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"

您所描述的是 Laravels Real-Time Facades。

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