Bonjour,
Voila je rencontre un petit problème avec mon code, je suis en train de suivre de tutoriel sur le renderer et lorsque j'actualise mon site, celui ci me retourne une erreur avec un problème de require
Ce que je fais
Je voudrais que le require soit dans le bon répertoire sachant que actuellement il pointe vers app/Modules/views/index.php alors qu'il devrait être à la racine du projet puis dans public/themes/default/blog/views/index.php
Voici le fichier Renderer.php qui se situe dans le répertoire app\Renderer.php
<?php
namespace App;
class Renderer {
const DEFAULT_NAMESPACE = '__MAIN';
private $paths = [];
public function addPath(string $namespace, ?string $path = null): void {
if (is_null($path)) {
$this->paths[self::DEFAULT_NAMESPACE] = $namespace;
} else {
$this->paths[$namespace] = $path;
}
}
public function render(string $view): string {
if ($this->hasNamespace($view)) {
$path = $this->replaceNamespace($view) . '.php';
} else {
$path = $this->paths[self::DEFAULT_NAMESPACE] . DIRECTORY_SEPARATOR . $view . '.php';
}
ob_start();
require($path);
return ob_get_clean();
}
private function hasNamespace(string $view): bool {
return $view[0] === '@';
}
private function getNamespace(string $view): string {
return substr($view, 1, strpos($view, '/') - 1);
}
private function replaceNamespace(string $view): string {
$namespace = $this->getNamespace($view);
return str_replace('@' . $namespace, $this->paths[$namespace], $view);
}
}
Le fichier RendererTest.php qui se situe dans tests/App/RendererTest.php
<?php
namespace Tests\App;
use App\Renderer;
use PHPUnit\Framework\TestCase;
class RendererTest extends TestCase {
private $renderer;
public function setUp() {
$this->renderer = new Renderer();
}
public function testRenderTheRightPath() {
$this->renderer->addPath('blog', __DIR__ . '/../public/themes/default/Blog');
$content = $this->renderer->render('@blog/demo');
$this->assertEquals('Salut les gens', $content);
}
public function testRenderTheDefaultPath() {
$this->renderer->addPath(__DIR__ . '/../public/themes/default/Blog');
$content = $this->renderer->render('demo');
$this->assertEquals('Salut les gens', $content);
}
}
Comme vous pouvez le voir, lorsque je fait le test avec PHPUnit tout ce passe bien, il trouve bien de dossier public (qui est dans n'est pas a la racine mais dans le fichier tests/public), mais sur le serveur web cela ne fonctionne pas si je veux remonter le répertoire via /../
Ainsi que le fichier BlogModule.php qui se situe
<?php
namespace App\Modules;
use App\Router;
use App\Renderer;
use Psr\Http\Message\ServerRequestInterface;
class BlogModule {
private $renderer;
public function __construct(Router $router) {
$this->renderer = new Renderer();
$this->renderer->addPath('blog', __DIR__ . '/public/themes/default/Blog/views');
$router->get('/blog', [$this, 'index'], 'blog.index');
$router->get('/blog/{slug:[a-z\-]+}', [$this, 'show'], 'blog.show');
}
public function index(ServerRequestInterface $request): string {
return $this->renderer->render('@blog/index');
}
public function show(ServerRequestInterface $request): string {
return $this->renderer->render('@blog/show');
}
}
Ce que je veux
Je voudrais avoir la bonne redirection sans le problème de require et ainsi afficher la page index.php qui se situe dans le dossier public/themes/default/Blog/views/index.php
Ce que j'obtiens
J'obtiens une erreur sur mon serveur web (via wamp) la voici :
Warning: require(C:\wamp64\www\app\Modules/views/index.php): failed to open stream: No such file or directory in C:\wamp64\www\app\Renderer.php on line 36
Fatal error: require(): Failed opening required 'C:\wamp64\www\app\Modules/views/index.php' (include_path='.;C:\php\pear') in C:\wamp64\www\app\Renderer.php on line 36
J'ai essayer diverse chose mais cela ne fonctionner pas.
Je vous remercie d'avance.
Bonne fin de journée !