Download the PHP package djinorm/djin without Composer

On this page you can find all versions of the php package djinorm/djin. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.

FAQ

After the download, you have to make one include require_once('vendor/autoload.php');. After that you have to import the classes with use statements.

Example:
If you use only one package a project is not needed. But if you use more then one package, without a project it is not possible to import the classes with use statements.

In general, it is recommended to use always a project to download your libraries. In an application normally there is more than one library needed.
Some PHP packages are not free to download and because of that hosted in private repositories. In this case some credentials are needed to access such packages. Please use the auth.json textarea to insert credentials, if a package is coming from a private repository. You can look here for more information.

  • Some hosting areas are not accessible by a terminal or SSH. Then it is not possible to use Composer.
  • To use Composer is sometimes complicated. Especially for beginners.
  • Composer needs much resources. Sometimes they are not available on a simple webspace.
  • If you are using private repositories you don't need to share your credentials. You can set up everything on our site and then you provide a simple download link to your team member.
  • Simplify your Composer build process. Use our own command line tool to download the vendor folder as binary. This makes your build process faster and you don't need to expose your credentials for private repositories.
Please rate this library. Is it a good library?

Informations about the package djin

DjinORM Build Status

Легковесная ORM, нацеленная на работу с любым типом баз данных, будь то реляционные, документ-ориентированные, колоночные или key-value хранилища. Вы полностью управляете тем, как что и куда вы хотите сохранять и извлекать. Все что для этого нужно - создать репозитории для моделей

Установка:

Преамбула

DjinORM состоит из набора компонентов и интерфейсов, взаимодейтвие которых позволяет инкапсулировать логику ее работы

Модель

Модель - это объект, который мы хотим сохранять в БД, отдельная, полноценная сущность, которая может иметь в себе любые вложенные объекты и массивы. Моделью может быть абсолютно любой класс, который реализует интерфейс \DjinORM\Djin\Model\ModelInterface. Каждая модель должна иметь свой уникальный Id, благодаря которому осуществляется связывание моделей друг с другом.

Id

Id - объект, который содержит в себе уникальный идентификатор модели. Именно объект \DjinORM\Djin\Id\Id должна возвращать каждая модель, и именно благодаря нему осуществляется связывание моделей друг с другом. В PHP все объекты передаются по ссылке благодаря чему мы можем присвоить Id какой-либо модели и он автоматически попадет во все ее реляции. Пример:

Представьте, что у нас есть 2 простых модели: User и Comment. Пользователь может писать комментарии, где каждый комментарий должен быть закреплен за пользователем.

Модель пользователя

Модель комментария

Теперь давайте посмотрим как будет работать связывание пользователя и комментария:

За счет того, что объекты в php передаются по ссылке, мы можем проставить для нашего пользователя какой-то постоянный Id, который сразу попадет и в комментарий

Осталось только решить вопрос с тем, кто и как занимается простановкой Id. Об этом далее.

IdGenerator

В DjinORM простановка перманентных Id осуществляется отдельным компонентом, который должен реализовывать интерфейс \DjinORM\Djin\Id\IdGeneratorInterface, который в свою очередь проставляет Id непосредственно перед записью модели в БД.

Здесь стоит сделать отступление для тех, кто работал только с MySQL и привык к тому, что база сама проставляет Id. В случае с DjinORM такой подход невозможен, но это ничуть не плохо. Вместо этого вы можете использовать абсолютно любой счетчик, например Redis, sequences в PostgreSQL, строку UUID или даже использовать что-то вроде SELECT MAX(id) FROM table для каждой генерации (хотя так делать не надо, потому что это приведет к блокировкам)

В комплекте с ORM сразу идет 3 готовых Id-генератора (но вам ничего не мешает сделать свой)

Репозитории

В репозиториях лежит вся "грязь", ответственная за то, как находить, извлекать и сохранять модели из БД. Каждый репозиторий должен реализовывать интерфейс \DjinORM\Djin\Repository\RepositoryInterface. Именно репозиторий имеет методы поиска, сохранения и удаления моделей. Именно он знает с какой именно БД вы работаете, и именно он знает как преобразовать вашу модель в массив данных для сохранения в БД и как обратно превратить этот массив в вашу модель. Именно репозиторий отвечает за простановку перманентного Id, поэтому IdGenerator должен передаваться ему через конструктор в качестве зависимости.

Подразумевается, что для этих целей используется рефлексия, при помощи которой вы можете обращаться к приватным свойствам класса, получать и изменять их значения, создавать объекты без вызова их конструктора и т.д. Чтобы упростить работу с моделями через рефлексию в DjinORM существует специальный хелпер \DjinORM\Djin\Helpers\RepoHelper.

С его помощью мы легко можем превратить нашу модель Comment в обычный массив

И обратно превратить массив, извлеченный из базы в модель

Подобный подход дает полный контроль над хранением данных: вы можете извлекать объекты любого уровня вложенности, как угодно трансформировать данные для записи в БД и делать с ними что угодно. В ряде случаев такой подход вполне оправдан, однако он требует большого количества кода, особенно когда вам надо трансформировать сложные объекты и проверять существование каких-либо значений. Кроме того, часто бывает так, что ряд сложных объектов встречается как вложенный в разных моделях.

О том, как решается данная проблема можно ознакомиться в следующем разделе.

Hydrator & Mapper

Первым делом стоит рассмотреть мапперы. Представьте, что мы решили сделать возможность создавать комментарии из примера выше анонимным пользователям. Т.е. у комментария нет автора. В таком случае его поле userId может быть Id, а может null. При таком подходе нам придется каждый раз проверять userId на null и в зависимости от этого создавать/извлекать значение Id или так и оставлять null. А теперь представьте, что помимо комментария у нас появятся такие модели как Post, Role и куча любых других, которые тоже работают с Id. Поэтому логично вынести куда-то логику преобразования Id туда-сюда. Именно по этой причине и появились мапперы.

Мапперы

Маппер умеет превращать данные определенного типа в скалярное представление или массив, а также, обратно превращать скалярные данные в нужный нам тип, осуществляя внутри себя все преобразорвания и проверки на null. Каждый маппер должен реализовывать интерфейс \DjinORM\Djin\Hydrator\Mappers\MapperInterface - посмотрите код этого интерфейса, и вам многое станет понятно

В Djin поставляется набор типовых мапперов, которые могут конвертировать большинство распространенных типов данных:

Гидратор

Итак, у нас есть мапперы, которые могут преобразовывать определенные типы данных, но сами по себе они бесполезны. Им нужен компонент, который будет ими управлять. Для этого есть \DjinORM\Djin\Hydrator\Hydrator который как раз и отвечает за комплексную трансформацию сложных объектов в простые массивы и обратно. Также, гидратор содержит в себе схему мапперов в точечной нотации и может вернуть вам экземпляр маппера по его нотации. Это полезно при дополнительной обработке данных в репозитории (если такая требуется).

Например, вот так будет выглядеть гидратор для моделей User и Comment

Поэтому наши репозитории теперь могут выглядеть примерно следующим образом

Разумеется, в реальном проекте вы можете использовать не только SQL базы, но и любые другие. Вы можете вынести общую логику в абстрактный репозиторий и всячески оптимизировать код. В качестве примера можете посмотреть на SQL репозиторий djin-repo-sql

В репозитории мы можем делать что угодно: например в случае использования реляционных баз мы можем сохранять вложенные обекты в другие таблицы, преобразовывать их в json или раскладывать по отдельным полям в формате точечной нотации. Вы сами упарвляете тем, как ваши данные будут храниться.

ModelManager

Задача компонента \DjinORM\Djin\Manager\ModelManager - собрать все вместе. Именно он максимально упрощает реальную работу с моделями, связывая модели, репозитории, согласованное сохранение данных и т.д.

В конструктор ModelManager можно передать 4 параметра:

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

Либо указание классов моделей можно опустить, если наш репозиторий сохраняет только одну модель. Модель будет определена согласно интерфейсу \DjinORM\Djin\Repository\RepositoryInterface::getModelClass

Теперь мы можем работать с моделями примерно следующим образом

Реляции

Связь с использованием объекта Id работает быстро и хорошо. Но объект Id передается по ссылке только в момент создания записей. Если в момент создания User::$id и Comment::$userId ссылаются на один и тот же объект Id, то в последующих сессиях при извлечении их из БД они будут ссылаться на разные объекты Id с одним и тем же перманентным значением. Обычно, это не создает проблем, т.к. значение самого Id изменить нельзя. Но Id сам по себе никак не связан с моделью. Например, в ситуации, когда автором комментария может быть не только User, но и Bot, то как нам определить кто именно является автором комментария?

Именно для решения подобных задач существует \DjinORM\Djin\Model\Relation. Давайте перепишем наш Comment так, чтобы он в качестве автора мог принимать кого угодно

Реляции хранят в себе значение Id модели ModelInterface::getId() и ее имени из ModelInterface::getModelName(). Для реляций также есть специальный маппер.

Теперь благодаря реляциям мы можем легко находить автора комментария, кто бы им ни был (любая модель)


All versions of djin with dependencies

PHP Build Version
Package Version
Requires php Version >=7.2.0
ext-mbstring Version *
ext-json Version *
psr/container Version ^1.0
Composer command for our command line client (download client) This client runs in each environment. You don't need a specific PHP version etc. The first 20 API calls are free. Standard composer command

The package djinorm/djin contains the following files

Loading the files please wait ....