Отделите сущность от модели или сохраните их как один класс (spotorm)

Я постепенно включаю в свой проект ORM (с SpotORM) и внедрение зависимостей (с PHP-DI), и я хочу сделать это правильно. Прямо сейчас я не могу понять, должны ли сущность и модель быть двумя разными классами или только одним.

Класс Entity выглядит так:

<?php

namespace MyProject\Entity;

use Spot\Entity as Entity;

class Person extends Entity
{
    protected static $table = "t_person";

    public static function fields()
    {
        return [
            "id" => ["type" => "integer", "primary" => true, "autoincrement" => true],
            "firstname" => ["type" => "string", "length" => 50],
            "lastname" => ["type" => "string", "length" => 50],
        ];
    }
}

Это дает мне доступ к firstname с $person->get("firstname") или $person->getFirstname().

Я хочу создать метод getFullName(), который возвращает имя, за которым следует фамилия. Моей первой мыслью было написать это в этом классе сущностей, который отлично работает.

Теперь я хочу использовать внедрение зависимостей для такого метода, как getSlug (), используя Slugifier, который поступает из библиотеки. Но я не могу внедрить его в конструктор, потому что он имеет определенную подпись и вызывается только SpotORM.

Итак, я подумал, что мне нужен отдельный класс для размещения моих методов, но тогда ORM не знает об этом, и, например, если я получаю список сущностей Person из сущности Organization через отношение, я не У меня нет дополнительных методов.

Как это обычно делается?

Я не могу создать тег [spotorm] (требуется более 1500 повторений), не стесняйтесь добавлять его, если можете.

Niavlys 31.10.2018 14:17

Термины Entity и Model являются синонимами. Метод getFullName отлично вписывается в сущность. Генерация слагов не принадлежит сущности и должна выполняться в вашем сервисе или контроллере. Что-то вроде Slugifier::getSlug($person->getFullName());, которое можно использовать где угодно в вашем коде.

Sander Visser 31.10.2018 14:20

@SanderVisser Спасибо. Значит, у моей сущности не может быть никакой зависимости? Если я хочу использовать sendMail() на User, думаю, мне нужно создать экземпляр Mailer вручную в контроллере? Если я хочу использовать кеш, чтобы не получать данные из базы данных, если они уже были, я не могу использовать его в методах объекта?

Niavlys 31.10.2018 14:44

Сущность никогда не должна иметь зависимостей. Чтобы отправить письмо, вы действительно должны ввести экземпляр Mailer, который затем можно использовать в своем контроллере в качестве примера. Сама ORM, которая извлекает данные из базы данных и заполняет вашу сущность. и также должен обрабатывать кеширование / оптимизацию для вас, а не для самой сущности

Sander Visser 31.10.2018 18:58

Большое спасибо, я готов к этому! Жаль, что нет ответа, чтобы принять!

Niavlys 31.10.2018 21:39
0
5
48
0

Другие вопросы по теме