2011-12-19 9 views
9

Devo utilizzare l'autoloading per le mie classi personalizzate in Zend Framework 2.0. La mia libreria personalizzata si trova in /vendor/Garvey/library/Garvey. Ho una semplice classe AbstractTable prolungato in /vendor/Garvey/library/Garvey/Db/Table/AbstractTable.php:Libreria personalizzata di caricamento automatico in Zend Framework 2.0

<?php 

namespace Garvey\Db\Table; 

use Zend\Db\Table\AbstractTable; 

abstract class AbstractTable extends AbstractTable 
{ 
    public function getItemById($id) 
    { 

    } 
} 

Nel index.php ho il seguente codice:

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', 
    ) 
))); 

Ma io ho il seguente errore. Cosa mi è mancato?

Fatal error: Class 'Garvey\Db\Table\AbstractTable' not found 

Grazie in anticipo.

+0

cosa? è sbagliato guardare il [manuale] (http://framework.zend.com/manual/en/zend.loader.autoloader.html) – noob

+0

È un Zend Framework 2. Beta1. – pltvs

+0

Perché si utilizza una versione precedente ... (2min) – noob

risposta

11

tuo index.php originale sarebbe lavorato anche se è stato modificato il tasto 'prefissi' a 'namespace' e specificare il percorso come di seguito:

Zend\Loader\AutoloaderFactory::factory(array('Zend\Loader\StandardAutoloader' => array(
    'namespaces' => array(
     'Garvey' => dirname(__DIR__) . '/vendor/Garvey', 
    ) 
))); 
+2

Risposta piacevole, solo una piccola correzione per questa domanda specifica: ''Garvey' => dirname (__ DIR__). '/ vendor/Garvey/library/Garvey'' – Hegemon

+0

plutov, non dovresti aver bisogno di: require_once' vendor/ZendFramework/library/Zend/Loader/AutoloaderFactory.php '; –

2

Ho trovato la risposta. Mettete questo nella vostra index.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(); 
+0

È il modo corretto. –

+0

mmm un po 'frustrante. Potresti essere nuovo ma sono ancora più nuovo! Dove va il sopra? Sto pensando public/index.php –

+0

Sì, hai ragione. index.php – pltvs

11

Oppure si metodo può defime in 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', 
      ) 
     ) 
    ); 
} 

Ma io non lo raccomanderei. Dato che lo scopo di ZF2 è tutto centrato sulla velocità nell'autoloading, il modo migliore è usare lo stile class_map per caricare le tue classi. Funzionerà molto più rapidamente alla fine ma richiederà un lavoro aggiuntivo. Puoi registrare ogni classe nel tuo file class_map.

È possibile creare class_map.php nella root della vostra libreria e posizionare ci

<?php 
return array(
    'Garvey\Db\Table\AbstractTable' => __DIR__ . '/Garvey/Db/Table/AbstractTable.php', 
); 

E aggiungere lì come molte classi come si usa. E in getAutoloaderConfig() è possibile aggiungere voi 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__, 
      ) 
     ) 
    ); 
} 
+0

Secondo me questa è la migliore risposta. Usare una mappa di classi è il modo veloce (se non il più veloce) per caricare le classi e quindi consigliato da Zend. È anche chiaro e facilmente tracciabile. Buon lavoro che cancella questo metodo, grazie! –

3

Matthew Weier O'Phinney spiega in this video che ora ci sono 3 metodi per caricamento automatico:

  • ZF1 stile include_path caricatore automatico (vecchio metodo ZF1 , non raccomandato)
  • Per-namespace/prefix caricamento automatico (nuovo metodo ZF2, meglio)
  • Class-map autoloading (raccomandato e il più veloce)

Un programma di utilità class-map generator è menzionato nei documenti che si prenderà cura di scrivere il /vendor/vendor_name/library/autoload_classmap.php per voi.

La soluzione trovata è simile a quella citata da Matthew nel video per il caricamento automatico di prefissi/prefisso Per-namespace. Seguendo la struttura del codice in ZendSkeletonApplication, tale codice andrebbe nel file /init_autoloader.php anziché nel file /public/index.php.

2

Dai un'occhiata a this post.

Ora il passaggio successivo è aggiungere del codice nella nostra libreria personalizzata.

Prima di tutto aprire un file ./vendor/Garvey/autoload_classmap.php

return array(

    'Garvey\Module' => __DIR__ . '/Module.php', 

    'Garvey\Db\Table' => __DIR__ . '/library/Garvey/Db/Table/AbstractTable.php', 

) 

successivo è ./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__, 
       ), 
      ), 
     ); 
    } 
} 

Ora all'interno della vostra libreria di creare un file all'interno di una cartella:

./vendor/Kdecom/library/Kdecom/Db/Table/AbstractTable.php

Un'ultima cosa che dobbiamo fare wh ich è aggiungere questa libreria nel tuo file application.config.php.

Così il vostro file sarà application.config.php sembra qualcosa di simile in questo modo ...

return array(
    'modules' => array(
     'Application', 
     'Garvey' 
    ), 

    'module_listener_options' => array(
     'config_glob_paths' => array(
      'config/autoload/{,*.}{global,local}.php', 
     ), 

     'module_paths' => array(
      './module', 
      './vendor', 
     ), 
    ), 
); 
+0

Il link al post restituisce 404 –

Problemi correlati