Metoda SplFileInfo::getSubPathname() nenalezena
- repli2dev
- Člen | 57
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
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
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 :-)