Chystá se nette/application 3.3, prosím o otestování

David Grudl
founder | 8322
+
+6
-

Poprosil bych o testování nette/application 3.3.0-RC. Než ji vydám jako stabilní, rád bych si ověřil, že přechod proběhne hladce. Verze přináší modernizaci požadavků, spolehlivější ochranu proti CSRF, pár drobných BC breaků a zároveň deprecuje řadu hodně zastaralých konstrukcí.

Vyžaduje PHP 8.3.

Spolehlivější ochrana proti CSRF

Ochrana nově ověřuje, že požadavek přišel ze stejného originu, pomocí prohlížečové hlavičky Sec-Fetch-Site, kterou posílá sám prohlížeč, místo dřívějšího spoléhání na vlastní SameSite cookie. Je tak bezstavová (nepotřebuje cookie) a funguje spolehlivě i v prohlížečích, kde se SameSite cookie chovaly nespolehlivě. Navíc se kontroluje shoda celého originu (schéma, doména i port), což je přísnější než dřívější same-site, které tolerovalo subdomény. Souvislosti popisuje článek na blogu.

Týká se to automaticky chráněných signálů ve formulářích i atributu #[Requires(sameOrigin: true)]. Jediný praktický dopad: přímé otevření odkazu na signál (záložka, odkaz v e-mailu) už neplatí za same-origin. Pokud to někde potřebujete povolit, použijte #[Requires(sameOrigin: false)].

Další novinky

  • Výchozí mapování je nově App\Presentation\*\**Presenter (místo prastarého *Module\*Presenter). Kdo má mapping nakonfigurovaný explicitně (všichni), nic neřeší. Konečně bez konfigurace odpovídá výchozí struktuře popsané všude v dokumentaci, tedy např. app/Presentation/Home/HomePresenter.php.
  • Fragment URL přes klíč # v argumentech: link('Product:detail', ['#' => 'reviews']) vygeneruje fragment ...#reviews. Hodnota se enkóduje.
  • Presenter::completeTemplate() – nová protected metoda vyčleněná ze sendTemplate(). Lze ji přepsat a doplnit do šablony společné proměnné nebo nastavit soubor.

@anotace nahrazují atributy

Je čas dát sbohem @anotacím, tato verze vás upozorní pomocí deprecation notice, že je máte nahradit za atributy:

  • @persistent#[Nette\Application\Attributes\Persistent]
  • @crossOrigin#[Nette\Application\Attributes\Requires(sameOrigin: false)]
  • @deprecated#[Nette\Application\Attributes\Deprecated]

Application::processRequest() vrací Response

Metoda už odpověď sama neodesílá, ale vrací ji. Odeslání řeší až run(). Motivací je snazší použití v long-running prostředích (RoadRunner, FrankenPHP), integrace PSR a možnost rozšiřovat Application bez kopírování kódu (viz issue #348). Pokud processRequest() voláte ručně, je potřeba si vrácenou odpověď poslat sami:

$response = $application->processRequest($request);
$response->send($httpRequest, $httpResponse);

LatteFactory::create() přebírá ?Control

Toto je BC break v interface LatteFactory. Signatura je nově create(?Control $control = null). Dotkne se toho, kdo má vlastní implementaci LatteFactory.

Deprecate starých raritek

Prastaré sestavování routeru polem:

$router[] = new Route('...');   // deprecated
$router->addRoute('...');       // správně
  • query string v cíli odkazu, např. n:href="Product:detail?x=1&y=2". Správně se argumenty předávají jako: n:href="Product:detail, x: 1, y: 2".
  • přístup k některým magickým vlastnostem ($presenter->view, $layout, $request, $session…) je označen jako zastaralý ve prospěch getterů.
  • odstraněn druhý parametr $default u Component::getParameter()
  • odstraněn tag {ifCurrent} – používejte {if isLinkCurrent('...')}.
  • odstraněna podpora Latte 2 (vyžaduje Latte 3.1)
  • odstraněna kompatibilita se starými názvy tříd (PresenterComponent, IRouter apod.).

Díky předem za otestování i zpětnou vazbu.

stepos2
Člen | 60
+
0
-

Vyzkoušel jsem a za mě ok.

Místo HttpRequest::isSameSite se teď interně volá isFrom, takže při testování requestů je potřeba si namockovat, že isFrom vrací true.

Editoval stepos2 (27. 6. 17:42)

hrach
Člen | 1845
+
0
-

Je čas dát sbohem @anotacím, tato verze vás upozorní pomocí deprecation notice, že je máte nahradit za atributy:

@persistent → #[Nette\Application\Attributes\Persistent]
@crossOrigin → #[Nette\Application\Attributes\Requires(sameOrigin: false)]
@deprecated → #[Nette\Application\Attributes\Deprecated]

edit: aha, oni tam uz jsou, jde jen o notice. tak asi nic no.

Nove nette/application atributy s takto obecnym nazvem mne prijdou lehce zamenitelne – napr. s jinym deprecated attributem. Prislo by mi fajn do nazvu promitnout lepe jejich vyuziti. Prijit s novym nazvem je samozrejme tezsi…

  • #[PersistentRequestParameter], etc.
  • #[RequestRequires], etc.
  • #[DeprecatedRequestTarget], etc.

Editoval hrach (6. 7. 12:40)