PhpGenerator a výstup podle PSR

před 5 lety od David Grudl  

Potřebujete vygenerovat krásně formátovaný PHP kód? Nejlepší cesta je sáhnout po knihovně Nette PhpGenerator, která disponuje opravdu srozumitelným API.

Příklad:

$class = (new Nette\PhpGenerator\ClassType('Demo'))
	->setFinal()
	->setExtends('ParentClass');

$class->addProperty('id', 1)
	->setVisibility('private')
	->addComment('@var int');

$class->addMethod('getId')
	->addComment('Returns identifier.')
	->setReturnType('int')
	->setBody('return $this->id;');

echo $class;

Výstup dodržuje coding standard používaný v Nette, který je identický s PSR-12 jen s tím rozdílem, že pro odsazování používá tabulátory místo mezer a metody odděluje dvěma prázdnými řádky pro lepší čitelnost:

final class Demo extends ParentClass
{
→   /** @var int */
→   private $id = 1;


→   /**
→	* Returns identifier.
→	*/
→   public function getId(): int
→   {
→   →   return $this->id;
→   }
}

PhpGenerátor nicméně umí generovat kód zcela odpovídající PSR-12. Jak na to?

Samotné volání echo $class je vlastně zkratkou, která o vykreslení požádá vykreslovač Nette\PhpGenerator\Printer a jeho metodou printClass($class). A výstup z tohoto vykreslovače odpovídá Nette standardu. Bude tedy stačit použít jiný vykreslevač, konkrétně PsrPrinter:

$printer = new Nette\PhpGenerator\PsrPrinter;
echo $printer->printClass($class);

Vypíše:

final class Demo extends ParentClass
{
	/** @var int */
	private $id = 1;

	/**
	 * Returns identifier.
	 */
	public function getId(): int
	{
		return $this->id;
	}
}

Pomocí vykreslovače můžete generovat kód nejen tříd, ale i funkcí (printFunction(), printClosure() a printArrowFunction()), metod (printMethod()), jmenných prostorů (printNamespace()) a PHP souborů (printFile()).