These are chat archives for php-usergroup-dresden/phpugdd

1st
Mar 2016
Holger Woltersdorf
@hollodotme
Mar 01 2016 22:07

@sandrokeil Die Zend-Klassen haben mir leider nicht weiter geholfen, da via Reflection keine

use MyVendor\MyProject\MyClass;

Injections möglich sind. Auch war das direkte Laden einer Datei beim ClassGenerator nicht möglich.

Ich habe mir jetzt selbst was geschrieben, wo ich eine Patch-Datei anlege, in der ich uses, properties und methods inkl. Body angeben kann. Aus dieser Datei wird dann ein Patch-Objekt erstellt, das ich dann direkt auf eine vorhandene Klasse anwenden kann.

Anwendung sieht am Ende so aus:

<?php

$classPatcher = new ClassPatcher(  '/path/to/source/Class.php'  );
$classPatcher->applyPatch( new ClassPatch(  '/path/to/ClassPatch.php'  )  );

print_r( $classPatcher->getContent() );

$classPatcher->save();

Und ein Patch-File in etwa so:

<?php

$body = <<<EOF
if ( is_null( \$this->mySqlManager ) )
{
    \$config = new MySqlConfig();
    \$connection = new MySqlConnection(
        \$config->getHost(), \$config->getPort(), \$config->getDatabase(),
        \$config->getUser(), \$config->getPassword()
    );

    \$this->mySqlManager = new MySqlManager( \$connection );
}

return \$this->mySqlManager;
EOF;

$docBlock = <<<EOF
/**
 * @return MySqlManager
 */
EOF;

return [
    'uses'       => [
        'Vendor\\MyProject\\Managers\\MySqlManager',
        'Vendor\\MyProject\\Configs\\MySqlConfig',
        'Vendor\\Sql\\Connections\\MySqlConnection',
    ],
    'properties' => [
        [
            'modifier' => 'private',
            'name'     => 'mySqlManager',
            'type'     => 'MySqlManager',
            'value'    => null,
        ],
    ],
    'methods'    => [
        [
            'modifier'   => 'public',
            'name'       => 'getMySqlManager',
            'parameters' => null,
            'body'       => $body,
            'docBlock'   => $docBlock,
        ],
    ],
];
Wer hat Lust Unit Tests dafür zu schreiben? :sparkles: :smile: