Урок 18. Введение в фасады Laravel


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

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

Что такое фасад? А что такое оболочка?

Фасад в Laravel - это оболочка вокруг нестатической функции, которая превращает ее в статическую функцию.

Слово "оболочка" также может использоваться при описании шаблонов проектирования. Обертывание объекта для обеспечения упрощенного интерфейса к нему часто описывается как шаблон "фасад".

Короче говоря, обертка - это фасад.

Прежде чем углубиться в изучение фасадов, важно понять, что такое статические и нестатические функции в PHP.

Статические методы

В статических методах нам не требуется создавать экземпляр класса, чтобы ссылаться на него. Статические методы используют двойные двоеточия (::) при доступе к свойствам или методам класса:

<?php
class Calc {
    const GOLDEN_RATIO = '1.618';
}

echo Calc::GOLDEN_RATIO;  //1.618
Зарезервированные ключевые слова, такие как self, static и parents, используются для ссылки на свойства или методы внутри класса:

<?php
class backend {
	private const language = "php";
	public static function language() {
    	echo self::language;
  	}
}

backend::language();  //php
Нестатические методы

Нестатические методы требуют, чтобы был создан экземпляр данного класса. Другими словами, для их выполнения требуется экземпляр класса:

<?php
class backend{

	public function language($name){
		
		echo $name;
	}

}


$test = new backend; // создание экземпляра класса

$test->language('php'); //php
Теперь, когда мы рассмотрели статические и нестатические методы, мы можем глубже погрузиться в фасады в Ларавеле.

Фасады Laravel

В каталоге vendors > laravel > framework > src > illuminate > Support > Facades есть список файлов, которые являются различными фасадами, поставляемыми с Laravel по умолчанию.

Вот скриншот того, как на самом деле выглядит список файлов в данном каталоге:



Давайте воспользуемся рабочим кодом из Log.php чтобы изучить фасады более подробно – одно и то же объяснение должно применяться ко всем фасадам в любом приложении Laravel.

Log facade Ларавеля

Вот код для Log facade Laravel:

<?php

namespace Illuminate\Support\Facades;

class Log extends Facade
{
    /**
     * Get the registered name of the component.
     *
     * @return string
     */
    protected static function getFacadeAccessor()
    {
        return 'log';
    }
} 
Log - это класс, который расширяет базовый фасад, который находится в пространстве имен выше.

В классе Log у нас есть модификатор защищенного доступа getFacadeAccessor, и этот метод просто возвращает Log.

Имя этого фасада, Log, возвращается, чтобы мы могли получить доступ к именованному фасаду в любом месте приложения Laravel без его инициализации. Таким образом, мы можем сделать что-то вроде Log::info ("привет"); в любом месте очень легко.

Как вы можете видеть, фасады облегчают чтение кода, делают его более организованным и в 10 раз упрощают тестирование. Это действительно удобный инструмент отладки.

Как создать фасад в Laravel

В этом разделе мы реализуем наш собственный фасад. Основная цель здесь - помочь учащимся понять, как работают фасады Laravel.

Мы сделаем это, создав StudentFacade, который расширит свойства базового фасада, возвращающего свойство name после его разрешения. Это свойство name будет иметь тип string и будет возвращаться каждый раз, когда мы создаем экземпляр класса.

Мы не будем создавать наш фасад, используя обычное соглашение Laravel, где у нас есть файл .php в app > facade, а затем еще один в поставщиках, прежде чем мы зарегистрируем его в config > app.

Вместо этого мы обойдемся без web.php внутри маршрутов для этой иллюстрации, так как мы просто пытаемся увидеть, как фасады работают под капотом в типичном приложении Laravel.

Во-первых, давайте начнем с этого в web.php:

<?php 
class Student{
    public function students(){
        return 'Yurii';
    }
}

 app()->bind('student', function(){
 	return new Student;   
 }); 
Мы создали класс Student, и внутри него у нас есть нестатический метод students, который возвращает массив студентов. Затем мы вызываем метод bind, чтобы он всегда создавал экземпляр нового ученика, поэтому нам больше не нужно делать это вручную. Далее, давайте создадим базовый класс фасада, все еще находящийся в том же web.php:

class Facade{
    public static function __callStatic($name, $args){
        return app()->make(static::getFacadeAccessor())->$name();
    }
    
    protected static function getFacadeAccessor(){
        // тут переопределение
    }
} 
Любой фасад, который мы могли бы создать позже, будет расширять свойства этого базового фасада.

В классе Facade у нас есть магический метод __callStatic, который помогает нам разрешить static::getFacadeAccessor() из контейнера с приложением()->make(). И с их помощью мы можем получить доступ к свойству $name.

class StudentFacade extends Facade {
	protected static function getFacadeAccessor(){
    	return 'student';
    }
} 
Здесь StudentFacade наследует свойства базового фасада. Затем мы переопределяем getFacadeAccessor() и устанавливаем возвращаемое значение таким, какое у нас есть каждый раз, когда мы создаем экземпляр в привязке выше student. StudentFacade::students(); // " Yurii "

Когда мы пытаемся назвать фасад, который мы создали, он возвращает " Yurii ", как и ожидалось. Теперь на заключительном этапе мы должны объединить все эти шаги:

<?php

class Student{
    public function students(){
        return ' Yurii ';
    }
}

 app()->bind('student', function(){
    return new Student;   
 }); 
 
 
 class Facade{
    public static function __callStatic($name, $args){
        return app()->make(static::getFacadeAccessor())->$name();
    }
    
    protected static function getFacadeAccessor(){
        //тут переопределение 
    }
}

class StudentFacade extends Facade {
    protected static function getFacadeAccessor(){
        return 'student';
    }
}

//Логируем или просто выходим
die(StudentFacade::students()); 
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, уроки по Laravel, фасады, php




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Взаимодействие и синхронизация потоков
Поиск вируса на сайте
Ю. Пахолков - AI Factory's Chess, уровень 7, 21 февраля 2019