Bonjour à toutes et à tous,

Je commence l'apprentissage du framwork Slim3 et je suis donc en train de faire le tuto sur Slimframework 3 de Grafikart.
Mon problème intervient avec Twig View.
Lorsque je l'instancie dans le fichier container.php j'obtient l'erreur suivantes :

fatal error : class Slim\View not found in C:\......vendor\slim\views\Twig.php on line 45

Le fichier Twig.php est bien présent dans le vendor\slim\view.
J'ai updaté avec composer au moins 10 fois :).

J'ai googlé cette erreur sur différents forums, et je ne trouve aucunes réponses...mon code a une erreur mais impossible à trouver...

Je vous donne mes tests.
Config server : Wamp>PHP 5.6 ou 7.

Mon arborescence fichiers

app
    Controllers
        PagesController.php
    views
        pages
            home.twig
    container.php
public
    index.php

index.php:

<?php
require '../vendor/autoload.php';
$app = new \Slim\App([
    'settings' => [
        'displayErrorDetails' => true
    ]
]);
require '../app/container.php';
$app->get('/', \App\Controllers\PagesController::class.':home');

$app->run();
?>

JSON :

{
    "name": "ex/d",
    "description": "test",
    "require": {
        "symfony/yaml": "^3.3",
        "php": ">=5.6",
        "slim/slim": "3.1",
        "twig/twig": "^1.23",
        "slim/views": "^0.1.3",
        "slim/csrf": "0.8.*",
        "slim/twig-view": "^2.2"
    },

    "autoload" :{
        "psr-4" : {"App\\" : "app/"}
    },
    "minimum-stability": "beta"
}

Container.php :

<?php
$container = $app->getContainer();

$container['view'] = function ($container) {
    $dir = dirname(__DIR__); /
    var_dump($dir);
    $view = new \Slim\Views\Twig($dir.'/app/views', [
        'cache' => false //$dir.'/tmp/cache'
    ]);
    var_dump($view);
    $basePath = rtrim(str_ireplace('index.php', '', $c['request']->getUri()->getBasePath()), '/');
    $view->addExtension(new Slim\Views\TwigExtension($c['router'], $basePath));

    return $view;
};
?>

PagesController.php :

<?php
namespace App\Controllers;

use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;

class PagesController
{
    private $container;
    public function __construct($container)
    {
        $this->container = $container;
    }
    public function home(RequestInterface $request, ResponseInterface $response)
    {
        //return $response->getBody()->write('hello');
        $this->container->view->render($response, 'pages/home.twig');
    }
}
?>

S'il vous manque des éléments je vous les donnent volontier !

Merci à ceux qui pourront m'aider :)

5 réponses


SimonDevelop
Réponse acceptée

Salut, pour commencer je te conseil de virer le twig/twig de composer, slim/twig-view gère ça tout seul et si tu souhaite avoir la version 1 de twig (pour php5), il te suffit de mettre ceci pour bloqué la version "slim/twig-view": "2.1.*".

Pour ton problème, voici mon code pour twig dans mon container:

$container['view'] = function ($container) {
  $pathView = dirname(dirname(__DIR__));
  if(CACHE === true){
    $cache = $pathView.'/cache';
  }elseif(CACHE === false){
    $cache = false;
  }
  $view = new \Slim\Views\Twig($pathView.'/app/views', [
    'cache' => $cache
  ]);

  $basePath = rtrim(str_ireplace('index.php', '', $container['request']->getUri()->getBasePath()), '/');
  $view->addExtension(new Slim\Views\TwigExtension($container['router'], $basePath));

  return $view;
};

Je viens juste de finir le tuto de grafikart sur slim, j'ai fait mon propre template basé sur le sien avec divers librairies, je le mettrai sur github un moment donné si tu le souhaite :)

PS: En quoi tu as besoin de slim/views dans composer ?

UnUser
Auteur

Hello !

Merci pour ta réponse !

J'ai viré "Twig/Twig" et "php": ">=5.6" et sa marche ;).
Est-ce que la version de PHP ne permettait pas la lecture des namespaces...?!

J'espère que ça pourras aider d'autres personnes.
PS: En quoi tu as besoin de slim/views dans composer ?
-> Pour tester :)

Encore merci pour ton aide.

a+

PS : Où est ce que je peut passer la discussion en RESOLU ?

en cliquant sur le gros bouton vert a droite, il a repondu à ma question .

@UnUser, la version php 5.6 peut lire les namespaces je te rassure, mais le problème viens sans doute d'une des libs que tu avais ajouter au composer, une erreur de lecture de ton container ? Je ne sais pas trop :/
En tout cas, content d'avoir pu t'aider ^^

Si jamais ça interresse quelqu'un => https://github.com/Fukotaku/fufu

UnUser
Auteur

D'acc, je vais jeter un coup d'oeil ;)