在 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
好的,之前有关于同一主题的问题,但它们无助于完全理解这个主题
所有的代码只是为了说明情况,所以是这样的结构
做某事的辅助函数
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