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

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


SO SuggestionFirst

SO 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 在幕后做什么,我很困惑


感谢您的时间 ;)


墨色风雨
浏览 94回答 2
2回答

慕容708150

您所描述的是 Laravel 实时外观。您可以在此处找到该功能的文档: https ://laravel.com/docs/6.x/facades#real-time-facades

慕姐8265434

我不会详细介绍,但这是对在 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 itselfclass_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"
打开App,查看更多内容
随时随地看视频慕课网APP