glaphire
@glaphire
PHP developer

Как абстрагировать аргумент конструктора при таком подходе?

Столкнулась с ситуацией, когда хочется избежать говнокода, но не знаю как.

Есть пакет Laravel JSON API, есть его документация. Есть классы адаптеров, которые связываются с моделями приложения. В конструкторе указываются стратегии пагинации и классы моделей. Из-за того, что классы моделей задаются инстанциированием внутри конструктора, я не могу вынести метод конструктора в абстрактный класс, чтобы пагинация была везде одинаковая. Не могу писать в абстрактном классе такое, потому что ларавеловская Model - тоже абстрактный класс.
public function __construct(CursorStrategy $paging)
 {
        parent::__construct(new Model(), $paging);
 }

Есть ли способ это отрефакторить такое?

Документация
: Cursor-Based Pagination

Пример кода из документации, который демонстрирует проблему:
namespace App\JsonApi\Comments;

use App\Comment;
use CloudCreativity\LaravelJsonApi\Pagination\CursorStrategy;
use CloudCreativity\LaravelJsonApi\Eloquent\AbstractAdapter;

class Adapter extends AbstractAdapter
{

    /**
     * @param CursorStrategy $paging
     */
    public function __construct(CursorStrategy $paging)
    {
        parent::__construct(new Post(), $paging);
    }

    // ...
}
  • Вопрос задан
  • 212 просмотров
Решения вопроса 1
BoShurik
@BoShurik
Symfony developer
Если я правильно понял, то
abstract class AbstractAdapter extends \CloudCreativity\LaravelJsonApi\Eloquent\AbstractAdapter
{
    public function __construct(CursorStrategy $paging)
    {
        parent::__construct($this->getModelInstance(), $paging);
    }

    abstract protected function getModelInstance();

    // ...
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
myks92
@myks92 Куратор тега PHP
Нашёл решение — пометь вопрос ответом!
Я, конечно, слабо знаком с Laravel, но наследование мне не очень нравится. Лучше использовать DI. Поэтому, чтобы не наследоваться от классов фреймворка - просто не наследуйтесь от них) Вот так просто) Создайте свои классы и уже к ним подключите Laravel. Тогда и фреймворконезависимость увеличится. А реализацию настраивайте через DI. У адаптеров может быть метод support, который проверяет поддержку адаптера.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽