Snažím se registrovat vlastní typ v Nettrine
- grovik
- Člen | 72
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
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
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.
- grovik
- Člen | 72
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.
- grovik
- Člen | 72
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 ;-).