Jak vyřešit napovídání nad objektem $this->template v PhpStorm
- David Grudl
- Nette Core | 8215
Jak se zbavit upozorňování PhpStormu na „undefined fields“ a aktivovat
napovídání u objektu $this->template
v prezenterech?
Tedy jak změnit tento pohled s podtrženým abc
a prázdným
napovídacím okénkem:
Na tento?
Jednoduše. Stačí do presenteru (například BasePresenter) doplnit tuto anotaci:
/**
* @property-read \Nette\Bridges\ApplicationLatte\Template|\stdClass $template
*/
abstract class BasePresenter extends Nette\Application\UI\Presenter
Aby fungovalo i napovídání dynamicky přidaných proměnných, které je dostupné po dvojím stisknutí Ctrl+Space, je potřeba šablonu uložit do lokální proměnné:
- Tharos
- Člen | 1030
Je to moc hezké, ale k dokonalosti tomu ještě chybí vyřešení šablon
vyrobených přes TemplateFactory
. U nich totiž podtržení
zůstává.
Nicméně není podtržení jako podtržení a tohle má pro programátora jasné poselství:
Field declared dynamically, což přesně vyjadřuje to, co se tam
děje. Prostě daň za __get
a __set
…
Komu ten „warning“ vyloženě vadí, může zvážit ještě řešení
v duchu $template->set('abc', TRUE)
(mohlo by to vcelku hezky
přijímat i pole parametrů pro multi-set)…
Editoval Tharos (15. 8. 2017 9:10)
- Tharos
- Člen | 1030
@CZechBoY Jj. Ale taky to má IMHO drobnou vadu na kráse :). Tu
metodu má až Template
, nikoliv ITemplate
.
TemplateFactory
sice vyrábí Template
, ale
ITemplateFactory
vyrábí ITemplate
… :)
Takže pokud chci být například v nějaké mailovací třídě závislý
na interface ITemplateFactory
namísto na nějaké konkrétní
implementaci (kterou je TemplateFactory
), pak
setParameters
použít nemohu… :)
- Tharos
- Člen | 1030
@TomášVotruba Já osobně bych udělal to, co navrhuje
@CZechBoY. Když může mít ITemplate
metodu
setFile
(což bych osobně čekal až u nějaké
FileTemplate
:-P, protože si dokážu představit i šablonu
uloženou jinde, než ve file systemu), tak proč by nemohlo mít i metodu
setParameters(array $parameters)
(což využije snad každá
myslitelná implementace).
A co se warningu v PhpStormu týče, asi víc než hack se
stdClass
na úrovni abstraktního presenteru se mi asi víc líbí
prostě si nastavit IDE:
Teď jsem to vyzkoušel a funguje to, u instancí tříd s
__get
a __set
už to ten „warning“ nedává.
(Hmmm… Popravdě jdu teď u sebe commit přidávající stdClass
anotaci revertnout.)
Editoval Tharos (15. 8. 2017 12:12)
- Tharos
- Člen | 1030
@CZechBoY Hmm, tak máš pravdu. Když si s tím víc hraju, tak se
to chová tak trochu neintuitivně… Nefunguje to bohužel tak, že by si to
všímalo pouze tříd implementujících __get
nebo
__set
, což jsem si zprvu myslel…
Tady IDE například vůbec nevadí zápis do $this->test
(což bych ještě chápal, protože to je v PHP legitimní), ale přístup
k té hodnotě už IDE vadí, byť v tomto případě PHP ani nepípne.
Editoval Tharos (15. 8. 2017 9:09)
- Tomáš Votruba
- Moderator | 1114
@Tharos @CZechBoY Dokázali byste to nějak dát to pull-requestu? :)
Follow-up po https://github.com/…ion/pull/184