Created
July 1, 2016 11:09
-
-
Save Tharos/63c05a27eee61d9e959db4f4c76a39bf to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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. :)