Skip to content

Instantly share code, notes, and snippets.

@Tharos
Created July 1, 2016 11:09
Show Gist options
  • Save Tharos/63c05a27eee61d9e959db4f4c76a39bf to your computer and use it in GitHub Desktop.
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
@milo
Copy link

milo commented Jul 1, 2016

By milo/hydrator:

class Language
{
    /** @var Library[] */
    public $libraries;
}

class Library
{
    /** @var string */
    public $name;
}

$hydrator = new Milo\Hydrator\Hydrator(
    new Milo\Hydrator\Backend\PublicPropertiesBackend;
);

$languages = array_map(function ($data) use ($hydrator) {
    return $hydrator->hydrate(Language::class, $data);
}, Neon::decode($neonSource));

@milo
Copy link

milo commented Jul 1, 2016

PS: klidně ten comment smaž, ať Ti to tu neruší karmu knihovny

@Tharos
Copy link
Author

Tharos commented Jul 1, 2016

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment