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);
    }

    // ...
}
  • Вопрос задан
  • 213 просмотров
Решения вопроса 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, который проверяет поддержку адаптера.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы