Правильная работа с моделью

1482909

Новичок
Есть модель OrderInfo которая берет данные о заказах, потом эти данные отображаться в виде.
Задача перед тем как отобразить данные, нужно эти данные добавить автоматически, добавление осуществляется средствами API дополнительного сервиса.
Вопрос, правильно ли в модели OrderInfo, подключить класс AddOrders через "use"
в котором логика добавления данных в БД.

PHP:
class OrderInfo extends Model
{
    use AddOrders;
    
    protected $fillable = [
        'order',
        'info'
    ];
}
 

1482909

Новичок
Или необходимо реализовать интерфейс?

PHP:
interface Orders {
    public function add();
}

class OrderInfo extends Model implements Orders
{
    function add()
    {
        // Тут получаем по API данные и вставляем их в БД в таблицу orderinfo
    }

    add(); // Вызываем процесс добавления данных

    protected $fillable = [
        'order',
        'info'
    ];
}
 

fixxxer

К.О.
Партнер клуба
"OrderInfo" - это какая-то странная модель. Что она моделирует?
 

1482909

Новичок
"OrderInfo" - это какая-то странная модель. Что она моделирует?
Хорошо что вы заглянули :)
Да, с именованием у меня то же проблемы.
Модель "OrderInfo" работает с таблицей "orderinfo", и передает содержимое таблицы в вид.
Но мне еще нужно сохранить данные в эту таблицу из стороннего сервиса по API, вот думаю как правильно сделать архитектуру.
 

fixxxer

К.О.
Партнер клуба
Понятие "модель" не имеет никакого отношения к работе с таблицей.
(В случае с ActiveRecord, конечно, по факту имеет, но это косвенно и деталь реализации).

https://en.wikipedia.org/wiki/Domain_model

Попробуй мыслить объектами, а не таблицами и API, сразу начнет что-то разумное получаться.
 

1482909

Новичок
Попробуй мыслить объектами
Принял на изучение.
Временно сделал так:
PHP:
class OrdersInfo
{
    private function getRemoteOrders()
    {
        ...
    }

    private function setRemoteOrders()
    {
        ...
        $this->getRemoteOrders();
        ...
    }

    public function getOrders()
    {
        ...
    }
}
PHP:
use App\Model\OrdersInfo;

class HomeController
{
    public function orders()
    {
        $orders = new OrdersInfo();
        return $this->renderContent(
            view('orders', ['orders' => $orders->getOrders()])
        );
    }
}
Чувствую конечно, что не правильно ...
 

AmdY

Пью пиво
Команда форума
Почему у тебя setRemoteOrders приватный, да ещё внутри использует getRemoteOrders.

Смотри, у тебя есть сервис который работает с апи OrderApiService, есть сервис который работает с БД на на основе Eloquent, пусть будет OrderStorage. Теперь их надо объединить, получаем третий сервис, который в зависимостях имеет первые два и должен забирать данныеот апи, класть их в бд, затем забирать оттуда все данные
PHP:
class OrderInfoService {
    public function __construct($api OrderApiServiceInterface, $storage OrderStorageInterface) {...}
     public function syncAndGetOrders() {
          $orders = $this->api->getOrders();
          $this->storage->save($orders);
          return $this->storage->all();
     }
}
p.s. Service и Interface я добавил для наглядности, лучше обходиться без постфиксов.
 

fixxxer

К.О.
Партнер клуба
Все же до сих пор непонятно, почему есть какой-то OrderInfo, который не заказ, а что-то еще. В чем смысл?
 

1482909

Новичок
Почему у тебя setRemoteOrders приватный, да ещё внутри использует getRemoteOrders.

Смотри, у тебя есть сервис который работает с апи OrderApiService, есть сервис который работает с БД на на основе Eloquent, пусть будет OrderStorage. Теперь их надо объединить, получаем третий сервис, который в зависимостях имеет первые два и должен забирать данныеот апи, класть их в бд, затем забирать оттуда все данные
PHP:
class OrderInfoService {
    public function __construct($api OrderApiServiceInterface, $storage OrderStorageInterface) {...}
     public function syncAndGetOrders() {
          $orders = $this->api->getOrders();
          $this->storage->save($orders);
          return $this->storage->all();
     }
}
p.s. Service и Interface я добавил для наглядности, лучше обходиться без постфиксов.
Очень точно получилось уловить мою мысль.
На сколько я понимаю OrderApiServiceInterface и OrderStorageInterface, можно сделать интерфейсами, а можно и сразу классами.
Можете дать совет как правильней в большинстве случаев?
Или все зависит от ситуаций?
 

1482909

Новичок
Все же до сих пор непонятно, почему есть какой-то OrderInfo, который не заказ, а что-то еще. В чем смысл?
Вероятно потому что я тут все попутал, по глупости.
Судя по ответу @AmdY, OrderInfo это Service Container, так как в ответе присутствуют слова "Service" и "зависимостями".
 
Сверху