Добавление фасадов перед пространством имен в Laravel, как это работает? - PullRequest
2 голосов
/ 17 января 2020

Хорошо, есть вопросы о той же самой топике c, но они не помогают полностью понять эту топи c

SO SuggestionFirst
SO Предложение Второе

Весь код предназначен только для иллюстрации ситуации, так что это структура

Вспомогательная функция, которая делает что-то

namespace App\Helpers;

class Pets{

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

Теперь по порядку использовать этот помощник, так как это класс, поэтому мне нужно создать такой объект, как этот Знайте, что если вы добавите Фасады перед вашим пространством имен, вы можете вызывать функцию статически, даже если они не являются статичными c, как эта функция


CODE SAMPLE SECOND

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;

Добавив Фасады, я могу вызывать функцию статически, но как, это в моем приложении нет пространства имен valida Что laravel делает за кулисами э, я так растерялся

Спасибо за ваше время;)

Ответы [ 2 ]

1 голос
/ 17 января 2020

То, что вы описываете, - это фасады Laravels Real-Time.

Документацию по функциональности вы можете найти здесь: https://laravel.com/docs/6.x/facades#real -time-facades

0 голосов
/ 17 января 2020

Я не буду вдаваться в подробности, но это простое объяснение того, что скрывается за кадром, когда вы используете фасады в laravel.

Предположим, вы определили пользовательский класс с некоторыми публикациями c методы:

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"
...