ru
Feedback
PHP | Вопросы собесов

PHP | Вопросы собесов

Открыть в Telegram
2 345
Подписчики
+124 часа
Нет данных7 дней
-2330 день
Архив постов
🤔 Что такое алгоритмическая сложность? Алгоритмическая сложность описывает эффективность алгоритма в зависимости от объёма входных данных. Измеряется во времени выполнения (Time Complexity) и потреблении памяти (Space Complexity). Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Расскажи про фабрики Это шаблон проектирования, который относится к порождающим шаблонам и используется для создания объектов без необходимости указывать точный класс создаваемого объекта. Основная идея фабрики заключается в том, чтобы делегировать создание объектов специальному классу или методу, что упрощает управление кодом и позволяет добиться большей гибкости и расширяемости. 🚩Зачем нужны фабрики? 🟠Инкапсуляция процесса создания объектов Если создание объекта требует сложной логики или конфигурации, фабрика позволяет скрыть эту сложность от остальной части кода. 🟠Снижение зависимости от конкретных классов Вы используете интерфейсы или абстрактные классы вместо конкретных реализаций. Это упрощает замену одного типа объекта на другой. 🟠Гибкость и расширяемость Фабрики позволяют добавлять новые классы без изменения существующего кода. 🚩Типы фабрик 🟠Простая фабрика (Simple Factory) Это метод, который возвращает объект одного из нескольких возможных классов в зависимости от переданных параметров.
   class ShapeFactory {
       public static function createShape(string $type) {
           return match ($type) {
               'circle' => new Circle(),
               'square' => new Square(),
               default => throw new Exception("Unknown shape type"),
           };
       }
   }

   $circle = ShapeFactory::createShape('circle'); // Возвращает объект Circle
   
🟠Фабричный метод (Factory Method) В этом шаблоне создание объекта делегируется подклассам. Основной класс определяет интерфейс для создания объектов, но сам не знает, какие конкретные классы будут созданы.
   interface Logger {
       public function log(string $message);
   }

   class FileLogger implements Logger {
       public function log(string $message) {
           echo "Logging to a file: $message";
       }
   }

   class DatabaseLogger implements Logger {
       public function log(string $message) {
           echo "Logging to a database: $message";
       }
   }

   abstract class LoggerFactory {
       abstract public function createLogger(): Logger;
   }

   class FileLoggerFactory extends LoggerFactory {
       public function createLogger(): Logger {
           return new FileLogger();
       }
   }

   $factory = new FileLoggerFactory();
   $logger = $factory->createLogger();
   $logger->log("Hello World");
   
🟠Абстрактная фабрика (Abstract Factory) Этот шаблон используется для создания семейств взаимосвязанных объектов.
   interface GUIFactory {
       public function createButton(): Button;
       public function createCheckbox(): Checkbox;
   }

   class WindowsFactory implements GUIFactory {
       public function createButton(): Button {
           return new WindowsButton();
       }
       public function createCheckbox(): Checkbox {
           return new WindowsCheckbox();
       }
   }

   class MacOSFactory implements GUIFactory {
       public function createButton(): Button {
           return new MacOSButton();
       }
       public function createCheckbox(): Checkbox {
           return new MacOSCheckbox();
       }
   }

   $factory = new WindowsFactory();
   $button = $factory->createButton();
   $checkbox = $factory->createCheckbox();
   
🚩Как использовать фабрики? Если вы работаете с приложением, где объекты часто меняются, например, в зависимости от окружения (Windows, MacOS). Когда создание объектов сложное и требует дополнительной логики. Когда нужно уменьшить зависимость между модулями. Ставь 👍 и забирай 📚 Базу знаний

🤔 Как устроен Git? Это распределенная система контроля версий, работающая на основе графа коммитов и хранения изменений через хеши (SHA-1). 1. Объектная модель: - Commit – снимок состояния проекта. - Tree – каталог файлов в коммите. - Blob – сами файлы (содержимое). 2. Система ссылок (HEAD, branches, tags). 3. Механизм staging (индексация изменений) перед коммитом. 4. Быстрая работа за счет хранения только изменений (deltas) и поддержки локального репозитория. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Имеет ли значение регистр заголовка? Значение регистра заголовков может варьироваться в зависимости от конкретного контекста или системы разметки, в которой используются заголовки. Рассмотрим несколько примеров, чтобы понять, как различные системы относятся к регистру заголовков. 🚩HTML Регистр заголовков не имеет значения. Теги HTML не чувствительны к регистру, поэтому <H1>Заголовок</H1> и <h1>Заголовок</h1> будут интерпретироваться одинаково.
<h1>Заголовок</h1>
<H1>Заголовок</H1>
🚩Markdown Регистр заголовков также не имеет значения для самой разметки, но обычно принято использовать заглавные буквы для первых букв слов в заголовках, чтобы улучшить читаемость.
# Заголовок
# заголовок
🚩LaTeX Регистр заголовков тоже не имеет значения с точки зрения разметки, но стандартной практикой является использование заглавных букв в начале каждого важного слова для улучшения читаемости.
\section{Заголовок}
\section{заголовок}
🚩Wiki-разметка (например, MediaWiki) Регистр заголовков не влияет на разметку, но для консистентности и лучшей читаемости заголовки часто оформляют с заглавными буквами
= Заголовок =
= заголовок =
🚩Языки программирования Как таковые не используются, но комментарии-заголовки могут быть оформлены по-разному. Регистр здесь также не имеет значения для компилятора или интерпретатора, но для людей, читающих код, использование заглавных букв может сделать заголовки более заметными
# ЗАГОЛОВОК УРОВНЯ 1
# заголовок уровня 1
Оба варианта являются допустимыми комментариями
// ЗАГОЛОВОК УРОВНЯ 1
// заголовок уровня 1
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что известно о MVC? Это архитектурный шаблон, который разделяет приложение на три компонента: 1. Model: управляет данными и бизнес-логикой. 2. View: отвечает за отображение данных пользователю. 3. Controller: обрабатывает пользовательский ввод, связывает Model и View. Это разделение упрощает разработку, тестирование и поддержку приложения. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое полнотекстовый индекс? Это специализированный тип индекса, используемый для эффективного поиска текста в больших текстовых полях. Он позволяет быстро находить строки, содержащие определённые слова или фразы, в отличие от стандартных индексов, которые работают с точными совпадениями. 🚩Зачем нужен полнотекстовый индекс? Полнотекстовый индекс предназначен для поиска и обработки текстовой информации, особенно в больших текстовых данных. Это необходимо, когда требуется: Искать слова или фразы внутри длинных текстовых полей. Находить записи, которые соответствуют похожим по смыслу запросам, а не только точным совпадениям. Обеспечивать более быстрый и релевантный поиск по сравнению с простым перебором данных. 🚩Как работает полнотекстовый индекс? 🟠Индексация Когда создаётся полнотекстовый индекс, база данных анализирует текстовые данные, разбивает их на слова (токены) и сохраняет их в особой структуре индекса. 🟠Поиск При выполнении запроса база данных ищет совпадения среди токенов в индексе, а не в самом тексте. 🟠Релевантность Полнотекстовый индекс учитывает частоту появления слов и их позицию, чтобы выдавать результаты, наиболее соответствующие запросу. 🚩Использование полнотекстового индекса в MySQL 🟠Создание полнотекстового индекса Полнотекстовый индекс можно создавать для столбцов типа CHAR, VARCHAR, или TEXT.
CREATE TABLE articles (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255),
    content TEXT,
    FULLTEXT(title, content)
);
🟠Поиск с использованием полнотекстового индекса Для выполнения полнотекстового поиска используется оператор MATCH ... AGAINST.
SELECT * 
FROM articles
WHERE MATCH(title, content) AGAINST('PHP tutorial');
🟠Модели поиска Natural Language Mode: Поиск слов и фраз с учётом их важности. Boolean Mode: Позволяет использовать логические операторы (например, + для обязательных слов, - для исключаемых). Query Expansion: Автоматически расширяет запрос с помощью синонимов или связанных слов.
SELECT * 
FROM articles
WHERE MATCH(title, content) AGAINST('+PHP -Java' IN BOOLEAN MODE);
🚩Ограничения полнотекстового индекса 🟠Минимальная длина слова По умолчанию слова короче 3 символов игнорируются (это настраивается). 🟠Стоп-слова Некоторые часто встречающиеся слова (например, "and", "the") исключаются из индексации. 🟠Чувствительность к языку Важно учитывать настройки языка для анализа текста. 🟠Поддержка типов данных Полнотекстовые индексы доступны только для текстовых полей. 🚩Плюсы ➕Быстрый поиск по большим объемам текста. ➕Удобная работа с нерелевантными данными (например, похожими словами). ➕Возможность вычисления ранжирования (релевантности) результатов. Ставь 👍 и забирай 📚 Базу знаний

🤔 Зачем нужен шаблон Builder? Шаблон Builder (Строитель) применяется для поэтапного создания сложных объектов. Он нужен, когда: - Объект имеет много параметров, инициализация которых может быть сложной. - Объект должен создаваться в разных конфигурациях, не загромождая конструктор. - Код становится более читаемым, так как отделяется процесс создания от структуры объекта. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Для чего используется индексация и что это такое? Индексация — это механизм в базах данных, который ускоряет поиск данных в таблицах. Индекс работает как оглавление книги: вместо того чтобы просматривать всю таблицу, база находит нужные данные по индексу. 🚩Зачем нужна индексация? Ускоряет поиск (SELECT) – база данных быстрее находит нужные строки. Ускоряет сортировку (ORDER BY) – индексы помогают быстрее упорядочивать данные. Оптимизирует соединения таблиц (JOIN). Замедляют операции INSERT, UPDATE, DELETE (так как индекс тоже нужно обновлять). Индексы занимают дополнительное место в памяти. 🚩Пример индекса в SQL 1⃣Создание индекса
CREATE INDEX idx_users_name ON users(name);
Теперь поиск по name будет быстрее
SELECT * FROM users WHERE name = 'Alice';
🚩Типы индексов 🟠Обычный (B-Tree) индекс Основной вид индекса, который ускоряет поиск по WHERE.
CREATE INDEX idx_name ON users(name);
🟠UNIQUE-индекс Гарантирует, что значения в колонке не будут повторяться.
CREATE UNIQUE INDEX idx_email ON users(email);
🟠FULLTEXT-индекс Используется для быстрого поиска по тексту.
CREATE FULLTEXT INDEX idx_text ON articles(content);
🟠Composite (Составной) индекс Индекс сразу на несколько колонок (например, name + age).
CREATE INDEX idx_name_age ON users(name, age);
Ставь 👍 и забирай 📚 Базу знаний

🤔 Какие структуры данных в программировании существуют? Основные структуры: - Линейные: массивы, списки, очереди, стеки. - Нелинейные: деревья, графы. - Ассоциативные: хеш-таблицы, словари. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Как сделать так, чтобы приложение разворачивалось быстрее в Docker`е? При развёртывании приложения в Docker важно минимизировать время сборки и оптимизировать слои контейнера. 🟠Использовать `.dockerignore` Не копировать лишние файлы в контейнер (например, node_modules, .git, vendor, .env).
.git
node_modules
vendor
.env
*.log
🟠Оптимизировать `Dockerfile` (Меньше слоёв, кэширование) Плохо (лишние слои, без кэширования)
FROM php:8.2-cli

WORKDIR /app

COPY . .      # Копирует ВСЕ файлы (долго и некэшируемо)
RUN composer install
RUN npm install
RUN npm run build
Хорошо (разделение слоёв, кэширование)
FROM php:8.2-cli

WORKDIR /app

COPY composer.json composer.lock ./
RUN composer install --no-dev --prefer-dist # Используем кэширование слоёв

COPY package.json package-lock.json ./
RUN npm install --only=production && npm cache clean --force

COPY . . # Копируем код ПОСЛЕ установки зависимостей (чтобы кэширование работало)
RUN npm run build
🟠Использовать `multi-stage builds` (если контейнер весит много) Позволяет уменьшить размер конечного образа, убрав ненужные файлы и инструменты.
# 1-й этап: сборка зависимостей (Node.js)
FROM node:18 as frontend
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
RUN npm run build

# 2-й этап: финальный образ
FROM php:8.2-cli
WORKDIR /app
COPY --from=frontend /app/dist /app/public # Берём только готовые файлы
COPY . .
CMD ["php", "artisan", "serve", "--host=0.0.0.0"]
🟠Использовать `docker build --cache-from` Позволяет использовать кеш из предыдущих сборок.
docker build --cache-from=myapp:latest -t myapp .
🟠Оптимизировать `docker-compose` (если используется) Перенести volume для vendor и node_modules на хост, чтобы не скачивать их в контейнере.
services:
  app:
    build: .
    volumes:
      - .:/app
      - /app/vendor  # Чтобы composer install не запускался каждый раз
      - /app/node_modules # Чтобы npm install не замедлял перезапуск
🟠Использовать `Alpine Linux` (если важен размер образа) Alpine – лёгкая версия Linux (~5 MB), подходит для PHP, Nginx, Node.js.
FROM php:8.2-fpm-alpine
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое динамическая типизация Динамическая типизация — это свойство языка программирования, где тип переменной определяется во время выполнения, а не во время компиляции. Это позволяет использовать одну переменную для хранения данных разных типов, упрощая код, но также увеличивая вероятность ошибок, так как проверки типов происходят в процессе выполнения. Языки с динамической типизацией, такие как Python и JavaScript, предлагают большую гибкость, но требуют внимательности при работе с типами. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое абстрагирование? Это принцип программирования и проектирования, который позволяет выделить важные характеристики объекта или системы и скрыть их сложные детали. Основная цель абстрагирования – упростить сложные системы, делая их более понятными и управляемыми, сосредоточив внимание на их основных аспектах и поведении. 🚩Зачем нужно абстрагирование 🟠Снижение сложности Сокращает количество деталей, с которыми нужно работать, что облегчает понимание и работу с системой. 🟠Повышение читаемости кода Упрощает код, делая его более читаемым и легким для поддержки. 🟠Повторное использование кода Создаёт возможность повторного использования общих функций и логики. 🟠Инкапсуляция Позволяет скрывать реализацию и представлять только необходимые интерфейсы для взаимодействия. 🟠Гибкость и расширяемость Облегчает добавление новых функциональностей без изменения существующего кода. 🚩Как используется абстрагирование Абстрагирование в программировании часто реализуется через классы и интерфейсы. Ниже приведены примеры абстракции в объектно-ориентированном программировании (ООП). 🚩Пример абстракции с использованием классов и интерфейсов 🟠Интерфейс Определяет набор методов, которые должны быть реализованы, не указывая, как именно они должны быть реализованы.
interface Shape {
    public function draw();
}
🟠Классы, реализующие интерфейс Реализуют методы, определённые в интерфейсе.
class Circle implements Shape {
    public function draw() {
        echo "Drawing a circle";
    }
}

class Square implements Shape {
    public function draw() {
        echo "Drawing a square";
    }
}
Использование абстракции
function renderShape(Shape $shape) {
    $shape->draw();
}

$circle = new Circle();
$square = new Square();

renderShape($circle); // Вывод: Drawing a circle
renderShape($square); // Вывод: Drawing a square
🚩Плюсы и минусы ➕Снижение сложности Абстракция скрывает сложные детали реализации, облегчая работу с системой. ➕Улучшение читаемости Код становится более понятным и структурированным. ➕Гибкость и расширяемость Облегчает добавление новых функций и изменений. ➕Повторное использование Позволяет использовать общий код в разных частях программы. ➖Избыточность Иногда может приводить к избыточной сложности, если абстракции слишком сложные или используются неправильно. ➖Накладные расходы Может потребоваться больше времени и усилий на создание абстракций и их поддержку. Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое интерфейсы? Интерфейсы в PHP определяют набор методов, которые должны быть реализованы в классах, использующих этот интерфейс. Интерфейсы обеспечивают абстракцию, позволяя разработчикам определять общий функционал для классов, не предоставляя реализации методов. Классы могут реализовывать несколько интерфейсов, что делает их гибким инструментом для организации архитектуры кода. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Как устроен типичный тест на opening point? Тест на Opening Point (OP-тест) используется для проверки скорости, с которой игрок или программа находят критически важное первое решение в задаче. Такой тест чаще всего применяется в шахматах, игровых стратегиях, а также в программировании при оценке эвристик. 🚩Как устроен тест на Opening Point? 🟠Задаётся начальная позиция или состояние Например, шахматная позиция, игровая ситуация или входные данные для алгоритма. 🟠Требуется найти оптимальный (или хороший) первый шаг В шахматах это может быть лучший ход. В алгоритмах — первое удачное разбиение задачи. 🟠Замеряется время и корректность ответа Важно, насколько быстро испытуемый (или программа) нашёл первый ход. Проверяется, соответствует ли он эталону (оптимальному решению). 🚩Пример из шахмат В шахматах Opening Point тест оценивает, насколько быстро игрок или движок могут найти правильный ход в дебюте. Например: > Позиция: > 1. e4 e5 > 2. Nf3 Nc6 > 3. Bb5 a6 > 4. ? Ожидаемый ход: Ba4 (Испанская партия). Программа должна как можно быстрее выбрать этот ход, а тест фиксирует время поиска. 🚩Пример из программирования Допустим, у нас есть массив чисел, и нужно быстро найти первый элемент, который удовлетворяет определённому условию.
function findOpeningPoint($arr, $condition) {
    foreach ($arr as $item) {
        if ($condition($item)) {
            return $item;
        }
    }
    return null; // Если не найдено
}

$array = [1, 3, 7, 10, 15];
$condition = fn($x) => $x > 5;

echo findOpeningPoint($array, $condition); // Выведет 7
Ставь 👍 и забирай 📚 Базу знаний

🤔 Какие типы БД бывают? Базы данных делятся на реляционные (SQL) и нереляционные (NoSQL). Реляционные базы данных (например, MySQL, PostgreSQL) хранят данные в виде таблиц и используют SQL для запросов. Нереляционные базы данных (например, MongoDB) используют разные модели данных (документы, ключ-значение и т.д.), что делает их более гибкими для работы с большими объёмами данных и неструктурированной информацией. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Зачем придумали анонимные классы? Анонимные классы в PHP были введены в версии 7.0 и позволяют создавать одноразовые объекты без необходимости предварительного объявления класса. Они имеют несколько преимуществ и предназначены для решения ряда задач в программировании. Вот основные причины и случаи, для которых они были придуманы: 🚩Зачем придумали анонимные классы 🟠Упрощение кода Анонимные классы позволяют создать класс на месте, в том же файле, где он используется, без необходимости его предварительного определения. Это упрощает и сокращает код, особенно для одноразовых задач.
$logger = new class {
public function log($message) {
echo $message;
}
};

$logger->log("Hello, World!"); // Выведет: Hello, World!
🟠Инкапсуляция и уменьшение загрязнения пространства имен Поскольку анонимные классы не имеют имен, они не добавляют новых имен в глобальное пространство имен, что помогает избежать конфликтов имен и делает код более чистым. 🟠Использование одноразовых объектов Анонимные классы удобны, когда нужно создать объект для одноразового использования, например, в тестах, или для передачи в функции или методы.
function handleRequest($handler) {
$handler->process();
}

handleRequest(new class {
public function process() {
echo "Processing request";
}
}); // Выведет: Processing request
🟠Более гибкая реализация интерфейсов и абстрактных классов: Анонимные классы могут реализовывать интерфейсы или наследовать от абстрактных классов, предоставляя быстрый способ создать конкретные реализации на месте.
interface Logger {
public function log($message);
}

$logger = new class implements Logger {
public function log($message) {
echo $message;
}
};

$logger->log("Logging message"); // Выведет: Logging message
🟠Улучшение тестирования В юнит-тестах анонимные классы позволяют быстро создавать мок-объекты (mock objects) для тестирования без необходимости создавать отдельные классы для каждой тестовой ситуации.
class Service {
private $logger;

public function __construct($logger) {
$this->logger = $logger;
}

public function execute() {
$this->logger->log("Service executed");
}
}

$mockLogger = new class {
public function log($message) {
echo "Mock: " . $message;
}
};

$service = new Service($mockLogger);
$service->execute(); // Выведет: Mock: Service executed
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое блокировки и зачем они? Это механизм синхронизации доступа к данным, предотвращающий одновременное изменение записей. 1. Они используются для обеспечения целостности данных в многопользовательских системах. 2. Различают уровни блокировок: строковые, табличные и на уровне транзакций. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какие могут быть проблемы от Join'а? Использование JOIN в SQL может привести к нескольким проблемам, особенно при работе с большими таблицами. Рассмотрим основные из них. 🟠Производительность (нагрузка на БД) Чем больше данных соединяется, тем больше ресурсов требуется. Проблема: JOIN создаёт временную таблицу в памяти, что замедляет запрос. Если нет индексов, соединение идёт через полный перебор (Nested Loop Join), что очень медленно. Решение: Добавить индексы на поля, по которым идёт соединение. Использовать EXPLAIN для анализа запроса.
EXPLAIN SELECT * FROM users JOIN orders ON users.id = orders.user_id;
🟠Дублирование строк (Картезианское произведение) Если используется JOIN, но нет условия соединения (ON), запрос создаст все возможные комбинации строк. Проблема:
SELECT * FROM users, orders;
Решение Всегда указывать ON или USING:
SELECT * FROM users JOIN orders ON users.id = orders.user_id;
🟠Потеря данных при `INNER JOIN` INNER JOIN возвращает только совпадающие строки, из-за чего можно потерять данные. Проблема
SELECT users.id, users.name, orders.id AS order_id  
FROM users  
INNER JOIN orders ON users.id = orders.user_id;
Решение: Использовать LEFT JOIN, если нужны все пользователи, даже без заказов:
SELECT users.id, users.name, orders.id AS order_id  
FROM users  
LEFT JOIN orders ON users.id = orders.user_id;
🟠Медленный `JOIN` на `TEXT` или `VARCHAR` JOIN по строковым полям (VARCHAR, TEXT) работает медленнее, чем по числовым (INT). Проблема
SELECT * FROM users JOIN orders ON users.email = orders.email;
🟠Несовместимость типов данных Если соединяются таблицы с разными типами данных (INT vs VARCHAR), может быть скрытое приведение типов, которое замедляет запрос. Проблема
SELECT * FROM users  
JOIN orders ON users.id = orders.user_id;  
Решение - Убедиться, что типы данных совпадают (INT = INT). - Привести к нужному типу:
SELECT * FROM users  
JOIN orders ON users.id = CAST(orders.user_id AS INT);
Ставь 👍 и забирай 📚 Базу знаний

🤔 Какие паттерны знаешь? В программировании и разработке ПО существует множество паттернов проектирования, включая: - Порождающие: Singleton, Factory, Builder, Prototype. - Структурные: Adapter, Decorator, Facade, Proxy, Bridge. - Поведенческие: Observer, Strategy, Command, State, Template Method, Iterator, Mediator. Эти паттерны помогают решать общие проблемы проектирования, повышая уровень абстракции и уменьшая связность компонентов? Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое middleware? Это ПО, которое располагается между веб-сервером и приложением. Оно обрабатывает входящие запросы до того, как они достигнут вашего приложения, или обрабатывает исходящие ответы после того, как приложение их сгенерировало. 🚩Зачем нужен Middleware 🟠Управление запросами Может изменять или проверять запросы перед передачей их в приложение. Например, оно может проверять наличие валидных токенов доступа для аутентификации или осуществлять проверку прав доступа. 🟠Перехват ответов Также может изменять ответы перед тем, как они будут отправлены пользователю, например, добавлять нужные заголовки HTTP или сжимать данные. 🟠Логирование и мониторинг Оно может записывать информацию о запросах и ответах для анализа трафика или обнаружения ошибок. 🟠Обработка ошибок Часто используется для централизованной обработки ошибок, позволяя управлять ошибками элегантно и единообразно.
namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class CheckAuthenticated
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (!Auth::check()) {
            return redirect('/login');
        }

        return $next($request);
    }
}
Ставь 👍 и забирай 📚 Базу знаний