2014-04-30 8 views
0

composer.json:Smarty_Internal_TemplateCompilerBase pas trouvé

{ 
    "require": { 
    "smarty/smarty": "v3.1.17" 
    } 
} 

index.php:

define('SMARTY_SPL_AUTOLOAD', 1); // now smarty should use its own autoloader 

require_once __DIR__ . "/vendor/autoload.php"; 

function my_classes_loader($class) { 
    $path = "{$class}.class.php"; 

    if (file_exists($path)) { 
    include_once $path; 
    return true; 
    } 

    return false; 
} 

spl_autoload_register('my_classes_loader'); 

$smarty = new Smarty(); 
$smarty->setCompileDir("templates_c"); 

$smarty->display('main.html'); 

exit(); 

Si je l'ouvre dans le navigateur je reçois

Fatal error: Class 'Smarty_Internal_TemplateCompilerBase' not found in //smarty-example/vendor/smarty/smarty/distribution/libs/sysplugins/smarty_internal_smartytemplatecompiler.php on line XX

Le fichier est là. Et il a du contenu. Et il est accessible/lisible pour PHP etc.

Qu'est-ce que je fais mal? Que manque-t-il?

Répondre

0

C'est une bonne idée de n'avoir qu'un seul point de décision sur le chargement automatique, et ce devrait être uniquement Composer. Essayez de mettre votre propre fonction de chargement automatique, utilisez plutôt une déclaration de chargement automatique dans votre fichier composer.json. Malheureusement, vous n'utilisez pas la norme de nommage PSR-0 ou PSR-4, mais Composer vous permet d'utiliser "classmap" dans ce cas. Pensez à déplacer tous vos noms de fichier pour se conformer à PSR-0.

Et l'auto-chargement smarty devrait déjà être fait en le nécessitant via Composer. Pas besoin de définir cette constante.

Enfin et surtout, je pense que votre fonction de chargement automatique ne devrait rien retourner. Il ne devrait surtout pas renvoyer false s'il ne trouve pas le fichier qu'il contient pour contenir la classe, car selon la façon dont les fonctions de chargement automatique sont ordonnées sur la pile, votre fonction pourrait être appelée en premier pour TOUTES les classes, y compris toutes les Smarty. Si vous renvoyez false dans ces cas, vous détruisez la pile de travail automatique en charge en ne permettant pas aux fonctions ultérieures de charger cette classe.

Donc, dans l'ensemble, il est préférable d'utiliser Composer pour tout chargement automatique. Les développeurs ont tout fait pour fournir la fonction de chargement automatique la plus performante - votre propre fonction ne peut probablement être aussi rapide que la leur, mais sera probablement plus lente.