Найти в Дзене
Базовые концепции GraphQL в Laravel
В Laravel из под капота не поддержки работы с GraphQL поэтому для работы с GraphQL в Laravel проекте самым подходящим пакетом будет Lighthouse (Документация: https://lighthouse-php.com/) Устанавливается как и любой пакет в PHP через Composer # Установка пакета composer require nuwave/lighthouse # Публикация конфигурации php artisan vendor:publish --provider="Nuwave\Lighthouse\LighthouseServiceProvider" Типы запроса: Схематика входных и выходных данных: 1. Input - будет использоваться для схематики входных данных Пример: input UserCreateInput { name: String! surname: String! email: String! } 2...
3 месяца назад
GraphQL API. Лучше или хуже чем REST API
GraphQL - это язык запросов для API-интерфейсов и среда, в которой они выполняются. С помощью GraphQL можно получить данные из API и передать их в приложение (от сервера к клиенту). У них есть официальная документация, которая расположена по адреу https://graphql.org/learn/. Данный язык был придуман компанией Facebook чтобы, якобы, исправить ошибки REST API. Facebook видели в REST API следующие недостатки, которые они решили исправить создав GraphQL: Если вы понимаете, что в вашей организации присутствуют данные проблемы, то можете попробовать создать один из новых проектов на GraphQL и, возможно, будет вам счастье...
3 месяца назад
Паттерн DTO (Data Transfer Object)
Data Transfer Object или же DTO или же в переводе на русский язык - "объект передачи данных" - это шаблон проектирования приложения, который позволяет упаковывать все необходимые данные в один экземпляр класса и передавать их в любой участок вашего приложения в удобном виде. Все начинается с проблемы. Допустим мы создаем кусок приложения, который создает кусок пользователя. Для начала мы создаем метод createUser , который будет выглядеть примерно так: public function createUser(string $email, string $password): User { return User::create([ 'email' => $email, 'password' => bcrypt($password) ]); }...
3 месяца назад
Что такое declare(strict_types=1)?
PHP с каждым большим обновлением все больше стримится к строгой типизации. Так вначале пути нельзя было вообще указывать типы (было просто var), потом стало можно указывать типы у аргументов, но нельзя указывать возвращаемый тип. Потом добавили скалярные типы, nullable. Потом типы у свойств классов и так далее. Но несмотря на все это - PHP не является строго типизированным языком, что дает много свободы разработчикам. Директива declare(strict_types=1) показывает интерпретатору то, что в данном файле будет использоваться строгая типизация. Это так сказать "бьет по рукам" неграмотным разработчикам, выдавая ошибки при нарушении типизации...
3 месяца назад
Сервисный слой (Service Layer) на примерах Laravel
Сервисный слой — это архитектурный паттерн, который выносит бизнес-логику из контроллеров в отдельные классы-сервисы. Это помогает: Главное что стоит понимать - это то, что контроллер нужен лишь для того чтобы принять запрос, передать его куда нужно, дождаться ответа и вернуть ответ. То есть в идеале метод контроллера будет выглядить следующим образом: class UserController extends Contoller { public function get(UserRequest $request): JsonResponse { return (new UserGetAction)->handle($request->perPage); } } Контроллеры должны быть тонкими. Представьте, что у вас есть контроллер...
3 месяца назад
Принцип TDD простыми словами
TDD (Test-Driven Development) - это подход к разработке, когда вы сначала пишете тест, а потом код, который делает этот тест успешным. Процесс состоит из 3 шагов, которые называют "Красный-Зеленый-Рефакторинг": Это как ускоряет разработку, так и повышает надежность кода + избавляет от необходимости писать автотесты в дальнейшем. Можно подумать, что разработка, наоборот, затягивается так как помимо написание функционала еще нужно тратить время на написание теста, но на самом деле это не так. В случае если вы пишете функционал, например, какой-то api роут. То написание идет примерно по следующей схеме: 1...
3 месяца назад
Типы данных в PHP
PHP все больше стримится к статической типизации и поэтому знание типов данных в PHP является необходимой базой для каждого разработчика. Разделить типы данных в PHP можно на 3 группы: Если более подробнее, то: 1. INTEGER - целочисленный тип данных. Хранит только числа без запятой в диапазоне от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807. Лимиты могут меняться в зависимости от платформы (32 или 64 бит). Полные лимиты хранятся в константах PHP_INT_MAX и PHP_INT_MIN. Пример: $age = 25; $temperature = -10; $count = 0; $largeNumber = 1_000_000; // PHP 7.4+ Также можно хранить не только десятичные варианты чисел, но и их аналоги в других системах исчисления...
3 месяца назад
Лучшие практики. Laravel
Ниже краткая выборка из статей указанных снизу, с другими примерами. Контроллеры должны только принять запрос и отправить его исполнителю Плохой пример: class UserController extends Controller { public function register(Request $request) { $validated = $request->validate([ 'name' => 'required|string', 'email' => 'required|email|unique:users', 'password' => 'required|min:8', ]); // Создание пользователя $user = new User(); $user->name = $validated['name']; $user->email = $validated['email']; ...
7 месяцев назад
Запахи кода (Code Smells). Примеры на PHP. Часть 1
Code Smells - это признаки некачественного кода, которые по тем или иным причинам приводят к различным проблемам. 1. Длинный метод (Long Method) Метод делает много всего. Из-за этого его сложно: Простой пример: function processOrder(Order $order) { // Валидация заказа if (!$order->isValid()) { throw new Exception("Invalid order"); } // Сохранение в БД $db = new Database(); $db->save($order); // Отправка email $mailer = new Mailer(); $mailer->sendConfirmation($order->getUserEmail(), "Your order is processed!"); // Логирование $logger = new Logger(); $logger->log("Order processed: " ...
7 месяцев назад
SOLID принципы (примеры на PHP)
1. Single Responsibility (Принцип единственной ответственности) 📌 Один класс — одна задача. ❌ Плохо: Класс Order занимается всем: валидацией, сохранением в БД, отправкой email. class Order { public function validate(): bool { /* ... */ } public function save(): void { /* ... */ } public function sendEmail(): void { /* ... */ } } ✅ Хорошо: Разделяем логику на отдельные классы. class OrderValidator { /* ... */ } class OrderRepository { /* ... */ } class OrderNotifier { /* ... */ } 2. Open-Closed (Принцип открытости/закрытости) 📌 Классы должны быть открыты для расширения, но закрыты для изменений...
7 месяцев назад
Аспекты код ревью (пример на PHP)
Часть 1. Аспекты на которые нужно обращать внимание при проведении код-ревью. Все коды ниже только для наглядности проблем. Плохо: public function update($id, $data) { // какой-то код } Хорошо: public function update(int $id, array $data): bool { // какой-то код } 2. Нарушения PSR Плохо: <?php class user_service { public function Create_user($name,$last_name,$Age) { return [ 'id'=>rand(1,1000), 'name'=>$name, 'last_name'=>$last_name, 'age'=>$Age, ]; } public function getUserById($id) { ...
7 месяцев назад