-
-
Save Tharos/63c05a27eee61d9e959db4f4c76a39bf to your computer and use it in GitHub Desktop.
<?php | |
use Nette\Neon\Neon; | |
use Schematic\Entries; | |
use Schematic\Entry; | |
// composer.json | |
// { | |
// "require": { | |
// "tharos/schematic": "dev-master", | |
// "nette/neon": "^2.4" | |
// } | |
// } | |
require_once __DIR__ . '/vendor/autoload.php'; | |
$neonSource = ' | |
[ | |
{ | |
name: PHP | |
libraries: [ | |
{name: Doctrine}, | |
{name: Nette}, | |
] | |
}, | |
{ | |
name: JavaScript | |
libraries: [ | |
{name: React}, | |
{name: jQuery}, | |
] | |
}, | |
] | |
'; | |
$languages = Neon::decode($neonSource); | |
// Schematic doesn't hydrate data, it's a trivial wrapper. It's not so sexy, but it works and performs very well | |
/** | |
* @property-read string $name | |
*/ | |
class Library extends Entry | |
{ | |
} | |
/** | |
* @property-read string $name | |
* @property-read Library[] $libraries | |
*/ | |
class Language extends Entry | |
{ | |
protected $associationTypes = [ | |
'libraries' => [Library::class], | |
]; | |
} | |
/** @var Language[]|Entries $languages */ | |
$languages = new Entries($languages, Language::class); | |
foreach ($languages as $language) { | |
echo $language->name, "\n"; | |
foreach ($language->libraries as $library) { | |
echo "\t", $library->name, "\n"; | |
} | |
} | |
// Outputs: | |
// | |
// PHP | |
// Doctrine | |
// Nette | |
// JavaScript | |
// React | |
// jQuery |
PS: klidně ten comment smaž, ať Ti to tu neruší karmu knihovny
Nic nemažme, diskuze je nejvíc žádoucí. :)
Mně se Tvoje řešení moc líbí. Je koncepčně zase jiné, než tharos/schematic.
Já jsem se v tharos/schematic schválně rozhodl jít nejsnazší možnou cestou. Tuším, že to moje řešení má méně než 100 LOC. :) Vědomě jsem tentokrát nechtěl parsovat anotace, importy, pak to celé cachovat (kvůli nevýkonu reflexí)…
Skrz/meta se mi taky líbí, ale u něj mám už ten psychologický blok, zda potřebuji, aby knihovna byla v mém případě o řád větší než mnohá aplikace samotná… Zkrátka jsem věřil, že na vtisknutí nějakého schéma poli mi prostě 100 LOC musí stačit. :) Jinak je ale skrz/meta top kvalita, co jsem koukal na kód.
Líbí se mi, že existují všechny tři knihovny. :)
By milo/hydrator: