Чистый код - наименования

В Laravel следуют общепринятым соглашениям о наименовании классов. Вот основные правила:

 

Модели

 

  • Используйте единственное число и капитализацию в стиле CamelCase.
  • Пример: User, Product, OrderItem.
 

Контроллеры

 

  • Используйте множественное число и капитализацию в стиле CamelCase. Добавьте суффикс Controller.
  • Пример: UsersController, ProductsController, OrderItemsController.
 

Другие классы

 

  • Middleware: Используйте капитализацию в стиле CamelCase.
  • Пример: Authenticate, RedirectIfAuthenticated.

 

  • Запросы (Form Requests): Используйте капитализацию в стиле CamelCase, часто добавляя суффикс Request.
  • Пример: StoreUserRequest, UpdateProductRequest.

 

  • События: Используйте капитализацию в стиле CamelCase.
  • Пример: UserRegistered, OrderShipped.

 

  • Слушатели: Используйте капитализацию в стиле CamelCase.
  • Пример: SendWelcomeEmail, LogOrderShipment.

 

  • Сервисы: Используйте капитализацию в стиле CamelCase.
  • Пример: PaymentService, NotificationService.
 

Рекомендации

 

  • CamelCase: Начинайте каждое новое слово с заглавной буквы.
  • Единообразие: Следуйте единым правилам наименования в проекте.
  • Семантика: Названия классов должны четко отражать их назначение.
Опубликовано 21.01.2025
Laravel

Заметка - кеширование

Через фасад Cache можно быстренько что-нибудь записать

Cache::remember("user_data_{$this->user->id}", 60, function() {
    return UserData::with(['user:id,second_name,name,phone'])
        ->where('user_id', $this->user->id)
        ->firstOrFail();
});
Опубликовано 21.01.2025
Laravel Оптимизация

Абстракции - что и для чего?

Абстрактные классы в PHP используются для создания базовых классов, которые не могут быть инстанцированы напрямую, но могут содержать как реализованные методы, так и абстрактные методы, которые должны быть реализованы в классах-наследниках.

Зачем нужны абстрактные классы:

  1. Обеспечение общей функциональности: Абстрактные классы позволяют определить общие методы и свойства, которые будут использоваться в классах-наследниках.

  2. Шаблон для наследования: Они служат шаблоном для других классов, обеспечивая структуру, которую необходимо следовать.

  3. Кодовая консистентность: Способствуют поддержанию единообразия кода, заставляя все классы-наследники реализовывать определенные методы.

Пример использования абстрактного класса в PHP + Laravel:

Создание абстрактного класса:

abstract class PaymentProcessor
{
    protected $amount;

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

    // Общий метод
    public function process()
    {
        $this->validate();
        $this->pay();
        $this->sendReceipt();
    }

    // Абстрактный метод
    abstract protected function pay();

    // Реализованный метод
    protected function validate()
    {
        if ($this->amount <= 0) {
            throw new InvalidArgumentException('Amount must be positive.');
        }
    }

    protected function sendReceipt()
    {
        // Логика отправки квитанции
        echo "Receipt sent for amount: $this->amount\n";
    }
}

 

Реализация конкретного процессора:

class StripePaymentProcessor extends PaymentProcessor
{
    protected function pay()
    {
        // Логика оплаты через Stripe
        echo "Processing payment of $this->amount through Stripe.\n";
    }
}

class PaypalPaymentProcessor extends PaymentProcessor
{
    protected function pay()
    {
        // Логика оплаты через PayPal
        echo "Processing payment of $this->amount through PayPal.\n";
    }
}

 

Использование в Laravel:

public function processPayment($amount, $method)
{
    switch ($method) {
        case 'stripe':
            $processor = new StripePaymentProcessor($amount);
            break;
        case 'paypal':
            $processor = new PaypalPaymentProcessor($amount);
            break;
        default:
            throw new InvalidArgumentException('Unsupported payment method.');
    }

    $processor->process();
}

Преимущества:

  • Кодовая организация: Абстрактные классы помогают организовать код, делая его более модульным и поддерживаемым.

  • Повторное использование кода: Общие методы могут быть реализованы один раз в абстрактном классе и повторно использоваться в наследниках.

  • Гибкость: Легко добавлять новые классы-наследники с минимальными изменениями в коде.

Абстрактные классы — это мощный инструмент для создания гибкой и расширяемой архитектуры приложений в Laravel.

Абстрактные классы и интерфейсы в PHP могут работать вместе, чтобы обеспечить гибкость и строгость в проектировании приложений.

Как это работает:

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

  2. Абстрактные классы могут содержать как реализованные методы, так и абстрактные методы, которые должны быть реализованы в классах-наследниках.

Пример использования абстрактных классов и интерфейсов в PHP + Laravel:

Создание интерфейса:

interface PaymentInterface
{
    public function pay();
    public function refund();
}

 

Создание абстрактного класса:

abstract class PaymentProcessor implements PaymentInterface
{
    protected $amount;

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

    // Общий метод
    public function process()
    {
        $this->validate();
        $this->pay();
        $this->sendReceipt();
    }

    // Реализованный метод
    protected function validate()
    {
        if ($this->amount <= 0) {
            throw new InvalidArgumentException('Amount must be positive.');
        }
    }

    protected function sendReceipt()
    {
        echo "Receipt sent for amount: $this->amount\n";
    }

    // Абстрактные методы из интерфейса
    abstract public function pay();
    abstract public function refund();
}

 

Реализация конкретного процессора:

class StripePaymentProcessor extends PaymentProcessor
{
    public function pay()
    {
        echo "Processing payment of $this->amount through Stripe.\n";
    }

    public function refund()
    {
        echo "Refunding payment of $this->amount through Stripe.\n";
    }
}

class PaypalPaymentProcessor extends PaymentProcessor
{
    public function pay()
    {
        echo "Processing payment of $this->amount through PayPal.\n";
    }

    public function refund()
    {
        echo "Refunding payment of $this->amount through PayPal.\n";
    }
}

Преимущества использования:

  • Гибкость: Интерфейсы позволяют различным классам реализовывать одни и те же методы по-разному.

  • Строгость: Абстрактные классы обеспечивают общую реализацию и структуру, которую наследники должны соблюдать.

  • Расширяемость: Легко добавлять новые классы, которые реализуют интерфейс и наследуют абстрактный класс.

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

Опубликовано 21.01.2025
ООП Абстракции