Nette: napovídání nad template v presenteru nebo controlu 19/10/2018

Jak na napovídání nad objektem template v presenteru nebo controlu?

Každý Nette vývojář se již setkal s proměnnou $template v presenterech nebo controlech. Data do šablony vkládáme sami, ale objekt template obsahuje pár předdefinovaných properties. Ty se tam dostanou z TemplateFactory.

No jo, ale PHPStorm nám žadné klíče, kromě definovaných interfacem ITemplate, nenapovídá. Jak toho tedy docílit?

TemplateProperty

Vytvořme třídu TemplateProperty, která bude obsahovat pouze anotace a budě dědit od Nette\Bridges\ApplicationLatte\Template.

<?php declare(strict_types = 1);

namespace App\Model\Latte;

use App\UI\BasePresenter;
use App\UI\Control\BaseControl;
use Nette\Bridges\ApplicationLatte\Template;
use Nette\Security\User;

/**
 * @property-read User $user
 * @property-read BasePresenter $presenter
 * @property-read BaseControl $control
 * @property-read string $baseUri
 * @property-read string $basePath
 * @property-read array $flashes
 */
final class TemplateProperty extends Template
{
}

Base{Control, Presenter}

V našem BaseControl a BasePresenter definujme phpdoc @property-read.

<?php declare(strict_types = 1);

namespace App\UI\Control;

use App\Model\Latte\TemplateProperty;

/**
 * @property-read TemplateProperty $template
 */
abstract class BaseControl extends Control
{
}

PHPStorm

Každá třída dědící od BaseControl nebo BasePresenter bude nyní PHPStorm správně napovídat.

Až po dopsání jsem si všiml, že David vydal podobný článek.


Jak řešíte napovídání u templates? Podělte se do diskuze.