Knihovny Nette
Balíček dresscode/rules-nette nese migrace všech dvaceti knihoven Nette od verzí 3.0 po
současné. Je v něm přes 900 položek: rozhraní, která přišla o předponu I, konstanty přepsané
z velkých písmen, přejmenované metody a parametry, magické vlastnosti nahrazené gettery, příznaky nahrazené
pojmenovanými argumenty. Zhruba 670 z nich DressCode rovnou opraví, zbytek ohlásí i s tím, co napsat místo toho.
Instalace
composer require --dev dresscode/rules-nette
A do konfigurace typy a skupinu deprecations, jak popisuje Aktualizace knihoven:
types: phpstan
groups:
- deprecations
Balíček nic neregistruje a žádné pravidlo nezapne sám. Data každé knihovny se uplatní jen tehdy, když ji projekt má, a jen ty verze, na které projekt dosáhne.
Co se opraví
Tohle je model psaný pro Nette 3.0, v projektu na současných verzích:
public function add(string $code): void
{
$section = $this->session->getSection('cart');
$items = $section->items ?? []; // Method Nette\Http\SessionSection::__get() is replaced by get($name), which no longer asks first whether it is set, as ?? does
$items[] = Strings::match($code, '~^[A-Z]+-\d+$~', PREG_OFFSET_CAPTURE); // Static method Nette\Utils\Strings::match() takes captureOffset: true instead of `PREG_OFFSET_CAPTURE`
$section->items = $items; // Method Nette\Http\SessionSection::__set() is replaced by set($name, $value)
$section->source = $this->request->getQuery('utm_source', 'direct'); // Method Nette\Http\SessionSection::__set() is replaced by set($name, $value)
// Method Nette\Http\IRequest::getQuery() is replaced by getQuery($key) ?? $default
}
Po dresscode fix:
public function add(string $code): void
{
$section = $this->session->getSection('cart');
$items = $section->items ?? [];
$items[] = Strings::match($code, '~^[A-Z]+-\d+$~', captureOffset: true);
$section->set('items', $items);
$section->set('source', $this->request->getQuery('utm_source') ?? 'direct');
}
První řádek zůstal: čtení vlastnosti nalevo od ?? se u SessionSection nejdřív ptá, jestli je
nastavená, a get() se neptá. Oprava je proto riziková a udělá se, až pravidlo
dresscode/replaced-calls uvedete v klíči fixRisky.
Co všechno balíček opravuje:
- přejmenované třídy a rozhraní:
Nette\ConfiguratornaNette\Bootstrap\Configurator,IRouternaNette\Routing\Router,IControlnaNette\Forms\Controla další; přepíše se import, typ,new,instanceofi atribut, - konstanty přepsané z velkých písmen:
Form::FILLEDnaForm::Filled,IResponse::S404_NOT_FOUNDnaIResponse::S404_NotFound,Presenter::INVALID_LINK_WARNINGnaInvalidLinkWarning, i s řetězy přes víc verzí, - přejmenované metody:
invalidateControl()naredrawControl(),getUnsafeValues()nagetUntrustedValues(),Strings::contains()nastr_contains(), - přejmenované parametry u volání s pojmenovanými argumenty:
setExpiration(time: ...)nasetExpiration(expire: ...),Arrays::map(callback: ...)naArrays::map(transformer: ...), i vparent::__construct()potomka, - výchozí hodnota za
??:getParameter('page', 1)nagetParameter('page') ?? 1, stejně ugetQuery(),getPost(),getCookie(),getHeader()agetOption(), - magické vlastnosti na gettery a settery:
$form->action,$control->caption,$section->user,$section['user'], - příznaky na pojmenované argumenty:
Json::encode($value, Json::PRETTY),Strings::match(),matchAll(),split()aArrays::grep()s konstantamiPREG_*, - volání jiného tvaru:
addUpload($name, $label, true)naaddMultiUpload(),getValues(true)nagetValues('array'),Callback::closure()naClosure::fromCallable(), - anotace na atributy:
@persistenta@crossOriginv presenterech,@filtera@functionve třídách parametrů šablon Latte.
Co zůstane na vás
Kde náhrada není, nebo se používá jinak, DressCode místo ohlásí a řekne, co napsat. Třeba hook
attached(), který komponenty nahradily callbackem metody monitor(), metody Url a
UrlScript, které se přesunuly jinam, nebo třídy, které zmizely bez náhrady:
Method Nette\ComponentModel\Component::attached() is forbidden: the hook is no longer called, pass its logic as the second argument of monitor(), the attached callback
Method Nette\Http\UrlScript::setPath() is forbidden: Nette\Http\UrlScript is immutable, take a changed copy with withPath()
Co knihovna jen tiše označila jako zastaralé, v datech není; s typy to ohlásí, a kde anotace náhradu řekne,
i přepíše dresscode/no-deprecated-members. Změny chování, konfigurace v NEONu a syntaxe šablon Latte data
nezachytí vůbec, ty najdete v průvodcích upgradem jednotlivých knihoven.
Co balíček pokrývá
| knihovna | verze |
|---|---|
nette/application |
3.0 až 3.3 |
nette/assets |
1.0 |
nette/bootstrap |
3.0 až 3.2 |
nette/caching |
3.0 až 3.4 |
nette/component-model |
3.0 až 4.0 |
nette/database |
3.0 až 3.2 |
nette/di |
3.0 až 3.2 |
nette/forms |
3.0 až 3.3 |
nette/http |
3.0 až 3.4 |
nette/mail |
3.1 až 4.1 |
nette/neon |
3.2 až 3.4 |
nette/php-generator |
3.3 až 4.2 |
nette/robot-loader |
3.2 až 4.1 |
nette/routing |
3.0 až 3.1 |
nette/schema |
1.2 až 1.3 |
nette/security |
3.0 až 3.2 |
nette/tester |
2.2 až 2.6 |
nette/utils |
3.0 až 4.0 |
latte/latte |
3.0 až 3.1 |
tracy/tracy |
2.6 až 2.10 |
Verze říkají, ve kterých vydáních knihovna něco změnila, co data zachycují; na novější verzi knihovny, která už nic nepřejmenovala, se nečeká. Aplikaci na Nette 2.4 převedete stejně, jen začnete verzí 3.0, a jak postupovat po jedné hlavní verzi, popisuje Aktualizace knihoven.