Po upgradu nette na 2.4 – ReflectionException #-1

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Croc
Člen | 270
+
0
-

Zdravím,
mám takový problém po upgradu Nette na verzi 2.4 (z 2.3.x).

Tracy mi vyhazuje (řádek 470):

ReflectionException #-1
Class array does not exist



File: .../vendor/nette/di/src/DI/ContainerBuilder.php:470

460:
461:            $def = $this->definitions[$name];
462:            $factoryClass = $def->getFactory() ? $this->resolveEntityClass($def->getFactory()->getEntity(), $recursive) : NULL; // call always to check entities
463:            if ($class = $def->getClass() ?: $factoryClass) {
464:                $def->setClass($class);
465:                if (!class_exists($class) && !interface_exists($class)) {
466:                    throw new ServiceCreationException("Type $class used in service '$name' not found or is not class or interface.");
467:                }
468:                self::checkCase($class);
469:                if (count($recursive) === 1) {
470:                    $this->addDependency(new ReflectionClass($factoryClass ?: $class)); // zde je označený řádek
471:                }
472:
473:            } elseif ($def->getAutowired()) {
474:                throw new ServiceCreationException("Unknown type of service '$name', declare return type of factory method (for PHP 5 use annotation @return)");

Jsem na Linuxu, PHP 7.0.8–3.

Bootstrap:

<?php

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

use Nette\Forms\Container,
    Nextras\Forms\Controls;

Container::extensionMethod('addOptionList', function (Container $container, $name, $label = NULL, array $items = NULL) {
	return $container[$name] = new Controls\OptionList($label, $items);
});
Container::extensionMethod('addMultiOptionList', function (Container $container, $name, $label = NULL, array $items = NULL) {
	return $container[$name] = new Controls\MultiOptionList($label, $items);
});
Container::extensionMethod('addDatePicker', function (Container $container, $name, $label = NULL) {
	return $container[$name] = new Controls\DatePicker($label);
});
Container::extensionMethod('addDateTimePicker', function (Container $container, $name, $label = NULL) {
	return $container[$name] = new Controls\DateTimePicker($label);
});
Container::extensionMethod('addTypeahead', function(Container $container, $name, $label = NULL, $callback = NULL) {
	return $container[$name] = new Controls\Typeahead($label, $callback);
});

$configurator = new Nette\Configurator;

$configurator->setDebugMode(true); // enable for your remote IP
$configurator->enableDebugger(__DIR__ . '/../log');

$configurator->setTempDirectory(__DIR__ . '/../temp');

$configurator->createRobotLoader()
	->addDirectory(__DIR__)
	->register();

$configurator->addConfig(__DIR__ . '/config/config.neon');
$configurator->addConfig(__DIR__ . '/config/config.local.neon');
//$configurator->addConfig(__DIR__ . '/config/config.production.neon');

$container = $configurator->createContainer();

return $container;

Vůbec netuším čím by to mohlo být. Nevíte někdo?

P.S.:
Ještě to ukazuje Last Muted Error (řádek 104):

Warning: file_get_contents(/var/www/workspace/app/../temp/cache/Nette.Configurator/Container_e37e695e37.php.meta): failed to open stream: No such file or directory

.../vendor/nette/di/src/DI/ContainerLoader.php:104

 94:            if ((@include $file) === FALSE) { // @ - error escalated to exception
 95:                throw new Nette\IOException("Unable to include '$file'.");
 96:            }
 97:            flock($handle, LOCK_UN);
 98:        }
 99:
100:
101:        private function isExpired($file)
102:        {
103:            if ($this->autoRebuild) {
104:                $meta = @unserialize(file_get_contents("$file.meta")); // @ - file may not exist
105:                return empty($meta[0]) || DependencyChecker::isExpired(...$meta);
106:            }
107:            return FALSE;
108:        }
CZechBoY
Člen | 3608
+
0
-

https://forum.nette.org/…nexception-1
Co tobě přijde za ty proměnný na řádku 470?

Editoval CZechBoY (5. 7. 2016 13:51)

Croc
Člen | 270
+
0
-

$argument "array" (5)

CZechBoY
Člen | 3608
+
0
-

tzn. $factoryClass === "array"?

Croc
Člen | 270
+
0
-

Tak už jsem to vyřešil. Problém byl, že jsem měl starou verzi webchemistry/images. Po stažení nové (2.1) je vše v pořádku.

David Grudl
Nette Core | 8228
+
+1
-

Stejně by bylo fajn, kdybys mohl napsat, co obsahují ty proměnné. Jinak s tím těžko něco udělám.

Martk
Člen | 661
+
0
-

@DavidGrudl Padá to na tomhle:
https://github.com/…xtension.php#L77

Protože:
https://api.nette.org/…der.php.html#509 obsahuje reflekci https://github.com/…/Factory.php#L15 a jako první argument je typ array, když to obrátím na @return Nette\Application\Routers\RouteList|array , tak je to v pořádku.

Jestli to je nesrozumitelné, tak to napíšu ještě jednou a více podrobněji.

Editoval Antik (7. 7. 2016 9:42)

Michal Hlávka
Člen | 190
+
0
-

@DavidGrudl souhlasím s Antíkem, řeší to i problém prvního vlákna

David Grudl
Nette Core | 8228
+
0
-

@Antik díky za rozbor!

Můžete prosím ověřit, že v masteru je to OK?

Martk
Člen | 661
+
0
-

Ano, je to v pořádku. Hlásí to smysluplnou chybu:

Class or interface ‚array‘ not found. Is return type of WebChemistry\Images\Router\Factory::createRouter() used in service ‚images.routerFactory‘ correct?

Michal Hlávka
Člen | 190
+
0
-

Je to v pohodě