Ghost - laborci/eternity2 GitHub Wiki
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!
./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
./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 azarticle_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.
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.
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
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.
- Ha az értéke
null
, akkor visszaadja a mező értékét. - Ha az értéke
true
, akkorgetMező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.
- Ha az értéke
null
vagytrue
, akkorsetMező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.
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.
Az egyes ghostok kapcsolódhatnak egymáshoz. Ezt a modell belongsTo
és hasMany
metódusain keresztül definiálhatod.
Példa: Van
User
ésCar
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.
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.
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.
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.
#### ::$model
A ghost leíró objektuma
Az adott id-jű objektumot (vagy null-t) adja vissza.
$user = User::pick(1);
Az adott id-jű elemeket adja vissza.
$users = User::collect([1,2,3,4,5]);
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();
Az elem létezik e adatbázisban (azaz az id mezőnek van értéke)
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.
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)
A kapott adatokat a meződefiníciók alapján (konvertálva azokat menet közben) betölti az objektumodba.
Adatbázisból kapott adatokból feltölti az adott objektumot.
Átalakítja az objektumot adatbázis mentéshez.
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.
Törli az objektum adatbázis reprezentációját.
A műveletek előtti eseménykezelők ha false
értékkel térnek vissza, akkor megakadályozzák a műveletet.
Az egyes entitás elemekhez fájlokat csatolhatsz, ezt hívjuk attachmentnek. Erről bővebben a olvashatsz az Attachments fejezetben.