Ghost - laborci/eternity2 GitHub Wiki

Ghost

Az eternity2 entitásai a Ghost-ok. Az eternity a Database First megközelítést alkalmazza és gyártja számodra az entitásokat az adatbázisból.

Minden adatbázistáblának tartalmaznia kell egy id nevű int 11 unsigned autoincrement mezőt!

ini

./etc/ini/config/database.yml

default-database: DefaultDBConnection
generator:
  ~ghost-path: app.ghost
  ghost-namespace: Ghost
  • default-database - A service neve, amin a default adatbáziskapcsolat elérhető
  • generator.ghost-path - A ghost fájlok elérési újta
  • generator.ghost-namespace - A generált ghost fájlok php névtere

Cli

./phlex ghost [<name>] [<table>] [<database>]

Amennyiben argumentumok nélkül indítod a parancsot, akkor frissíti az összes Ghost-ot az adatbázisból, illetve a Ghost fájlhoz hozzáfűzött dekorátorokból. Minden más esetben új Ghost létrehozása történik.

  • name - A ghost osztály neve, pl: ArticleComment
  • table - A tábla neve, amiből a ghost származik. Ha származtatható a ghost nevéből, akkor nem kötelező megadni, a fenti példa az article_comment táblát fogja keresni.
  • database - az adatbázis erőforrás neve, ha nem adod meg, akkor a konfigurációban megadott alap adatbázishoz kapcsolódik.

Ghost files

Egy ghost alapból két fájlból áll.

  • Helper : ./app.ghost/Helper/GhostArticleComment.php Ezt a fájlt a rendszer 100%-ban generálja, ehhez sosem kell (szabad) hozzányúlni
  • Ghost: ./app.ghost/ArticleComment.php Ennek a kereteit a rendszer legyártja egyszer, a további módosítások a fejlesztőre vannak bízva.

Decorating ghosts

Egy ghost osztály alapvetően az alábbiak szerint néz ki:

<?php namespace Ghost;

class ArticleComment extends Helper\GhostArticleComment{

}

ArticleComment::init();

Ehhez fűzhetsz hozzá dekorátorokat az init() statikus metódus hívását követően.

// adhatsz hozzá fájl attachment kategóriákat:
ArticleComment::$model->hasAttachment('files');

// kapcsolódhat más ghostokhoz
ArticleComment::$model->belongsTo('user', User::class, 'userId');

// illetve kapcsolódhatnak hozzá más ghostok is
ArticleComment::$modal->hasMany('article', Article::class, 'commentId');

// beállíthatod, hogy a ghost-od csak olvasható legyen
ArticleComment::$model->immutable()

// végül beállíthatsz az egyes fieldekhez settereket, gettereket
ArticleComment::$model->protectField('comment', true, true);

Ha a dekorátorokat módosítod, akkor mindenképpen generáld újra a ghostot, hogy az annotációk bekerüljenek a helper fájlba.

./phlex ghost

Fields

Alapvetően a mezők az adatbázismezők alapján jönnek létre. A mezők publikusak. Gettert és Settert a protectField dekorátorral tudsz hozzáadni egy mezőhöz.

Getter

  • Ha az értéke null, akkor visszaadja a mező értékét.
  • Ha az értéke true, akkor getMezőnév() gettert fog keresni a Ghost.
  • Ha az értéke típusa string akkor a megadott nevű metódust fogja getterként használni.
  • Ha az értéke false akkor nincs getter, nem olvasható a tulajdonság.

Setter

  • Ha az értéke null vagy true, akkor setMezőnév($value) settert fog keresni a Ghost.
  • Ha az értéke típusa string akkor a megadott nevű metódust fogja setterként használni.
  • Ha az értéke false akkor nincs setter, nem írható a tulajdonság.

Típusok

A fenti tipusokat használhatod egy mezőnél. A tipusokat a rendszer az adatbázis mezőtipusnak megfelelően hozza létre. Ha json adatszerkezetet szeretnél használni, akkor az adatbázisban a mező megjegyzésébe írd be: json.

const TYPE_BOOL = 'bool';
const TYPE_STRING = 'string';
const TYPE_INT = 'int';
const TYPE_ID = 'id';
const TYPE_DATE = 'date';
const TYPE_DATETIME = 'datetime';
const TYPE_ENUM = 'enum';
const TYPE_SET = 'set';
const TYPE_FLOAT = 'float';
const TYPE_JSON = 'json';

Minden mezőhöz - mint ahogy a ghosthoz is - tartozik compose, decompose, import és export metódus.

  • compose - adatbázisból olvasás után, ez alakítja ghost mezővé az adatot.
  • decompose - adatbázisba írás előtt, ez alakítja a php adatot adatbázis adattá.
  • export - json serializálás előtt ez alakítja át az adatokat
  • import - json serializálás után ez alakítja át az adatokat.

Relations

Az egyes ghostok kapcsolódhatnak egymáshoz. Ezt a modell belongsTo és hasMany metódusain keresztül definiálhatod.

Példa: Van User és Car entitásunk. A felhasználók használják az autókat, minden felhasználó egy autót használhat, de minden autót több felhasználó vezethet.

belongsTo

Ha az idegen kulcs az adott Ghostnak tulajdonsága, akkor a belongsTo metódussal kapcsolhatod össze őket.

User::$model->belongsTo('car', Car::class, 'carId');

Azaz a felhasználóhoz tartozik egy autó, ami a $car read-only tulajdonságon keresztül kérhető el a felhasználó objektumtól. A kapcsolat a felhasználó carId tulajdonságán keresztül van megvalósítva.

hasMany

Ha az idegen kulcs a másik ghost-ban van definiálva, akkor a kapcsolatot a hasMany dekorátorral adhatod meg.

Car::$model->hasMany('drivers', User::class, 'carId');

Azaz legyen az autó objektumoknak egy drivers read-only tulajdonásga, ami User osztályú objektumokat fog visszaadni. A kapcsolatot pedig a User carId tulajdonsága reprezentálja. Amennyiben a kapcsolat származtatható a létrehozandó tulajdonság nevéből "Id" string hozzáfűzésével, akkor ezt nem kötelező megadni.

$user = User::pick(1); // elkérjük az 1-es ID-jű felhasználót
echo $user->car->name; // kiírjuk a felhasználó autójának típusát

foreach($user->car->drivers as $driver){
	echo $driver->name; // kiírjuk a $user felhasználó autójának összes sofőrjét
}

A rendszer annotálja a ghost fájlokat, így ezekről a tulajdonságokról az IDE mind tudni fog.

hasMany getter

A hasMany reláció kapcsolatok nem csak a létrehozott tulajdonságon keresztül érhetőek el, hanem egy ugyan olyan nevű metóduson keresztül is.

$user->drivers($order = null, $limit = null, $offset = null);

Ahol sorba rendezheted vagy akár lapozhatóvá is teheted a kapcsolatok lekérdezését.

Static

#### ::$model A ghost leíró objektuma


::pick(int $id): ?self

Az adott id-jű objektumot (vagy null-t) adja vissza.

$user = User::pick(1);

::collect(array $ids): array

Az adott id-jű elemeket adja vissza.

$users = User::collect([1,2,3,4,5]);

::search(Filter $filter): GhostFinder

A megadott filterrel és Ghost converterrel felparaméterezett kereső objektumot ad vissza. (a filterekről részletesen az adatbázis műveleteknél olvashatsz)

$users = User::search(Filter::where('age>$1', $minAge)->collect();

Methods

isExists(): bool

Az elem létezik e adatbázisban (azaz az id mezőnek van értéke)


isDeleted(): bool

Az elem törlés után a memóriában még megmarad, még akkor is, ha az adatbázisból törlésre került. Hogy törölt elemről van e szó, azt az isDeleted metódus mondja meg.


export():array

Az elem adattartalmát adja vissza egy tömb formájában. Főként kliens oldallal történő kommunikáció esetén használatos, ha nem eleve json serializálva kéred az objektumot (ami szintén az export metódust használja a háttérben)


import(array $data)

A kapott adatokat a meződefiníciók alapján (konvertálva azokat menet közben) betölti az objektumodba.


compose($record): Ghost

Adatbázisból kapott adatokból feltölti az adott objektumot.


decompose()

Átalakítja az objektumot adatbázis mentéshez.


save(): int

Elmenti az objektumot adatbázisba. Ha már létezett, akkor az update metódust hívja meg a háttérben, ha még nem, akkor az insert metódust.


delete()

Törli az objektum adatbázis reprezentációját.


Events

Műveletek előtti eseménykezelők

A műveletek előtti eseménykezelők ha false értékkel térnek vissza, akkor megakadályozzák a műveletet.

onBeforeDelete()

onBeforeUpdate()

onBeforeInsert()

Műveletek utáni eseménykezelők

onAfterDelete()

onAfterUpdate()

onAfterInsert()

Attachmentekhez kapcsolódó eseménykezelők

onAttachmentAdded($data)

onAttachmentRemoved($data)

Attachments

Az egyes entitás elemekhez fájlokat csatolhatsz, ezt hívjuk attachmentnek. Erről bővebben a olvashatsz az Attachments fejezetben.

⚠️ **GitHub.com Fallback** ⚠️