Metoda SplFileInfo::getSubPathname() nenalezena

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

Mám v projektu použité Nette 2.0-dev (neprefixované, protože klient běží na PHP 5.2) a po upgradu z PHP 5.3 na 5.4 (na mém stroji) dostávám chybu 500 a záznam v logu:

PHP Fatal error:  Call to undefined method SplFileInfo::getSubPathName() in /<cesta>/libs/Nette/Utils/Finder.php(295) : runtime-created function on line 2

Zkoušel jsem upgradovat na 2.0 Nette a vypadá to, že i tak to bude chtít i dost úprav (obzvláště konfigurace atd…). Jak opravit chybu bez toho?

Panda
Člen | 569
+
0
-

Vím, že toto téma je opravdu, ale opravdu hodně staré, ale na podobnou chybu jsme teď při migraci některých starých projektů narazili také a věřím, že projekty postavené na starších verzích Nette tu s námi ještě nějaký čas budou.

Protože úprav při přechodu na novou verzi by bylo opravdu hodně, aktualizoval jsem jen Finder. Jako základ jsem použil Finder z aktuální verze Nette pro PHP 5.3/5.4, ze kterého jsem odstranil všechny namespaces tak, aby seděl do hierarchie neprefixové verze pro PHP 5.2.

Spolu s třídou Finder je nutné vzít i Nette\Iterators\Filter a Nette\Iterators\RecursiveFilter a udělat s nimi stejný proces – odstranit všechna namespace. Kromě nich jinak třída Finder nemá žádné další závislosti.

Protože Finder se používá při sestavení souborů pro RobotLoader, je nutné přidané třídy zaregistrovat ručně i v NetteLoaderu. Stačí přidat do pole $list v souboru Loaders\NetteLoader.php následující dva prvky:

'filter' => '/Utils/Filter.php',
'recursivefilter' => '/Utils/RecursiveFilter.php',

Upravené třídy a patch pro NetteLoader.php jsem publikoval: filter-getsubpathname-fix.tar.gz

jazby
Člen | 44
+
+1
-

Já bych možná ještě dodal, že pro mě nejjednoduší oprava tohoto problému byla následující:

Přejmenovat třídy (dodat třeba N prefix):
Nette/Iterators/Filter.php

<?php
- class CallbackFilterIterator extends FilterIterator
+ class NCallbackFilterIterator extends FilterIterator
?>

Nette/Iterators/RecursiveFilter.php

<?php
- class RecursiveCallbackFilterIterator extends FilterIterator implements RecursiveIterator
+ class NRecursiveCallbackFilterIterator extends FilterIterator implements RecursiveIterator
?>

Následně volání těchto tříd upravit v Finder.php

Nette/Utils/Finder.php

<?php
- $iterator = new RecursiveCallbackFilterIterator($iterator, create_function('$file', 'extract(NClosureFix::$vars['.NClosureFix::uses(array('filters'=>$filters)).'], EXTR_REFS);
+ $iterator = new NRecursiveCallbackFilterIterator($iterator, create_function('$file', 'extract(NClosureFix::$vars['.NClosureFix::uses(array('filters'=>$filters)).'], EXTR_REFS);
?>
<?php
- $iterator = new CallbackFilterIterator($iterator, create_function('$file', 'extract(NClosureFix::$vars['.NClosureFix::uses(array('groups'=>$groups)).'], EXTR_REFS);
+ $iterator = new NCallbackFilterIterator($iterator, create_function('$file', 'extract(NClosureFix::$vars['.NClosureFix::uses(array('groups'=>$groups)).'], EXTR_REFS);
?>

a upravit NetteLoader
Nette/Loaders/NetteLoader.php

<?php
- 'callbackfilteriterator' => '/Iterators/Filter.php',
+ 'ncallbackfilteriterator' => '/Iterators/Filter.php',
?>
<?php
- 'recursivecallbackfilteriterator' => '/Iterators/RecursiveFilter.php',
+ 'nrecursivecallbackfilteriterator' => '/Iterators/RecursiveFilter.php',
?>

A Nette 2.0-beta na PHP 5.4 pak funguje na 100%.
Snad to někomu pomůže, když už se to tady nakouslo :-)

Marax
Člen | 28
+
0
-

jazby, právě jsi mi ušetřil spoustu času. Dík.