Alors je n'utilise pas le meme container que grafikart, j'utiliser un serviceProvider.
Voici mon service provider, dans lequel je déclare ma classe TwigView et dans lequel je déclare un chemin par défault.
class ViewServiceProvider extends AbstractServiceProvider
{
protected $provides = [
TwigView::class,
PhpView::class
];
public function register()
{
$container = $this->getContainer();
$container->share(TwigView::class, function () use ($container) {
// Route par défaut
$path = __DIR__ . '/../Ressources/Views';
$loader = new Twig_Loader_Filesystem($path);
$twig = new Twig_Environment($loader, [
'cache' => false,
]);
// Ajout des extensions
$routes = $container->get(RouteCollection::class);
$twig->addExtension( new TwigRoutePathExtension($routes));
// $twig->addExtension( new TwigPageFantaExtension());
return new TwigView($twig, $loader);
});
$container->share(PhpView::class, function(){
return new PhpView();
});
}
}
Voici ma class TwigView
namespace Framework\Views;
use Psr\Http\Message\ResponseInterface;
use Twig_Environment;
use Twig_Loader_Filesystem;
class TwigView extends View
{
protected $twig;
public $loader;
public function __construct(Twig_Environment $twig, Twig_Loader_Filesystem $loader)
{
$this->twig = $twig;
$this->loader = $loader;
}
public function render(ResponseInterface $response, $view, $data = [])
{
// $this->loader->getPaths('blog');
$response->getBody()->write(
$this->twig->render($view, $data)
);
return $response;
}
}
Dans un controller du blogmodule , je récupère mon Twigview grace à l'autowiring. Et je rajoute un chemin avec un namespace.
class BlogController
{
public $view;
private $postTable;
public function __construct(TwigView $view)
{
$this->view = $view;
$this->view->loader->addPath(__DIR__.'/../Ressources/Views', 'blog');
}
Et lorsque j'appelle ma vue, par exemple store qui rendra la vue blog dans le namespace blog.
public function index(ServerRequestInterface $request, ResponseInterface $response)
{
$lists = ['mizzou', 'emilie', 'moi'];
// return $this->view->render($response, 'blog.twig', compact('lists'));
return $this->view->render($response, '@blog/blog.twig', compact('lists', 'posts'));
}
Ma vue qui se trouve dans le blogbungle est bien récupérer.
Il respecte bien le chemin déclarer.
<h1>BlogBundle</h1>
{% block body %}
<ul>
{% for post in posts %}
<li>
<a href="#">{{ post.name }}</a>
</li>
{% endfor %}
</ul>
{% endblock body %}
<p>
<a href="{{ path('facebook_path') }}">Facebook</a>
</p>
Le problème est que dès que je rajoute le template, il ne veut pas me le récupérer
{% extends '@blog/Layouts/master.twig' %}
Le problème ne se pose pas lorsque, je decide de renvoyer la vue sans le namespace. La vue et le template sont bien rendu.
return $this->view->render($response, 'blog.twig', compact('lists', 'posts'));
Dans l'autre cas , voici l'erreur.
Fatal error: Uncaught Twig_Error_Syntax: A template that extends another one cannot include content outside Twig blocks. Did you forget to put the content inside a {% block %} tag?
Je vous remercie pour l'aide.