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ę.
Author: pltvs, 2011-12-19

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',
    )
)));
 11
Author: atti,
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__,
            )
        )
    );
}
 11
Author: Sergey Romanov,
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.

 3
Author: dan_nl,
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();
 2
Author: pltvs,
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',
        ),
    ),
);
 2
Author: Kdecom,
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