RoastMe: a Baby Data Mapper ORM

Фанат

oncle terrible
Команда форума
Вы уж меня извинити что я опять к вам обращаюся.
Но уж очень хочется закрыть эту дырку в иформационном пространстве, когда между "вайл муэскуэл фетч эррэй" и Доктриной нет ничего.
Ну и все равно же тут шаром покати и скука смертная, зубы точить не об кого :)

 

fixxxer

К.О.
Партнер клуба
ну оно же не сработает если поля не публичные, смысл в таком датамаппере? :)

через reflection читать надо!

fetchObject вот заполнит поля в тч приватные, но я, если честно, вообще не знаю, что будет с типизацией: если у меня private int $id, что сделает fetchObject? прикастит? засунет string? упадет с ошибкой?

всякие случаи типа "а что если там массив или объект" я понимаю что вне скоупа этой игрушки :)

хотя если скомбинировать с каким-нибудь автомаппером, которым мапить domain models на persistence models, и этой деткой работать именно с persistence models, оно в принципе даже начинает иметь смысл.
 
Последнее редактирование:

Фанат

oncle terrible
Команда форума
всякие случаи типа "а что если там массив или объект"
Этожмаппер! Взял и написал нужный тебе кастомный метод! Ну я по крайней мере предполагаю именно так действовать.
ну оно же не сработает если поля не публичные, смысл в таком датамаппере?
Мде, об этом я не подумал. Рефлекшен городить прям очень не хочется.
я, если честно, вообще не знаю, что будет с типизацией
Щас посмотрим
 

fixxxer

К.О.
Партнер клуба
Взял и написал нужный тебе кастомный метод!
А куда его там, простите, засунуть? Я чот не вижу, может я слепой.
Ну и как только появятся методы двустороннего преобразования, fetchObject() сразу пойдет лесом.

Рефлекшен городить прям очень не хочется.
Это совсем не страшно. :)
 

AnrDaemon

Продвинутый новичок
@Фанат репо только почисти. А то там закос под автозагрузчик композера прорвался.

Если хочешь ручной загрузчик, обзови его иначе.
 

AnrDaemon

Продвинутый новичок
Что бросилось в глаза - ручное конструирование DSN с кучей обязательных параметров. Сразу в помойку. Выкинь весь этот код и принимай DSN прямо в конструкторе.

Вместо $options = array_replace… проще написать
PHP:
$pdo_options += [
            \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
            \PDO::ATTR_EMULATE_PREPARES => false,
            \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
        ];
ну и вообще в целом весь класс DB выглядит бессмысленным в лучших традициях https://phpdelusions.net/pdo/pdo_wrapper
 

Фанат

oncle terrible
Команда форума
А куда его там, простите, засунуть? Я чот не вижу, может я слепой.
Ну, это... переписать метод.
PHP:
class UserMapper extends DataMapper
{
    protected $class = 'User';
    protected $table = 'dmtestuser';
    protected $fields = ['name','email','password'];
    public function find($id)
    {
        $obj =  parent::find($id)
        $obj->property = (new PropertyMapper($this->db))->find($obj->property_id);
        return $obj;
    }
}
Ну и как только появятся методы двустороннего преобразования, fetchObject() сразу пойдет лесом.
А можешь объяснить поподробнее? Я кажется начинаю догадываться, но у тебя всегда лучше получается :)
 
Последнее редактирование:

Фанат

oncle terrible
Команда форума
И вообще, может это назвать ОРМ для Value Objects?🙄...
 

AmdY

Пью пиво
Команда форума
Это больше смахивает на *gateway в стиле zend framework
 

fixxxer

К.О.
Партнер клуба
Ну, это... переписать метод.
Ээ, и как?

Вот есть у меня, допустим
PHP:
class User
{
     private int $id;
     private array $contacts; // array of Contact

     public function __construct($id)
     {
         $this->id = $id;
         $this->contacts = [];
     }

     public addContact(Contact $contact) { ... }
     // ну и так далее
}
чего мне туда написать, чтобы не переписать вообще целиком? :)
 

fixxxer

К.О.
Партнер клуба
И вообще, может это назвать ОРМ для Value Objects?🙄...
:)

Value Object - это по определению такая штука, когда идентичность определяется как равенство всех свойств. Например:

PHP:
class Address
{
     public final int $zipCode;
     public final string $countryCode;
     public final string $regionCode;
     public final string $city;
     public final string $localAddress;

     __construct(...) { ... }
}
У них нет ID, и пихать их в базу самих по себе - это занятие несколько бессмысленное.
 

Фанат

oncle terrible
Команда форума
Ок. Тогда получается что то что я хочу сделать - это никакой не дата маппер, а какой-нибудь crud helper
 

ksnk

прохожий
Приватные - неприватные свойства можно бы обойти, если приписать пару методов в сохраняемый объект - prepare4save prepre4load, которые будут возвращать сохраняемые массивы. Гибкость, опять же, за счет обязательного переписывания кода...
Сложнее, если один объект нужно распихать в несколько таблиц. или собрать из нескольких таблиц.
через reflection читать надо!
Нельзя. Например, у меня в свойствах текстовые значения, а в базу требуются индексы из словарной таблицы А с рефлексией не будет возможности это пофиксить. Нужна прослойка.
 

fixxxer

К.О.
Партнер клуба
Ок. Тогда получается что то что я хочу сделать - это никакой не дата маппер, а какой-нибудь crud helper
Более-менее полноценный базовый dm вполне можно сделать компактным. Кода, конечно, будет раз в 10 больше, чем там сейчас, но не доктрина )
 

WMix

герр M:)ller
Партнер клуба
я в первую очередь разделил бы mapping и обращение к db, работает база с массивом и нехай себе работает
простой маппер на select это некий callable function(array row) return new Obj(....), на запись наоборот иметь instance db и просто вызывать cud на переданную коллекцию свойства на каждый обьект или рекурсивно на mapper этого свойства обьекта коллекции
 
Последнее редактирование:
  • Like
Реакции: AmdY

AmdY

Пью пиво
Команда форума
Эта библиотека плохая идея. Даже с навёрнутым инструментом вроде доктрины приходится делать двойной мэппинг. Так что в незабористых проектах проще делать мэпинг ручками вместо автомэперов, от которых будешь страдать делая шаг влево-вправо от прямого мэпинга а-ля AR.
 

MiksIr

miksir@home:~$
Фанат, с твоим энтузиазмом в области околоsql, сделал бы квери парсер+билдер - запрос в ast и обратно ;) Типа того, что sad spirit делал, только для mysql :)
 
Сверху