Twitt
@Twitt

Как написать свою реализацию ActiveRecord?

захотел написать свой ActiveRecord в контексте определенной задачи. Возникли вопросы
Я хотел сделать класс abstract Model, который имеет методы find, remove, от которого будут наследоваться остальные классы. Например, у меня в бд есть таблица users, я делаю class User extends Model, который по дефолту будет иметь find, remove. Если мы создаем new User, то по сути это должна быть новая запись в таблицу users (insert), верно? Т.е. создавать экземпляр user и вызывать find это неправильно, потому что новый экземляр класса подразумевает новую запись в таблице. Я хочу сделать так:
User::find(id), User::remove(id) для получения и удаления, и
$user = new User(); $user->setId(40); $user->setName("Vasya"); $user->save();

Я в конструкторе модели юзаю вызов pdo, вот так:
abstract class Model
{
    /**
     * @var PDO
     */
    protected $pdo;

    /**
     * @var string
     */
    protected $tableName;

    public function __construct(array $config)
    {
        $this->pdo = new \PDO("mysql:host=localhost;dbname=" . $config['db_name'], $config['db_username'], $config['db_password'], array(PDO::MYSQL_ATTR_INIT_COMMAND=>'SET NAMES utf8'));
    }


Создание static метода find будет несуразным, по скольку будем обращаться к не статическому pdo.
Как обойти и на сколько я прав? Может есть хороший пример где то как это должно быть? Т.к. я не нашел
  • Вопрос задан
  • 123 просмотра
Пригласить эксперта
Ответы на вопрос 1
php666
@php666
PHP-макака
Человек, я тебе вот что скажу. Много лет назад я начал свой велосипед писать. Но вместо AR я использовал DataMapper паттерн. Написал более-менее рабочее, что позволяет оперировать с одной строкой таблицы, отражающей простую модель (без связей). Дзен познал. Но смысла и трудозатрат это не оправдало.

Мой тебе совет - не надо писать свой AR. Сейчас куча есть решений, где десятки контрибьютеров. Лучше коллективного разума ты не напишешь. Иначе ты закопаешься очень надолго. Нюансов и тонкостей - масса.

Не надо придумывать заново плоскогубцы или дрель. Всё уже существует. Я понимаю, очень интересно писать свое, но если очень хочется - возьми готовое решение и пиши лучше готовый продукт, CMS какую-нибудь, свой сайт, CRM для бизнеса или еще что-то. Больше пользы будет - может, продать получится.

Если ты свое начнешь писать, и это, не дай Бог начнет у тебя получаться, ты потратишь кучу времени на изобретение велосипеда, на это уйдут годы, считай - ты сольешь их в никуда. Он не будет нужен никому, кроме тебя.
Ответ написан
Ваш ответ на вопрос

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

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