Migrating to Version 2.4
Minimum required PHP version is 5.6 (for Latte and Tracy 5.4).
Nette version 2.4 means that you have these packages installed in version 2.4.*:
"require": {
"nette/application": "2.4.*",
"nette/bootstrap": "2.4.*",
"nette/di": "2.4.*",
"nette/forms": "2.4.*",
"nette/http": "2.4.*",
"nette/security": "2.4.*",
},
Warning: for other packages, install the latest version that Composer will allow! They may have different versioning. Try
"*" and see what version Composer installs.
Deprecated Stuff
Before testing we recommend to disable reporting E_USER_DEPRECATED and allow it when everything will work:
$configurator->enableDebugger();
error_reporting(~E_USER_DEPRECATED); // note ~ before E_USER_DEPRECATED
Nette\SmartObject
Framework classes now use trait Nette\SmartObject instead of inheriting from Nette\Object, which
differs in several cases:
- supports “emulated properties” only when exists annotation
@property type $name - doesn't support “extension methods”
- doesn't support “getReflection”
- doesn't support getting methods such as
$this->formSubmitted(it is necessary to replace a classic PHP callback[$this, 'formSubmitted']
Using of these features generates E_USER_DEPRECATED and they will be removed in the next version.
Latte
Latte generates deprecation notices if:
- construction
{foreach $langs as $lang}overwrites template parameter$lang - using obsolete convention
{!$name}instead of{$name|noescape} - using
<?php ?>or{? ...}instead of{php ...} - using filter for block or include that is for another content type
- using
|nosafeurlinstead of|nocheck - using
{includeblock}, which replaces the similar macro{import}(just imports blocks, not content around) - error “Incompatible context” occurs when using the block in another context (for example, inside an HTML attribute without quotes), than was defined (for example in normal HTML text)
- accessing variable
$templatefor filters; use($var|trim) - accessing variable
$templatefor parameters; use$this->getParameter('xyz') - accessing to internal underscored variables as
$_control,$_formetc.
Bootstrap and DI
Deprecated are:
- sections (ie. production, development) in single configuration file; use a pair of configuration files config.neon and config.local.neon
- service definitions inheritance
- Statement::setEntity()
Others
- Negative validation rules. An alternative for the
~Form::FILLEDisForm::BLANK, or~Form::EQUALcan be replaced withForm::NOT_EQUAL Nette\Utils\Html::add()is replaced withaddHtml()andaddText()- In PhpGenerator methods
setDocuments(), getDocuments() and addDocument()was replaced bysetComment(), getComment() and addComment() - Flag
SECUREDandRoute::$defaultFlagsare deprecated
Changes
Application
Route and SimpleRouter now generate the same HTTP/HTTPS scheme as was used to access the site. Route, which require specific
protocol, can be defined with scheme (Route('http://domain.cz/<presenter>').
For parameters of type bool used to render/action methods (ie. parameters with default value of true or false) and persistent parameters are now distinguishes between false and null. If the query parameter is not specified, its value is now null, previously it was false. See nette/application#107.
The class, which returns Presenter::getReflection() is not a descendant of Nette\Reflection\ClassType
and also getReflection()->getMethod() is not a descendant of Nette\Reflection\Method. Methods
hasAnnotation and getAnnotation do not parse text following annotation name, such as abc in
@param abc, they parse text in parentheses @param(abc).
Forms
If the form item has a rule via addRule() (that means item is effectively mandatory), you must also set is as
mandatory via setRequired(). Furthermore, setRequired(false) now sets item as optional. This replaces
branches addCondition($form::FILLED).
Internal underscored variables such as $_form are deprecated. If you ever had to manually pass this variable into
template because for snippets to work, this will now lead to an error (eg.
end() expects parameter 1 to be array, null given). You can replace passing to template like
$template->_form = $form with $template->getLatte()->addProvider('formsStack', [$form]), but it
is still workaround, the correct solution is to use {snippetArea xyz} and the invalidate this area together with
snippet.
Validators Form::EMAIL, URL and INTEGER automatically changes the HTML type attribute to
email, url respectively number.
Internal parameter do is now sent via POST as _do to avoid a collision.
Class BaseControl defines getControlPart() and getLabelPart() and they return the same
value as getControl() and getLabel(). Macros <tag n:name> directly use these
methods.
DefaultFormRenderer now correctly added to the group nested components (formerly nested components was rendered at the end of the form), see nette/forms#96.
If you are using your own TemplateFactory, apply these changes done in the original factory.
Remember to update netteForms.js.
Latte
Filters used for text blocks ({block} or {_}...{/_}) or {include} must receive as the
first parameter object Latte\Runtime\FilterInfo, see example.
Macro {contentType} is permitted only in the header of template, and in the element
<script>.
Caching
Nette\Caching\Storages\FileJournal is no longer available.