Автоматические фасады в Laravel

Как заставить фасады создаваться в реальном времени?

Пока делал предыдущий туториал - узнал, что вовсе необязательно создавать фасады вручную. Можно воспользоваться построением фасадов в реальном времени.

Пример с созданием класса-фасада

Допустим, мы имеем класс StringFilter, который лежит в директории /app/Helpers/Filters и имеет один метод - keepNumbersAndLettersOnly(), который удаляет из строки все символы кроме латинский букв и чисел:

1 2 3 4 5 6 7 8 9 10 11
<?php   namespace App\Helpers\Filters;   class StringFilter { public function keepNumbersAndLettersOnly(string $str): string { return preg_replace('/[^A-Za-z0-9]+/u', '', $str); } }

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

1 2 3 4 5 6 7 8 9 10 11 12 13
<?php   namespace App\Facades\Helpers\Filters;   use Illuminate\Support\Facades\Facade;   class StringFilter extends Facade { protected static function getFacadeAccessor() { return \App\Helpers\Filters\StringFilter::class; } }

И зарегистрировать alias в /config/app.php, добавив к массиву с ключом alias следующую строку:

'StringFilter' => \App\Facades\Helpers\Filters\StringFilter::class,

Теперь по всему проекту мы можем обращаться к методу keepNumbersAndLettersOnly() через псевдоним фасада:

\StringFilter::keepNumbersAndLettersOnly('abc-=|,.123');

Либо импортировать пространство имен фасада:

1 2 3 4 5 6 7 8 9 10 11 12 13
<?php   namespace App\Http\Controllers;   use App\Facades\Helpers\Filters\StringFilter;   class TestController extends Controller { public function index() { return StringFilter::keepNumbersAndLettersOnly('abc-=|,.123'); } }

Пример создания фасада "на лету"

Повторим тоже самое, но без создания класса фасада (удалите его).

Всё что нужно сделать, это всего-лишь добавить в начало к импортируемому пространству имен требуемого класса приставку Facades\.

Таким образом мы сможем обращаться к обычным методам класса статическим способом, без создания экземпляра класса своими руками:

1 2 3 4 5 6 7 8 9 10 11 12 13
<?php   namespace App\Http\Controllers;   use Facades\App\Helpers\Filters\StringFilter;   class TestController extends Controller { public function index() { return StringFilter::keepNumbersAndLettersOnly('abc-=|,.123'); } }

Как за такую магию не любить Laravel? 🤗

Добавление псевдонима для фасада в реальном времени

Давайте пойдем ещё дальше и избавимся от необходимости каждый раз импортировать пространство имен с приставкой Facades/.

Для этого, таким же образом, необходимо в файле /config/app.php в массив с ключом alias добавить одну строку:

'StringFilter' => Facades\App\Helpers\Filters\StringFilter::class,

Теперь мы можем просто вызывать методы по псевдониму нашего автоматического создаваемого фасада таким образом:

1 2 3 4 5 6 7 8 9 10 11
<?php   namespace App\Http\Controllers;   class TestController extends Controller { public function index() { return \StringFilter::keepNumbersAndLettersOnly('abc-=|,.123'); } }

Комментарии

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: