composer require carono/codegen
Создайте класс от carono\codegen\ClassGenerator
<?phpnamespacecarono\codegen\tests;
usecarono\codegen\ClassGenerator;
useNette\PhpGenerator\Method;
class Demo extends ClassGenerator
{
/** * @param Method $method */publicfunctionmyFunc($method)
{
$method->addParameter('param1');
$method->addParameter('param2', null);
$method->addComment('@param mixed $param1');
$method->addComment('@param mixed|null $param2');
$method->addComment('@return mixed');
$method->setStatic();
$method->addBody('return ?;', [$this->params['value']]);
}
protectedfunctionphpProperties()
{
return ['id' => 100, 'name' => 'myParam'];
}
protectedfunctionphpDocComments()
{
return ['Auto generated class'];
}
protectedfunctionformExtends()
{
return'ArrayObject';
}
protectedfunctionclassConstants()
{
return [
'const1' => 1,
'const2' => 2
];
}
protectedfunctionclassTraits()
{
return ['someTrait'];
}
protectedfunctionclassUses()
{
return ['some\Object1', 'baseObject' => 'some2\Object1'];
}
protectedfunctionclassAfterRender()
{
$property = $this->phpClass->addProperty('afterRenderProperty');
$property->setStatic();
$property->setVisibility('private');
$property->addComment('Event after render');
$method = $this->phpClass->addMethod('dynamicMethod' . $this->params['value']);
$method->setStatic();
$method->addBody('return ?;', [$this->params['value'] * 2]);
}
protectedfunctionformOutputPath()
{
return__DIR__ . DIRECTORY_SEPARATOR . 'output' . DIRECTORY_SEPARATOR . 'MyClassDemo.php';
}
protectedfunctionformClassNamespace()
{
return'carono\codegen\tests\Demo';
}
protectedfunctionformClassName()
{
return'MyClassDemo';
}
}Создайте экземпляр своего генератора и произведите рендер
<?phprequire_once'../vendor/autoload.php';
require_once'Demo.php';
$demo = new \carono\codegen\tests\Demo();
$content = $demo->render(['value' => 500]);
file_put_contents($demo->output, $content);Итоговый файл
<?php/** * This class is generated using the package carono/codegen */namespacecarono\codegen\tests\Demo;
usesome2\Object1asbaseObject;
usesome\Object1;
/** * Auto generated class */class MyClassDemo extends \ArrayObject
{
use \someTrait;
constconst1 = 1;
constconst2 = 2;
public$id = 100;
public$name = 'myParam';
/** Event after render */privatestatic$afterRenderProperty;
/** * @param mixed $param1 * @param mixed|null $param2 * @return mixed */publicstaticfunctionmyFunc($param1, $param2 = null)
{
return500;
}
publicstaticfunctiondynamicMethod500()
{
return1000;
}
}Все публичные методы в вашем генераторе, будут формировать аналогичные методы в итоговом классе. Приватные и защищенные методы игнорируются.
Более подробная информация по генератору можно найти на сайте источника https://packagist.org/packages/nette/php-generator
