Snažím se registrovat vlastní typ v Nettrine

grovik
Člen | 72
+
0
-

Sekl jsem se na této chybě:
Class „App\Model\Orm\Enums\RoleTypeEnum“ sub class of „Doctrine\DBAL\Types\Type“ is not a valid entity or mapped super class.

Googlil jsem, ale můj problém to neřeší, zatím vše co jsem našel mám teoreticky správně.

Třída vypadá takhle:

<?php
declare(strict_types=1);
namespace App\Model\Orm\Enums;

use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\DBAL\Types\Type;
use InvalidArgumentException;
use Tracy\Debugger;


/**
 * Class RoleTypeEnum
 * @package App\Model\Orm\Enums
 */

class RoleTypeEnum extends Type
{
    const ROLE_TYPE_ENUM = 'roleTypeEnum';
    const ROLE_ADMIN = 'admin',
                 ROLE_USER = 'user',
                 ROLE_GUEST = 'guest',
                 ROLE_SUPERADMIN = 'superadmin',
                 ROLE_AZYL = 'azyl',
                 ROLE_AZYLADMIN = 'azyladmin',
                 ROLE_ADOPTER = 'adopter',
                 ROLE_ADOPTERADMIN = 'adopteradmin';

    public static function getTypesForUser(): array
    {
        return [
            self::ROLE_USER,
            self::ROLE_GUEST,
            self::ROLE_AZYL,
            self::ROLE_ADOPTER
        ];
    }

    private static function getRoles(): array
    {
        return [
            self::ROLE_ADMIN,
            self::ROLE_USER,
            self::ROLE_GUEST,
            self::ROLE_SUPERADMIN,
            self::ROLE_AZYL,
            self::ROLE_AZYLADMIN,
            self::ROLE_ADOPTER,
            self::ROLE_ADOPTERADMIN
        ];
    }

      public function getSQLDeclaration(array            $fieldDeclaration,
                                      AbstractPlatform $platform) : string
    {
        return "ROLE('" . implode("', '", self::getRoles()) . "')";

    }


    public function convertToDatabaseValue($value, AbstractPlatform $platform)
    {
        if (!in_array($value, self::getRoles())) {
            throw new InvalidArgumentException("Invalid status");
        }
        return $value;
    }

    public function convertToPHPValue($value, AbstractPlatform $platform)
    {
        return $value;
    }

    public function requiresSQLCommentHint(AbstractPlatform $platform): true
    {
        return true;
    }

    public function getName(): string
    {
        return self::ROLE_TYPE_ENUM;
    }
}

Zkoušel jsem jí přidat do konfigurace pod Types, stej ně jako jsem zkusil jí přidat do bootstrapu pomocí addType().
Jak jsem po různu vygooglil. Bohužel problém je pořád stejný.
Přičemž v jiném projektu kde je přímo Doctrina (starší Nette a PHP) není problém registrace v configu funguje.

Nějaký nápad?

Gappa
Nette Blogger | 208
+
0
-

Já to registruji přes Type::add() v Nette Extension a funguje to.

Nicméně tahle chyba je v kontextu registrace typu divná:

Class „App\Model\Orm\Enums\RoleTypeEnum“ sub class of „Doctrine\DBAL\Types\Type“ is not a valid entity or mapped super class.

To vypadá, jako by ses ten typ snažil použít jako Entitu, což nedává ale smysl.

Jak se ten typ pak snažíš použít?

grovik
Člen | 72
+
0
-

Rád bych si ty typy vypsal, například do SELECT prvku ve formuláři. Takže to tam mám pro test hozené jakože do bdumpu myslím že s findAll();
Nejsem u toho teď se do toho nemůžu podívat. Mohl by být problém v tom. Což rozhodně nevylučuji :-).

grovik
Člen | 72
+
0
-

Nakonec jsem vyřešil přidáním tohoto do Bootstrapu

	Type::addType('roleTypeEnum', 'App\Model\Orm\Enums\RoleTypeEnum');
        Type::addType('messageTypeEnum', 'App\Model\Orm\Enums\MessageTypeEnum');
        Type::addType('actionTypeEnum', 'App\Model\Orm\Enums\ActionTypeEnum');
        Type::addType('adoptionsTypeEnum', 'App\Model\Orm\Enums\AdoptionsTypeEnum');
        Type::addType('sexTypeEnum', 'App\Model\Orm\Enums\SexTypeEnum');

Fungovat to funguje. Jediný problém je, že když chci udělat UPDATE schématu DB (php ./console orm:schema-tool:update).
Tak skončím na chybě:
Unknown database type enum requested, Doctrine\DBAL\Platforms\MySQL80Platform may not support it.
Když DB smažu a udělám jí znovu komplet tak je to v pohodě. Projde a vytvoří se všechny tabulky atd.
Je to nějaké divné.
Nevěděl by @Felix ?
Zkoušel jsem různé podstrčit string do mapování typu, ale bez výsledku. Funkční je prostě jen smazat a vytvořit znovu.

F.Vesely
Člen | 369
+
0
-

Ja tedy vlastni typy pridavam do konfigurace a funguji mi v pohode. Pro tu chybu zkus pridat mapovani enumu na string.

nettrine.dbal:
	connection:
		typesMapping:
			enum: string
		types:
			bigDecimal: App\Doctrine\Types\BigDecimalType
			currency: App\Doctrine\Types\CurrencyType
grovik
Člen | 72
+
0
-

F.Vesely napsal(a):

Ja tedy vlastni typy pridavam do konfigurace a funguji mi v pohode. Pro tu chybu zkus pridat mapovani enumu na string.

nettrine.dbal:
	connection:
		typesMapping:
			enum: string
		types:
			bigDecimal: App\Doctrine\Types\BigDecimalType
			currency: App\Doctrine\Types\CurrencyType

Přesně takhle jsem to měl včetně toho enumu a dostával jsem děsnou bídu :D. Jakože nemám regnuté a padalo to na neregistrované typy atd.
Nevím kde byla boty. Po dvou nocích jsem neměl nervy se s tím dál párat.
Ten enum: string mě ale zajímá.
Přesně takhle jsem to tam dal a nic pořád stejná chyba (cache smazaná).
Divné je, že create funguje. Čekal bych stejný problém.

Felix
Nette Core | 1245
+
0
-

V tento moment, kdy mame PHP 8.4, bych doporucoval pouzivat pouze attributy a vyhnul se anotacim.

grovik
Člen | 72
+
0
-

To rozhodně.
Však právě, s tím jsem bojoval. Protože když jsem rozběhal Nettrine tak všechno bylo nakonfigurované (v návodech) pro anotace. Komplet jsem to musel překopat. Bylo to tak trochu peklíčko.

Felix
Nette Core | 1245
+
0
-

A spokojenost @grovik?

grovik
Člen | 72
+
0
-

Teď už jo… ale ty návody jak jsem psal jinde… by potřebovali projít a aktualizovat, obecně asi nějak přepracovat. Nechal jsem na tom všem asi tak den práce plus mínus. Protože to bylo kolikrát hrozně experimentování. Jestli tohle bude fungovat nebo ne.
Teď už dobré. I když to mám vlastně trochu jinak než by asi mělo být… každopádně to funguje ;-).