Pojďme otestovat nette/application 3.1

před 2 měsíci

David Grudl
Nette Core | 7057
+
+20
-

Poprosil bych o testování nette/application 3.1.0-RC, která přináší několik novinek důležitých pro typované šablony.

Přes všechny změny v šablonách by nemělo dojít k žádnému porušení zpětné kompatibility. Ale samozřejmě je to potřeba ověřit, obzvlášť pokud nakládáte se šablonou pro mě nečekaným způsobem.

Hlavní změny u šablon:

  • Nette\Bridges\ApplicationLatte\Template přestává používat magické settery a gettery, takže obvyklý zápis $template->val = $var je skutečným zápisem do proměnné objektu $template, což přinese i malé zrychlení (mnoho uživatelů nejspíš ani netušilo, že se tam používaly magické settery a gettery)
  • createTemplate() v Presenter a Control skrze TemplateFactory nyní nevyrábějí Template, ale buď jejího potomka a novou třídu DefaultTemplate
  • …nebo pokud existuje třída pojmenovaná stejně jako presenter či control, jen místo koncovky Presenter/Control končící na Template, vyrobí objekt této třídy
  • zároveň createTemplate() přijímá volitelný parametr kterým lze přímo říct, jakou třídu má vyrobit. Abych skutečně předešel porušení zpětné kompatibility, je tento parametr zatím skrytý
  • Presenter::sendTemplate() přijímá volitelný parameter $template, můžete tedy odeslat jakoukoliv šablonu, třeba tu, kterou si vytvoříte pomocí createTemplate()

Deprecated stuff:

  • Template::__toString() je deprecated ve prospěch renderToString(), jeho účel pradávno převzaly bloky v Latte
  • Presenter::getContext() také vyhazuje deprecation notice. Je na čase tento krok udělat. Pokud DI kontejner v presenterech používáte a není snadné se ho zbavit, nevadí, předejte si jej konstruktorem nebo proměnnou s anotací inject a používejte nadále (klidně si přepište metodu getContext). Jde o to, aby se ho zbavil samotný UI\Presenter.
  • RouteList: deprecated jsou rozhraní Countable and IteratorAggregate, nahrazuje je metoda getRouters()
  • RouteList a SimpleRouter mají deprecated flagy. Dnes existuje jen flag ONE_WAY. Nelekejte se, vypadá to jako zásadní změna, ale ve skutečnosti jde o to, že k velkému posunu routování došlo ve verzi Nette 3.0, ve které se routy flagují trošku jinak a tohle je krůček v postupném přesunu k modernímu způsobu a úprava by měla být triviální.

Prosím tedy o otestování, ať může v brzké době vyjít a vývoj se posune dál směrem k šablonám testovaným pomocí PHPStanu.

před 2 měsíci

David Grudl
Nette Core | 7057
+
+1
-

Někdo se zmiňoval, že (string) $template používá (asi v souvislosti s tvorbou emailů). Pokud je to používané, tak bych stav deprecated zrušil.

před 2 měsíci

enumag
Člen | 2129
+
0
-

Dovolím si menší rýpnutí. Něco velmi podobného typovaným šablonám používám v Nette i Symfony už dávno (dávám tomu koncovku View). Ale proč by tenhle value objekt měl dědit Nette\Bridges\ApplicationLatte\Template, to mi tedy do hlavy nejde. :-) Imo by Template měla být final a custom View objekt by mela byt jedna z promennych.

před 2 měsíci

David Grudl
Nette Core | 7057
+
0
-

Rýpat snad není potřeba, pokládat otázky je zcela ok. Dědit od té třídy se samozřejmě nemusí. Hledal jsem, jak jsi na to narazil, jde asi o formulaci z odkazovaného vlákna? To bylo myšleno jinak, v návaznosti na update, upravím to.

před 2 měsíci

ppar
Backer | 298
+
0
-

Ahoj, stále 3.1.0-RC obsahuje bug https://github.com/…n/issues/253 , tato chyba se týká i v3.0.4.

před 2 měsíci

enumag
Člen | 2129
+
0
-

Přesně tak, v odkazovaném vláknu je všude class ArticleTemplate extends Nette\Bridges\ApplicationLatte\Template. Pokud ten objekt nemusí nic dědit ani implementovat tak máš palec nahoru. ;-)

před 2 měsíci

David Grudl
Nette Core | 7057
+
0
-

Musí implementovat Nette\Application\UI\ITemplate. Dědit nemusí, ale pokud chceš používat metody jako $template->addFilter() atd, tak si je pak musíš dopsat.

před 2 měsíci

Tomáš Jacík
Člen | 144
+
0
-

Zatím jsem to zkoušel jen zběžně v mý nejsložitější appce a zdá se, že je všechno ok. Budu ještě zkoušet. Co jsem dneska z toho PoSobota streamu nepochopil je ta DefaultTemplate, můžeš to prosím nějak osvětlit, jak donutit appku, aby použila tu DefaultTemplate, když nemám vytvořenu speciální třídu pro presenter?

před 2 měsíci

Šaman
Člen | 2427
+
+2
-

Tomáš Jacík: Já to pochopil tak, že se použije DefaultTemplate vždy, když apliaci nedonutíš použít něco jiného.
Dnešní přednášky mě taky navnadily, jdu to zkusit na aktuální aplikaci.

před 2 měsíci

Ages
Člen | 87
+
0
-

Chtěl jsem vytvořit BaseTemplate, kterou bych použil jako rodiče a nemohl jsem přijít na to proč mi nefungují kontroly proměnných, až jsem nakonec zjistil, že tato třída nemůže být abstract.
Je toto chování správné?

// Toto nefunguje
abstract class BaseTemplate extends Template
{
	//...
}
// Toto funguje
class BaseTemplate extends Template
{
	//...
}

Editoval Ages (1. 4. 10:09)

před 2 měsíci

Ages
Člen | 87
+
0
-

Pokusil jsem se to ještě jednou vrátit na abstract a nyní to již kontroluje i s abstract.
Popravdě nerozumím tomu, kde mohlo dojít k problému, nic jiného jsem neupravil.

před 2 měsíci

CZechBoY
Člen | 3540
+
0
-

@Ages Nejspíš ti chyběla implementace pro konkrétní template.

před 2 měsíci

Ages
Člen | 87
+
0
-

@CZechBoY právě že ne :(, pokud by se mi to ještě stalo tak dám vědět.

před 27 dny

xr
Backer | 93
+
0
-

@DavidGrudl Davide, ved je tam zretelny BC break: Nette\Bridges\ApplicationLatte\TemplateFactory::createTemplate ma parameter naviac, takze podedena trieda nie je kompatibilna… Co takto pouzit rovnaky „trik“ so skrytym parametrom ako si spravil v Control? Nie ze by som mal rad tieto parametre (presne naopak), ale pre zachovanie kompatibility.

před 27 dny

Martk
Člen | 553
+
0
-

@xr Souhlasím s tebou, že je to BC break. Ale chyba je už v tom, že tato třída není final. Měla by se u této třídy použít dekorace a ne znásilňovat dědičnost.

před 27 dny

xr
Backer | 93
+
0
-

@Martk aby mohla byt final, musela by byt implementacia dostatocne flexibilna, aby neblo nutne kopirovat cely kod sablony kvoli malemu rozsireniu. Pouzivam rozsirenie, kde sa upravuje metoda render sposobom, ktory urcite 99.99% ostatnych uzivatelov nebude potrebovat a pokryvat tento use-case v zakladnej sablone Nette by bolo zbytocne.

@DavidGrudl Dalsi zjavny BC Break je v pripade podedenych sablon – pretoze dedia od Nette\Bridges\ApplicationLatte\Template, a teda nie je dostupna premenna $control, $presenter atd., ktore sa predtym setovali navrdo, v 3.1 sa setuju po kontrole na property_exists.

Takze za mna upravy sablon v 3.1 nie su vobec spatne kompatibilne, pretoze moj balicek rozsirujuci funkcnost sablon po upravach, aby bol kompatibilny s 3.1, nebude spatne kompatibilny s verziou pracujucou s 3.0 == BC Break.

EDIT: David, este nechapem, preco je __toString zrazu reprecated – aky je problem po ~10 rokoch so (string) $template nechapem.

Inak to vyzera, ze to po uprave Template a TemplateFactory slape normalne.

Editoval xr (29. 4. 16:49)

před 27 dny

David Grudl
Nette Core | 7057
+
0
-

Hypotetických BC breaků je tam samozřejmě spousta, jde o to podchytit ty reálné. Jestli to dobře chápu, ty dědíš od třídy TemplateFactory a z createTemplate() vracíš objekty Template? Jaký to má důvod?

před 27 dny

xr
Backer | 93
+
0
-

TemplateFactory predsa sluzi na vytvaranie Template …

Mam podedenu (Nette\Bridges\ApplicationLatte) TemplateFactory a pouzivam vlastne sablony, ktore dedia od Nette\Bridges\ApplicationLatte\Template.

UPDATE: nejedna sa o hypoteticke bc breaky – teraz som to vyskusal a pisem len, na co som narazil. Su to minutove zalezitosti, ale nie su spatne kompatibilne. Jediny problem mi sposobuje ta uprava __toString.

Editoval xr (29. 4. 16:56)

před 27 dny

David Grudl
Nette Core | 7057
+
0
-

A můžeš mi to trošku popsat? Co je cílem tvých modifikací?

před 27 dny

xr
Backer | 93
+
0
-

Neviem sice ako to pomoze obohatit situaciu, ale mozem popisat.

TemplateFactory mam upravene tak, ze mi na kazdej vytvaranej sablone zaregistruje filtre, premenne, global providers a spusti genericke dekoratory, ktore si mozu vyvojari zaregistrovat v NEONe.
Jednoducha ale velmi sikovna uprava, ktora umoznuje napriklad plosnu registraciu heleprov bez nutnosti riesit, ci su pritomne v sablonach vytvaranych prezentermi alebo v sablonach, ktore sa vytvaraju pre spracovanie mailerom.

V Template mam upravenu render metodu tak, ze s vystupom od parenta este nieco kontrolujem a pripadne korigujem vystup. Toto je dost okrajovy pripad, bohuzial specificka poziadavka od zakaznika. Ak existuje lepsi sposob pre globalny vystupny filter, neviem o nom.

Ako som pisal, je jednoduche pridat parameter a zopar atributov podla vzoru DefaultTemplate. Akurat chcem uviest na spravnu mieru, ze upravy v 3.1 _nie su kompatibilne_.

A s deprecated __toString mam problem preto, ze pouzivam paralelne aj iny sablonovaci system a teraz budem vsade musiet riesit nejaky instanceof alebo nieco podobne. Pritom jednoduchy (string) typecast nic nepokazi, navyse od 7.4 uz je mozne aj pekne vyhadzovat vynimky.

před 27 dny

Šaman
Člen | 2427
+
0
-

xr:

David Grudl napsal(a):

Přes všechny změny v šablonách by nemělo dojít k žádnému porušení zpětné kompatibility. Ale samozřejmě je to potřeba ověřit, obzvlášť pokud nakládáte se šablonou pro mě nečekaným způsobem.

Řekl bych, že nakládáš se šablonou pro něho nečekaným způsobem. Proto zjišťuje k čemu to poutřebuješ.

Jinak nejde to řešit běžným způsobem bez dědění?

<?php
class myTemplateFactory
{

	public class createTemplate(UI\Control $control = null)
	{
		$template = $this->netteApplicationTemplateFactory->createTemplate($control);
		$template->tadySiSNíMohuDělatCoChci();
		return $template;
	}

}
?>

před 27 dny

xr
Backer | 93
+
0
-

Ano, urcite je to jednym z rieseni. 👍 S velkou pravdepodobnostou je lepsie tu tovaren poskladat kompozicne ako dedit.

Myslel som, ze je dostatocne zrejme, ked uvediem, ze _dedim_ tu tovaren. Dedenie nefinalnych tried predsa nie je nicim vynimocnym. Nechcem tu robit z toho ziaden „flame“ alebo velku vedu, len som na to chcel upozornit, kedze David chcel feedback. Jedine ten typecast ma trapi.

Mozno je vhodnejsie napisat, ze _pouzitie_ je rovnake ako vo verzii 3.0, spatna kompatibilita vo vyzname semantickeho verzovania tam urcite zachovana nie je.

před 27 dny

Felix
Nette Core | 1004
+
0
-

Osobne tez podedivam (no jo) TemplateFactory a registruju tam globalni filtry a makra, pripadne vyplnuju globalni promenne pro vsechny sablony.

Kdyby byla final, pouzival bych spis nejakou formu dekorace. :-)

před 27 dny

David Grudl
Nette Core | 7057
+
0
-

Ptám se jak to používáš, protože prostě rozhoduju, jestli trošku zkomplikuji život tobě teď, nebo v budoucnu sobě.

Vidím to tak, že druhý parametrý parameter createTemplate() asi dám skrytý.

Na __toString už přišly reakce, že se opravdu používá, takže ji rušit nebudu.

Co se týče rozdělení Template / DefaultTemplate, tam je hodně komplikované. Bude výhodné mít pod názvem Nette\Bridges\ApplicationLatte\Template čistou šablonu, od které se teď bude asi dost dědit a ponechat víceméně současné řešení i za cenu BC breaku, který se dá velmi snadno vyřešit. Zvažuju ještě přejmenovat DefaultTemplate na LegacyTemplate.

před 25 dny

xr
Backer | 93
+
0
-

Ano, ten BC break je jednoduche vyriesit, akurat to prosim uved do popisu, nech je to zrejme na prvy pohlad 👍

Vidím to tak, že druhý parametrý parameter createTemplate() asi dám skrytý.

^ Za mna, ak to oznacis v dokumentacii, tak to nie je ziaden problem. Navyse, ak prerobim tovaren podla komentara vyssie (nahradim dedicnost za kompoziciu), tak tento problem neexistuje. Jedine je potrebne upravit inicializaciu novej TempalteFactory, ktora po novom prijima Nette\TemplateFactory ako argument konstruktoru.

Na __toString už přišly reakce, že se opravdu používá, takže ji rušit nebudu.

^ Skvele!