Nette Framework 2.2 beta released

5 years ago

David Grudl
Nette Core | 6849
+
0
-

I'd like to announce the Nette Framework 2.2, the biggest revolution in its history.

Nette has been split into small projects Application, Bootstrap, Caching, ComponentModel, Nette Database, DI, Finder, Forms, Http, Latte, Mail, Neon, PhpGenerator, Reflection, RobotLoader, SafeStream, Security, Tokenizer, Tracy and Nette Utils.

It also brings complete new Latte API for standalone usage:

$latte = new Latte\Engine;
$latte->setTempDirectory('/path/to/cache');
$latte->addFilter('money', function($val) { return ...; }); // formerly registerHelper()

$latte->onCompile[] = function($latte) {
    $latte->addMacro(...); // when you want add some own macros, see http://goo.gl/d5A1u2
};

$latte->render('template.latte', $parameters);
// or $html = $latte->renderToString('template.latte', $parameters);

Also Nette\Diagnostics was renamed to nice and short Tracy.

You can, as usual, download complete package Nette 2.2 beta1 or install it via Composer with minimum-stability sets to beta:

"require": {
    "nette/nette": "~2.2.0"
},
"minimum-stability": "beta"

Release RC1

  • added some deprecation warnings for 2.0.x users
  • removed some proxy classes and replaced with class aliases
  • Tracy: added support for old CSS classes in Nette\Diagnostics panels
  • DI: inject is disabled by default
  • DI: reverted support for factories in addService()
  • Latte & Templating: much improved compatibility
  • DI: added old latte & template services; and nette.latte.macros configuration
  • Reflection: removed support for own annotation classes
  • Tracy: uses own file for logging exceptions

Released RC2

  • added deprecated method Nette\Diagnostics\Helpers::textDump(), htmlDump() and clickableDump()
  • Tracy: class .tracy-toggle-collapsed changed to .tracy-toggle.tracy-collapsed
  • Nette\Latte\Engine registers Form macros early to allow override them
  • Nette\Latte\Engine supports accessing compiler and parser via property
  • Nette\Templating\Template uses Nette\Latte\Engine
  • important class aliases are created always (even with Composer)
  • removed NetteLoader::createAliases() (BC break)
  • fixed some bugs with undefined macros in Latte

Released RC3

  • Configurator & NetteExtension moved to Bootstrap
  • renamed internal Nette\Bridges\Framework\ILatteFactory to Nette\Bridges\ApplicationLatte\ILatteFactory
  • Neon moved to namespace Nette\Neon (class Nette\Utils\Neon still works)
  • fixed some compatibility issues with Latte & Tracy
  • Nette\Utils\DateTime::createFromFormat() returns instance of the same class
  • Nette\Utils\Html encodes array in data- attributes as JSON

Released RC4

  • Nette Loader works with Composer

5 years ago

xificurk
Member | 119
+
0
-

What's the purpose of the code duplication between nette/routing and nette/application?

5 years ago

David Grudl
Nette Core | 6849
+
0
-

I mentioned Routing in the list by mistake. Routing is currently experimental project.

5 years ago

David Grudl
Nette Core | 6849
+
0
-

If you want to watch all the commits from all repositories, you may find useful this pipe http://pipes.yahoo.com/pipes/pipe.info?….

5 years ago

RadaR
Member | 39
+
0
-

I have problem with running example for standalone Latte API. Topic moved https://forum.nette.org/…et-not-found#…

Last edited by RadaR (2014-04-09 09:57)

5 years ago

Milo
Nette Core | 1149
+
0
-

I deployed 2.2-rc1 instead of 2.1.1 on one bigger internal website and there is a report.

Template::registerHelperLoader() is deprecated, use dynamic getLatte()->addFilter().

To help understand new API I would hint: ...registerHelperLoader($callback) is deprecated ... getLatte()->addFilter(NULL, $callback). I'll open PR.

EDIT: Misleading, see issue


Source code in Tracy is not collapsed as used to be. I mean deprecated error shows path to trigger_error() in Nette source but not to user code e.g. BasePresenter. Maybe it is my feeling only.


FATAL: Nette\Latte\Macros\MacroSet not found is related to Nette issue I guess.


Maybe dtto.

Latte\CompileException: Unknown macro {label} in ... I had to add:

Nette\Bridges\FormsLatte\FormMacros::install($engine->getCompiler());

It is in one of mine component where I'm creating template manually, not presenter.


LogicException: Latte\Engine::$compiler: Cannot read undeclared property

I used $engine->compiler with old Latte, $engine->getCompiler() solves the problem. I'll open PR to handle few old getters/setters with deprecated error.


Fatal Error: Class 'Nette\Latte\Macros\FormMacros' not found

Whole this thing is my very old version of manual form rendering. I guess it can be solved as mentioned Nette issue but I solved it directly:

Old code:

$macroSet->addMacro('form',
    'Nette\Latte\Macros\FormMacros::renderFormBegin($_form, %node.array)',
    'Nette\Latte\Macros\FormMacros::renderFormEnd($_form)'
);

New code:

$macroSet->addMacro('form',
    'Nette\Bridges\FormsLatte\FormMacros::renderFormBegin($_form, %node.array)',
    'Nette\Bridges\FormsLatte\FormMacros::renderFormEnd($_form)'
);

At all, I have not problems with migration.

Last edited by Milo (2014-04-22 14:04)

5 years ago

David Grudl
Nette Core | 6849
+
0
-

Source code in Tracy is not collapsed

Yes, source code is collapsed only for exceptions. Maybe it can be collapsed for E_USER_DEPRECATED too.

FATAL: Class not found

This is annoying :-( For some classes we can (re)create fake classes, but for some of them we need to create alias (because they can be used with instanceof).

What about this solution? https://github.com/…2718dfb01a7f

Unknown macro {label}

That's right, I added old Nette\Latte\Engine here https://github.com/…e39e8c6dc8b6#… which registers all macros.

5 years ago

Milo
Nette Core | 1149
+
0
-

I tried migration once again with:

"require": {
    "nette/nette": "2.2.*",
},
"minimum-stability": "dev"

so I'm on commit 3839d7.

I hit the problem with macro redefining. I have a form component which uses latte for rendering self. In a short:

class LatteForm extends Nette\Application\UI\Form
{
    public function getTemplate()
    {
        $engine = new Nette\Latte\Engine;
        $macroSet = new Nette\Latte\Macros\MacroSet($engine->compiler);

        // redefine {form ...} macro
        $macroSet->addMacro('form',
            'Nette\Latte\Macros\FormMacros::renderFormBegin($_form, %node.array)',
            'Nette\Latte\Macros\FormMacros::renderFormEnd($_form)'
        );

        $template = new Nette\Templating\FileTemplate;
        $template->registerFilter($engine);
        $template->_form = $this;
    }
}

When rendered I get following error, because old {form} macro is not rewritten.

Missing form name in {form}

I guess it is because of some class_alias() or empty class combinations, but I didn't find it. When I switch namespaces form Nette\Latte to new Latte only, I must:

# rewrite
$engine->compiler
# to
$engine->getCompiler()

# and add
Nette\Bridges\FormsLatte\FormMacros::install($engine->getCompiler());

Now it works perfectly in old way.

EDIT: And with aliases.php is the migration more comfortable.

Last edited by Milo (2014-04-23 10:47)

5 years ago

MartinitCZ
Member | 590
+
0
-

Where is nette.latte.macros section for macros install over neon?

5 years ago

David Grudl
Nette Core | 6849
+
0
-

Try 2.2-RC1

5 years ago

mrtnzlml
Member | 145
+
0
-

There is still problem with Nette\ObjectMixin. For example EntityManager from Kdyby causes Fatal Error in method __call:

<?php
public function __call($name, $args) {
    return Nette\ObjectMixin::call($this, $name, $args);
}
?>

Next problem is with class Nette\Templating\ITemplate. Can't use instanceof in tests…

Last problem is with method Nette\Diagnostics\Helpers::clickableDump(). It doesn't exist anymore (?). (Kdyby\Events)

Not sure if it's problem of framework or extensions, but it is not without BC breaks.

5 years ago

David Grudl
Nette Core | 6849
+
0
-

Milo: can you test it with https://github.com/…e4666ad6eba4

mrtnzlml: clickableDump() has been added. What Fatal Error causes __call?

5 years ago

MartinitCZ
Member | 590
+
0
-

@**David Grudl**: On RC version is it OK … Weird

5 years ago

mrtnzlml
Member | 145
+
0
-

David Grudl wrote:

clickableDump() has been added. What Fatal Error causes __call?

Sorry… Fatal Error: Class 'Nette\ObjectMixin' not found

5 years ago

David Grudl
Nette Core | 6849
+
0
-

This should be fixed in 2.2-RC2

5 years ago

Milo
Nette Core | 1149
+
0
-

I tried to migrate on 2.2-RC2. The only error I get is:

Fatal Error
Class 'Nette\Latte\Macros\FormMacros' not found

It can be solved by:

class_alias('Nette\Bridges\FormsLatte\FormMacros', 'Nette\Latte\Macros\FormMacros');

After that, I get deprecated notices only.

And I tried to migrate one smaller website from Nette 2.0.8 directly to 2.2-RC2. I had to remove sections from config and it works perfectly.

5 years ago

chemix
Bronze Partner | 973
+
0
-

I get this error, and Tracy (bar) not start

...
  </div>
</body>
</html>

Fatal error: Cannot use Tracy\Dumper as Dumper because the name is already in use in /.project./vendor/nette/nette/Nette/deprecated/Diagnostics/Helpers.php on line 12

5 years ago

David Grudl
Nette Core | 6849
+
0
-

Milo: I have added this class to NetteLoader. But I suppose you are using Composer, so it is question whether Composer should create Nette Loader too.

Chemix: this is the most irritating bug in PHP, fixed.

You can test these last updates via Composer with "nette/nette": "~2.2.0@dev" or download Nette-2.2dev.zip.

5 years ago

chemix
Bronze Partner | 973
+
0
-

Thanks David,

without LiveTranslator is Tracy back :)

but if I want add LiveTranslator to Tracy I get this error

</html>

Fatal error: Class 'Nette\Latte\Macros\CoreMacros' not found in /.project./libs/LiveTranslator/Panel/Panel.php on line 174

and the “bad line is”

Nette\Latte\Macros\CoreMacros::install($latte->getCompiler());

5 years ago

David Grudl
Nette Core | 6849
+
0
-

chemix: are you using Composer? In this case the Nette Loader, responsible for creating class aliases, is not loaded. (Some aliases are created automatically, but not all of them, because it has negative performance impact.)

So there are two options: load NetteLoader manually in bootstrap.php:

Nette\Loaders\NetteLoader::getInstance()->register();

It will create aliases automatically on-the-fly, together with warnings. Or create all aliases manually, with no warnings:

array_walk(Nette\Loaders\NetteLoader::getInstance()->renamed, 'class_alias');

5 years ago

chemix
Bronze Partner | 973
+
0
-

David: Yes, i use Composer.

use Nette\Application\Routers\Route;
use Nette\Diagnostics\Debugger;
use Nette\Configurator;

require __DIR__ . '/../vendor/autoload.php';

$configurator = new Configurator;
$configurator->setTempDirectory(__DIR__ . '/../temp');
$configurator->enableDebugger(__DIR__ . '/../log');
$configurator->createRobotLoader()
    ->addDirectory(__DIR__)
    ->addDirectory(__DIR__.'/../libs')
    ->register();

NetteLoader is not RobotLoader?

  1. After I add
Nette\Loaders\NetteLoader::getInstance()->register();

i get Red screen with

User Warning
Class Nette\Latte\Macros\CoreMacros has been renamed to Latte\Macros\CoreMacros

it's good, I know what I need to fix it. And after correct this line Tracy works with Live Translator

  1. but when i try add this line to code
array_walk(Nette\Loaders\NetteLoader::getInstance()->renamed, 'class_alias');

i get this

Warning: Cannot redeclare class Nette\Config\Configurator in /.project./app/bootstrap.php on line 13

Warning: Cannot redeclare class Nette\Config\CompilerExtension in /.project./app/bootstrap.php on line 13

Warning: Cannot redeclare class Nette\Diagnostics\BlueScreen in /.project./app/bootstrap.php on line 13

... and 9 others

5 years ago

David Grudl
Nette Core | 6849
+
0
-

Thats right. You can place @ before array_walk or use:

array_walk(Nette\Loaders\NetteLoader::getInstance()->renamed, function($original, $alias) {
    if (!class_exists($alias) && !interface_exists($alias)) {
        class_alias($original, $alias);
    }
});

(fixed after chemix comment)

5 years ago

chemix
Bronze Partner | 973
+
0
-

This solution works perfect

@array_walk(Nette\Loaders\NetteLoader::getInstance()->renamed, 'class_alias');

the second solution (with if class exists) get this error

Warning: Cannot redeclare class Nette\Latte\IMacro in /.project./app/bootstrap.php on line 14

IMHO the best solution was with NetteLoader.

Thanks David.

5 years ago

David Grudl
Nette Core | 6849
+
0
-

Hmmm, there should be if (!class_exists($alias) && !interface_exists($alias)), I fixed the code.

5 years ago

Milo
Nette Core | 1149
+
0
-

@dg For my needs is RC3 perfect!

…so it is question whether Composer should create Nette Loader too.

I guess yes. It will be in autoloaders queue after ComposerLoader, imho no big deal.

5 years ago

David Grudl
Nette Core | 6849
+
0
-

Hmmm, it's good point, Nette Loader is after ComposerLoader. https://github.com/…a4a046c39924

5 years ago

David Grudl
Nette Core | 6849
+
0
-

There is Released 2.2 RC4 with Nette Loader in Composer.

5 years ago

chemix
Bronze Partner | 973
+
0
-

i try update nette from 2.1.2 to 2.2-rc4 on another project and get this red message :/

Nette\InvalidStateException

Found sections 'common', 'production', 'development' in configuration, but corresponding extensions are missing
common:
    parameters:
        site:
            develMode: true
            version: mavericks

    php:
        date.timezone: Europe/Prague

    nette:
        application:
            errorPresenter: Error

        session:
            expiration: 14 days


    services:
        routerFactory: RouterFactory
        router: @routerFactory::createRouter


    factories:


production < common:
    parameters:
        site:
            develMode: false


development < common:
...
// Create Dependency Injection container from config.neon file
$configurator->addConfig(__DIR__ . '/config/config.neon');
$configurator->addConfig(__DIR__ . '/config/config.local.neon', $configurator::NONE); // none section
$container = $configurator->createContainer();
...

5 years ago

ZZromanZZ
Member | 87
+
0
-

Maybe this will help …

...
// Create Dependency Injection container from config.neon file
$configurator->addConfig(__DIR__ . '/config/config.neon',  $configurator::AUTO);
$configurator->addConfig(__DIR__ . '/config/config.local.neon'); // none section
$container = $configurator->createContainer();
...

5 years ago

David Grudl
Nette Core | 6849
+
0
-

@chemix: this should show notice, fixed https://github.com/…b505257dde01

5 years ago

chemix
Bronze Partner | 973
+
0
-

@zzromanzz it helps

@david i got nice notice

thanks

User Warning

Config file '/..path../app/config/config.neon' has sections, call addConfig() with second parameter Configurator::AUTO.

5 years ago

chemix
Bronze Partner | 973
+
0
-

Just question,

now I get this error:

User Deprecated

Nette\DI\Container::__get() is deprecated; use getService() or enable nette.container.accessors in configuration.

after I added

nette:
    application:
        errorPresenter: Error
    container: # <---
        accessors: TRUE # <---

everything works, but I can't find “where is the problem?”

5 years ago

MartinitCZ
Member | 590
+
0
-

@**chemix**:
I think that:

$this->context->myCar // deprecated
$this->context->getService('myCar') // It is OK

5 years ago

marian-r
Member | 1
+
0
-

I can't update to the latest version, with the latest commit in bootstrap. I still have https://github.com/…585c38720564 as the latest.

composer.json:

"require": {
    "nette/nette": "2.2.*",
},
"minimum-stability": "dev"

How to solve?

5 years ago

chemix
Bronze Partner | 973
+
0
-

@martinit You are right, i had in index.php this: (from oooold sandbox)

// Run application.
$container->application->run();

this one works perfect:

$container->getService('application')->run();

thanks

5 years ago

MartinitCZ
Member | 590
+
0
-

@**chemix**: This would be better:

$container->getByType('\Nette\Application\Application')->run();

5 years ago

Eda
Member | 212
+
0
-

I also migrate some of my projects to Nette 2.2 RC4. It works fine a I didn't notice any big problem.

The only things it was necessary to change:

1.

// from
$latte->registerHelper(...)
// to
$latte->addFilter(...)

2.
Thats a pitty, that there is no full replacement for helper loaders. Now, if you have class with lot of functions and each of them is helper, you have to iterate over them and add each helper separately.

// from
$latte->registerHelperLoader()

// to
foreach (...) {
    $latte->addFilter(...)
}

3.
Fix “Declaration of MyMacros::install() should be compatible with Latte\Macros\MacroSet::install(Latte\Compiler $compiler)”

class MyMacros extends MacroSet
{
    //public static function install(\Nette\Latte\Compiler $compiler)
    public static function install(\Latte\Compiler $compiler)
    {
        ...
    }
}

Question related to composer: is there any way to allow minimum stability beta only for nette and its packages? Now, if I have something like this in composer.json:

{
    ...
    "require": {
        "php": ">=5.3.2",
        "nette/nette": "~2.2.0",
        "kdyby/translation": "@dev",
        ...
    },
    "minimum-stability": "beta"
}

It installs for instance instead of Symfony/Translation 2.4 (stable) beta version of 2.5. It is not problem for now, but it could be in future and in more complex projects.


So… thank you, well done.

Last edited by Eda (2014-05-11 11:26)

5 years ago

Majkl578
Moderator | 1379
+
0
-

@Eda:

"nette/nette": "~2.2.0@beta",

or

"nette/nette": "2.2.*@beta",

Last edited by Majkl578 (2014-05-11 03:49)

5 years ago

Jan Tvrdík
Nette guru | 2553
+
0
-

@Majkl578: That will not work. He needs to list all nette packages with @beta.

5 years ago

David Grudl
Nette Core | 6849
+
0
-

Are we ready for 2.2 stable?

5 years ago

MartinitCZ
Member | 590
+
0
-

@**David Grudl**: YES !!!!!!! :)

5 years ago

MartinitCZ
Member | 590
+
0
-

@**David Grudl**: Please, can you create lisf of changes, between 2.1 & 2.2 (renamed classes..)?