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

David Grudl
founder | 8315
+
+3
-

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.