使用/进口Laravel外墙的正确方法是什么?

Ale*_* P. 3 php namespaces laravel laravel-5 laravel-5.3

导入外墙命名空间的正确方法是什么(例如Hash::make)?

我需要使用导入use Illuminate\Support\Facades\Hash吗?

我看到有些人使用它们\Hash::make(来自命名空间文件,例如默认创建的控制器)或Hash::make(来自非命名空间的文件,例如路由).

此外IDE辅助生成的根命名空间外墙:

namespace {
exit("This file should not be included, only analyzed by your IDE");

class Hash extends \Illuminate\Support\Facades\Hash{        
    /** ... */
    public static function make($value, $options = array()){
        return \Illuminate\Hashing\BcryptHasher::make($value, $options);
    }
Run Code Online (Sandbox Code Playgroud)

但我不明白为什么它的工作原理如果这个类在Illuminate\Support\Facades\命名空间中,而不是在根命名空间中.

sep*_*ehr 8

您正在将Facades与Aliases进行比较.

Illuminate\Support\Facades\Hash是一个Facade类,但是\Hash是该外观的别名类.看看你的情况config/app.php,看看它们是如何映射的:

'aliases' => [
    'App'     => Illuminate\Support\Facades\App::class,
    'Artisan' => Illuminate\Support\Facades\Artisan::class,
    'Auth'    => Illuminate\Support\Facades\Auth::class,
    // ...
Run Code Online (Sandbox Code Playgroud)

您可以使用\Hash别名或Illuminate\Support\Facades\Hash外观类; 两者都是正确的.

在自举阶段,Laravel使用名为的服务AliasLoader.它从中获取别名数组config/app.php,遍历所有元素,并__autoload使用PHP 创建函数队列spl_autoload_register.

每个__autoload函数都负责使用PHP的class_alias函数为各个Facade类创建别名.因此,在使用它们之前,我们不必导入和别名.

阅读更多:
Laravel Facades如何工作以及如何在其他地方使用它们

  • HM.我想知道为什么`artisan make:...`生成的所有文件都不使用别名并包含完整的命名空间导入,如`使用Illuminate\Support\Facades\Schema`而不仅仅是`\ Schema`或`使用Schema` (2认同)

sho*_*101 5

在您的config/app.php文件中,您可以看到aliases. Hash包含在那里,因此您可以Hash仅使用导入use Hash;

\Hash::make,这里\是从根命名空间引用。因此,您可以使用导入Hash顶部使用use Hash或直接使用使用\Hash::make