Giter VIP home page Giter VIP logo

consistence-doctrine's Introduction

Consistence Enum Doctrine types

Build Status Coverage Status Downloads this Month Latest stable

Package abandoned

This package is considered obsolete and abandoned. Since PHP 8.1 introduced native enum support, there is no need for user-land implementation of enums, neither their custom integration into Doctrine.

Installation

Via Composer:

$ composer require nepada/consistence-doctrine

Usage

Define Doctrine type for the enum

/**
 * @phpstan-extends \Nepada\ConsistenceDoctrine\StringEnumType<\FooEnum>
 */
class FooEnumType extends \Nepada\ConsistenceDoctrine\StringEnumType
{

    protected function getEnumClassName(): string
    {
        return \FooEnum::class;
    }

}

You can choose to inherit from StringEnumType, IntegerEnumType, FloatEnumType or BooleanEnumType depending on the enum values.

Register the created type in Doctrine

\Doctrine\DBAL\Types\Type::addType(\FooEnum::class, \FooEnumType::class);

In Nette with nettrine/dbal integration, you can register the types in your configuration:

dbal:
    connection:
        types:
            FooEnum: FooEnumType

Use the type in entity

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class SomeEntity
{

    /** @ORM\Column(type=\FooEnum::class, nullable=false) */
    private \FooEnum $foo;

    // ...

}

Use enum in query builder

$result = $repository->createQueryBuilder('bar')
    ->select('bar.foo') // FooEnum instances are created during hydratation
    ->where('bar.foo = :fooEnum')
    ->setParameter('fooEnum', \FooEnum::get(\FooEnum::VALUE), \FooEnum::class) // enum instance gets serialized
    ->getQuery()
    ->setMaxResults(1)
    ->getSingleResult();

PHPStan support (via phpstan/phpstan-doctrine)

The abstract enum type classes are anotated as PHPStan generics and define proper typehints for their convert* methods. This means you can teach PHPStan your custom enum types via ReflectionDescriptor:

services:
    -
        factory: PHPStan\Type\Doctrine\Descriptors\ReflectionDescriptor(FooEnumType)
        tags: [phpstan.doctrine.typeDescriptor]

Differences from the official consistence/consistence-doctrine

The official integration consistence/consistence-doctrine uses postload entity event to convert data stored in database to enum instances.

The main advantage of that approach is that you don't need to create and register new doctrine type for every enum.

The disadvantages are:

  • You can't use native property typehints for entity enum attributes.
  • When you're not hydrating entites, you will get enum values instead of enum instances.
  • There is no easy way how to make PHPStan understand and check doctrine and PHP types of your enum fields.

consistence-doctrine's People

Contributors

dependabot[bot] avatar xificurk avatar

Stargazers

František Maša avatar  avatar

Watchers

 avatar James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.