Как лучше спроектировать класс?

Приветствую. Работаю над проектов в Laravel. У меня имеется вспомогательный класс, который делатет некоторую работу с данными, а также работает с БД (с помощью ORM-модели). Сейчас я реализовал вспомогательный класс примерно так:

Вспомогательный класс:
class MyHelperClass
{
    private $model;
    private $data;

    /**
     * @param $data
     * @param SpecificModel $model
     */
    public function __construct($data, SpecificModel $model)
    {
        $this->model = $model;
        $this->data = $data;
    }

    public function doWork()
    {
        $concreteModel = $this->model->find(123);
        $concreteModel2 = $this->model->find(456);

        // какой то код, работающий с моделью...

        $concreteModel->save();
        $concreteModel2->delete();
    }
}


Где-то в коде:
// SpecificModel - ORM модель
$helper = new MyHelperClass([1, 2, 3, 4], new SpecificModel());
$helper->doWork();


Нормальный ли это подход:? Или можно создавать объект прямо в хелпере без передачи его как аргумент конструктора?
  • Вопрос задан
  • 744 просмотра
Пригласить эксперта
Ответы на вопрос 2
AmdY
@AmdY
PHP и прочие вебштучки
Создавать сервис(хелпер) напрямую это не лучший подход, инджекть его в метод-экшен. DI создаст и сам хелпер и заинджектит в него SpecificModel, и при тестировании мокать будете без проблем.
class FooController {
    public function getIndex(\MyHelperClass $helper) {
        $helper->doWork([1, 2, 3, 4]);
    }
}
Ответ написан
dmitriylanets
@dmitriylanets
веб-разработчик
да, нормальный подход из принципа SOLID (в вашем случае принцип инверсии зависимостей D). когда будите тестировать MyHelperClass вы создадите тестируемый объект максимально изолированно от других классов
$this->object = new MyHelperClass([1, 2, 3, 4], $mosk);

объект $mosk будет возвращать заранее подготовленный результат
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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