-
-
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: