Bonjour à tous,
J'ai suis en train de réaliser un projet de CMS avec Slim et twig. J'ai commencé sans composer avec un dossier libs/ à l'ancienne mais en voyant le tuto composer, je me dis que je me suis casser la tête pour rien ...
Je débute donc avec composer pour essayer de convertir mon projet pour avoir des vendor gérer de façon plus simple (et avec l'autoloader) plutot que :
require "ma/libraire/au/fond/du/dossier";
J'ai installé composer, pas de soucis.
J'ai créer mon JSON :
{
"name": "toto/demo",
"require": {
"slim/slim": "dev-master",
"slim/views": "dev-master",
"slim/extras": "dev-master",
"twig/twig": "2.0.*@dev",
"j4mie/idiorm": "dev-master",
"kriswallsmith/assetic": "1.3.*@dev",
"phpmailer/phpmailer": "dev-master",
"zetacomponents/debug": "dev-master"
},
"authors": [
{
"name": "toto toto",
"email": "toto@toto.org"
}
],
"autoload": {
"psr-4": {
"App\\" : "App",
"Project\\" : "Project"
}
}
}
Le soucis, c'est que ce soit dans extras ou views, Twig appel son propre autoloader ... Et du coup, ça ne marche pas. J'ai vu pas mal de solution sur le net qui préconise de modifier le code du vendor mais dans ce cas, je vois plus l'intéret de composer s'il faut toucher aux vendors ...
Warning: Uncaught exception 'ErrorException' with message 'require_once(/Autoloader.php): failed to open stream: Aucun fichier ou dossier de ce type' in /home/xxxxxxxxxxxxxx/www/vendor/slim/extras/Slim/Extras/Views/Twig.php:112
Stack trace:
0) /home/xxxxxxxxxxxxxx/www/vendor/slim/extras/Slim/Extras/Views/Twig.php(112): Slim\Slim::handleErrors(2, 'require_once(/A...', '/home/xxxxxxxxxxxxxx...', 112, Array)
1) /home/xxxxxxxxxxxxxx/www/vendor/slim/extras/Slim/Extras/Views/Twig.php(112): Slim\Extras\Views\Twig::getEnvironment()
2) /home/xxxxxxxxxxxxxx/www/vendor/slim/extras/Slim/Extras/Views/Twig.php(96): Slim\Extras\Views\Twig->getEnvironment()
3) /home/xxxxxxxxxxxxxx/www/vendor/slim/slim/Slim/View.php(255): Slim\Extras\Views\Twig->render('secured/login.t...', NULL)
4) /home/xxxxxxxxxxxxxx/www/vendor/slim/slim/Slim/View.php(243): Slim\View->fetch('secured/login.t...', NULL)
5) /home/xxxxxxxxxxxxxx/www/vendor/slim/slim/Slim/Slim.php(757): Slim\View->display('secured/login.t...')
6) /home/xxxxxxxxxxxxxx/www/App/Controller/back/secured.php(9): Slim\Slim->rende in <b>/home/xxxxxxxxxxxxxx/www/vendor/slim/extras/Slim/Extras/Views/Twig.php</b> on line <b>112</b><br />
Fatal error: Slim\Extras\Views\Twig::getEnvironment(): Failed opening required '/Autoloader.php' (include_path='.:/usr/local/php5.5/lib/php') in <b>/home/xxxxxxxxxxxxxx/www/vendor/slim/extras/Slim/Extras/Views/Twig.php</b> on line <b>112</b><br />
Voici la fonction qui pose problème dans la class Extras/Views/Twig :
public function getEnvironment()
{
if (!$this->twigEnvironment) {
// Check for Composer Package Autoloader class loading
if (!class_exists('\Twig_Autoloader')) {
require_once self::$twigDirectory . '/Autoloader.php'; // <- la ligne 112
}
\Twig_Autoloader::register();
$loader = new \Twig_Loader_Filesystem($this->getTemplateDirs());
$this->twigEnvironment = new \Twig_Environment(
$loader,
self::$twigOptions
);
// Check for Composer Package Autoloader class loading
if (!class_exists('\Twig_Extensions_Autoloader')) {
$extension_autoloader = dirname(__FILE__) . '/Extension/TwigAutoloader.php';
if (file_exists($extension_autoloader)) require_once $extension_autoloader;
}
if (class_exists('\Twig_Extensions_Autoloader')) {
\Twig_Extensions_Autoloader::register();
foreach (self::$twigExtensions as $ext) {
$extension = is_object($ext) ? $ext : new $ext;
$this->twigEnvironment->addExtension($extension);
}
}
}
return $this->twigEnvironment;
}
Pour créer mon objet Twig dans Slim :
$this->_slim = new \Slim\Slim(array(
'view' => new \Slim\Extras\Views\Twig(),
'cache' => CACHE_PATH,
'templates.path' => TEMPLATES_PATH,
'mode' => SLIM_MODE
));
Merci d'avance pour votre aide. Je ne dois pas être le seul gars qui a installé slim et twig à avoir ce soucis ...
Il n'est plus la peine de pré-chargé Slim/Extras, surtout si tu charges préalablement la dernière version de Slim (v 2.6.1à ce jour).
En effet, il est indiqué sur le fork de Codeguy que cette addition est désormais dépréciée (DEPRECATED, en anglais) et la plupart de ses fonctions ont été intégrée directement dans Slim.
Autre hypothèse : tu devrais éviter de charger les version dev-master, en cours de développement en ce moment même, avec peu de fiabilité sur son fonctionnement.
Voici mes dernières trouvailles en la matière, si ça peut t'aider :
pour la partie boot de Slim :
$app = new Slim([
'debug' => true,
'view' => new \Slim\Views\Twig(),
'charset' => 'utf-8'
]);
ensuite, afin de profiter des fonctions & extensions de Twig :
// Views
$view = $app->view();
$view->setTemplatesDirectory('../app/views');
$view->parserExtensions = array(
new \Slim\Views\TwigExtension(),
new Twig_Extension_Debug()
);
Ces dernières lignes facilitent l'écriture de fonctions personnalisées pour Twig, à l'aide de addFilter :
$twig = $app->view()->getEnvironment();
$twig->addFilter($trimByWords);
REMARQUE : $trimByWords est une variable fonctionnelle, permettant d'afficher un contenu assez long, coupé par un nombre de mots à définir. Inséré dans le template Twig, c'est un filtre personnalisé qui fonctionne parfaitement.
{{ content|trimByWords(150) }}
Voilà. En espérant avoir donné quelques éléments de réponse, pas trop compliqués...