Autoload custom library w Zend Framework 2.0
Muszę użyć autoloadingu dla moich niestandardowych klas w Zend Framework 2.0. Moja własna Biblioteka znajduje się w /vendor/Garvey/library/Garvey
. Mam prostą rozszerzoną klasę AbstractTable w /vendor/Garvey/library/Garvey/Db/Table/AbstractTable.php
:
<?php
namespace Garvey\Db\Table;
use Zend\Db\Table\AbstractTable;
abstract class AbstractTable extends AbstractTable
{
public function getItemById($id)
{
}
}
W indeksie.php mam następujący kod:
require_once 'vendor/ZendFramework/library/Zend/Loader/AutoloaderFactory.php';
Zend\Loader\AutoloaderFactory::factory(array('Zend\Loader\StandardAutoloader' => array(
'prefixes' => array(
'Garvey' => 'vendor/Garvey/library/Garvey',
)
)));
Ale mam następujący błąd. Co mnie ominęło?
Fatal error: Class 'Garvey\Db\Table\AbstractTable' not found
Z góry dziękuję. 5 answers
Twój oryginalny indeks.php zadziałałoby również, jeśli zmienisz klucz' prefiksy ' na 'przestrzenie nazw' i podasz ścieżkę jak poniżej:
Zend\Loader\AutoloaderFactory::factory(array('Zend\Loader\StandardAutoloader' => array(
'namespaces' => array(
'Garvey' => dirname(__DIR__) . '/vendor/Garvey',
)
)));
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-22 20:03:20
Lub możesz dezaktywować metodę w Module.php
public function getAutoloaderConfig()
{
$return = array(
'Zend\Loader\ClassMapAutoloader' => array(
__DIR__ . '/autoload_classmap.php'
),
'Zend\Loader\StandardAutoloader' => array(
'namespaces' => array(
__NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
'Garvey' => __DIR__ . '/../../vendor/Garvey/library/Garvey',
)
)
);
}
Ale nie polecam. Ponieważ cel ZF2 skupia się na szybkości w automatycznym ładowaniu, najlepszym sposobem jest użycie stylu class_map do ładowania klas. Będzie działać znacznie szybciej na końcu, ale wymaga dodatkowej pracy. Możesz zarejestrować każdą klasę w pliku class_map.
Możesz utworzyć class_map.php w katalogu głównym Biblioteki i umieść tam
<?php
return array(
'Garvey\Db\Table\AbstractTable' => __DIR__ . '/Garvey/Db/Table/AbstractTable.php',
);
I dodaj tam tyle klas, ile używasz. I w getAutoloaderConfig() możesz dodać classmap
public function getAutoloaderConfig()
{
$return = array(
'Zend\Loader\ClassMapAutoloader' => array(
__DIR__ . '/autoload_classmap.php',
__DIR__ . '/../../vendor/Garvey/library/Garvey/class_map.php',
),
'Zend\Loader\StandardAutoloader' => array(
'namespaces' => array(
__NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
)
)
);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-11 02:43:40
Matthew Weier O ' Phinney wyjaśnia w ten film , że obecnie istnieją 3 metody automatycznego ładowania:
- ZF1-style include_path autoloader ( stara metoda ZF1, niezalecana)
- Per-namespace / prefix autoloading (nowa metoda zf2, lepsza )
- Class-map autoloading ( polecane i najszybsze )
A generator map klasy jest wymieniony w dokumentach, które zajmą się pisaniem /vendor/vendor_name/library/autoload_classmap.php
dla Ciebie.
Rozwiązanie, które znalazłeś, jest podobne do tego, o którym wspomina Matthew w filmie dla przestrzeni nazw/prefiksu autoloading. Zgodnie ze strukturą kodu w ZendSkeletonApplication , kod ten trafiłby do pliku /init_autoloader.php
, a nie do pliku /public/index.php
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-09 11:53:53
Znalazłem odpowiedź. Umieść to w swoim indeksie.php:
require_once 'vendor/ZendFramework/library/Zend/Loader/StandardAutoloader.php';
$loader = new Zend\Loader\StandardAutoloader();
$loader->registerNamespace('Garvey', realpath('vendor/Garvey/library/Garvey'));
$loader->register();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-13 09:05:50
Rzućcie okiem na Ten post .
Teraz następnym krokiem jest dodanie kodu do naszej niestandardowej biblioteki.
Najpierw otwórz plik ./vendor/Garvey/autoload_classmap.php
return array(
'Garvey\Module' => __DIR__ . '/Module.php',
'Garvey\Db\Table' => __DIR__ . '/library/Garvey/Db/Table/AbstractTable.php',
)
Następna jest ./vendor/Garvey/Module.php
namespace Garvey;
use Zend\ModuleManager\Feature\AutoloaderProviderInterface;
class Module implements AutoloaderProviderInterface
{
public function getAutoloaderConfig()
{
return array(
'Zend\Loader\ClassMapAutoloader' => array(
__DIR__ . '/autoload_classmap.php',
),
'Zend\Loader\StandardAutoloader' => array(
'namespaces' => array(
__NAMESPACE__ => __DIR__ . '/library/' . __NAMESPACE__,
),
),
);
}
}
Teraz w bibliotece Utwórz plik w folderze:
./vendor/Kdecom/library/Kdecom/Db/Table/AbstractTable.php
Ostatnią rzeczą, którą musimy zrobić, to dodać tę bibliotekę do pliku application.config.php
.
Więc Twój plik application.config.php
będzie wyglądał mniej więcej tak...
return array(
'modules' => array(
'Application',
'Garvey'
),
'module_listener_options' => array(
'config_glob_paths' => array(
'config/autoload/{,*.}{global,local}.php',
),
'module_paths' => array(
'./module',
'./vendor',
),
),
);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-03 19:50:54