Bonjour,
je suis avec intérêt letuto sur comment créer un mini CMS à l'aide de YAML
Je n'en suis encore qu'au début et j'obtiens une erreur dont je ne vois pas la solution.
Mon index.php reprend les lignes suivantes, il me semble exactement comme dans le tuto:
<?php
require "../vendor/autoload.php";
//Constantes
define('content_path', dirname(__DIR__).DIRECTORY_SEPARATOR.'content');
$app = new \Slim\Slim(['debug' => true]);
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator(content_path));
$files = new RegexIterator($files, '/^.+\.yaml$/i', RecursiveRegexIterator::GET_MATCH);
foreach($files as $file){
$file = $file[0];
$path = str_replace(content_path, '', $file);
$path = str_replace('.yaml', '', $path);
$path = str_replace('index', '', $path);
$app->any($path, function(){
echo "salut les gens";
});
}
$app->run();
J'obtiens alors une erreur de l'application Slim m'indiquant que la compilation n'a pas réussie.
error code 2
message:
preg_match(): Compilation failed: a numbered reference must not be zero at offset 8
File:
$ vendor\slim\slim\Slim\Route.php
Quelqu'un aurait-il une idée?
merci d'avance
J'ai eu le meme problème donc je vais supposer que tu travail sur Wamp. En fait le problème vient de la variable $path qui prends des \
$path = str_replace('index', '', $path);
$path = str_replace(DIRECTORY_SEPARATOR, '/', $path);
Cela devrait résoudre ton problème
Salut,
D'après le message, l'erreur ne vient pas du code du tuto à proprement parlé mais de Slim Framework.
Et visiblement du routeur. Vérifies le nom de tes routes et essayes d'éliminer les caractères spéciaux de tes noms de routes, dossiers & fichiers.
Effectivement,
C'est ce par quoi j'ai commencé en me disant que j'avais effectivement dû mal écrire qqch.
J'ai donc vérifier tout mes fichiers mais sans rien trouver.
Du coup j'ai téléchargé l'intégralité des sources et j'obtiens exactement la même erreur.
Je continue de chercher
Merci en tout cas
J'avais la même sous windows, passer sous UNIX a résolu le problème (que je n'explique pas non plus)
As-tu au moins créer un fichier .yaml dans ton dossier de rendu (apparement : 'content') ?
Si tu n'as pas créer de fichier pour démarrer, avec un minimum de contenu dedans, ça ne marche pas !
Il y a bien un fichier index.yaml dans le dossier 'content' ainsi qu'un autre ('works') contenant lui même d'autre fichier .yaml.
Ce qui est étrange c'est que j'obtiens exactement la même erreur en installant les fichiers sources fournis par Jonathan.
Du coup je me plonge dans le tuto sur Slim afin de mieux comprendre comment il fonctionne ;)
Bonjour,
Je rencontre aussi le meme soucis que toi.
Si vous savez d'où cela peut provenir ca serait cool :)
Merci par avance
Je me demande si ce n'est pas la fonction preg_match en elle-même qui pose problème.
Dans le cas déjà évoqué donc, la compilation de Slim échoue car la fonction preg_match renvoie null.
Or en suivant le tuto sur la création d'un router personnel, j'éprouve aussi quelque difficultés avec cette fonction.
Dans slim la Class Route défini une méthode match comme suit:
public function matches($resourceUri)
{
//Convert URL params into regex patterns, construct a regex for this route, init params
$patternAsRegex = preg_replace_callback(
'#:([\w]+)\+?#',
array($this, 'matchesCallback'),
str_replace(')', ')?', (string)$this->pattern)
);
if (substr($this->pattern, -1) === '/') {
$patternAsRegex .= '?';
}
$regex = '#^' . $patternAsRegex . '$#';
if ($this->caseSensitive === false) {
$regex .= 'i';
}
//Cache URL params' names and values if this route matches the current HTTP request
if (!preg_match($regex, $resourceUri, $paramValues)) {
return false;
}
foreach ($this->paramNames as $name) {
if (isset($paramValues[$name])) {
if (isset($this->paramNamesPath[$name])) {
$this->params[$name] = explode('/', urldecode($paramValues[$name]));
} else {
$this->params[$name] = urldecode($paramValues[$name]);
}
}
}
return true;
}
Dans le router (personnel) nous définissons également une fonction match
public function match($url){
$url = trim($url, '/');
$path = preg_replace('#:([\w]+)#', '[^/]+', $this->path);
$regex = "#^$path$#i";
if(!preg_match($regex, $url, $matches)){
return false;
}
var_dump($matches);
}
Le var_dump est censé me renvoyer un tableau or il ne me renvoit rien, même pas un null. Rien.
Je ne comprend plus trop.
Et dans la méthode match() de la class Route du Router (personnel) mon var_dump aurait bien eut du mal a renvoyer qqch puisque le "pattern" de mes routes était mal défini dans mon index php.
// J'ai écrit
$router->get('/posts:id', function($id){ echo "Afficher l'article" . $id;});
// au lieu de
$router->get('/posts/:id', function($id){ echo "Afficher l'article" . $id;});
// un slash qui fait toute la différence :)))))