Изменение механизма выдачи товаров

Введение

За выдачу товаров игроку в L-Shop отвечают, так называемые, дистрибьюторы (Distributor). По сути, дистрибьютор - это класс, который инкапсулирует логику выдачи. Каждый такой класс должен реализовывать интерфейс App\Services\Purchasing\Distributors\Distributor.

Ход

Для того, чтобы реализовать механизм, отличный от стандартных вам необходимо:

  • Создать класс и имплементировать интерфейс App\Services\Purchasing\Distributors\Distributor.

  • Написать реализацию метода distribute(). Этот метод принимает объект типа App\Entity\Distribution который представляет сущность, выдаваемую игроку.

/app/Services/Purchasing/Distributors/CustomDistributor.php
<?php
declare(strict_types = 1);

namespace App\Services\Purchasing\Distributors;

use App\Entity\Distribution;

class CustomDistributor implements Distributor
{
    /**
     * {@inheritdoc}
     */
    public function distribute(Distribution $distribution): void
    {
        // Логика выдачи товаров.
    }
}
  • Если ваша реализация дистрибьютора подразумевает возможность ручной выдачи (примером такого может служить встроенный App\Services\Purchasing\Distributors\RconDistributor), класс дистрибьютора должен так же имплементировать интерфейс App\Services\Purchasing\Distributors\Attempting, у которого отсутствуют методы. Интерфейс является своеобразным маркером.

  • Зарегистрировать новоиспеченного distributor'а, дабы приложение "узнало" о его существовании.

    • Перейдите в файл /config/purchasing.php .

    • Добавьте полное имя класса нового distributor'а в элемент массива distribution.distributors.

/config/purchasing.php
'distributors' => [
    // Builtin distributors...
    \App\Services\Purchasing\Distributors\ShoppingCartDistributor::class,
    \App\Services\Purchasing\Distributors\RconDistributor::class,
    
    // Custom distributors...
    \App\Services\Purchasing\Distributors\CustomDistributor::class
],
  • Сбросьте кэш приложения, дабы новая конфигурация закэшировалась.

Спецификация

Ключевые слова "ДОЛЖЕН”, “НЕ ДОЛЖЕН”, “ ТРЕБУЕТСЯ”, “СЛЕДУЕТ”, “НЕ СЛЕДУЕТ”, “РЕКОМЕНДУЕТСЯ”, “МОЖЕТ” должны интерпретироваться так же, как описано в RFC 2119.

  • Класс дистрибьютора ДОЛЖЕН реализовывать интерфейсApp\Services\Purchasing\Distributors\Distributor.

  • Класс дистрибьютора МОЖЕТ реализовывать интерфейс App\Services\Purchasing\Distributors\Attempting в случае, если реализация дистрибьютора подразумевает возможность ручной выдачи товаров игроку.

  • РЕКОМЕНДУЕТСЯ добавлять к имени класса суффикс Distributor, дабы класс дистрибьютора можно было идентифицировать по названию.

  • РЕКОМЕНДУЕТСЯ помещать дистрибьюторы в неймспейс App\Services\Purchasing\Distributors.

  • Реализация метода distribute() ДОЛЖНА содержать логику выдачи товаров игроку.

  • В случае возникновения ошибки, которую дистрибьютор не в состоянии обработать самостоятельно, необходимо выбросить исключение типа App\Exceptions\Distributor\DistributionException.

Last updated