Bonjour, ou re-bonjour ^^
J'ai effacé mon post précédent car trop compliqué.
Je souhaiterais ajouter composer à mon MVC.
voici sa structure :
/
/Application
/System
/vendor (composer)
composer.json
index.php
et voici mon index.php racine :
// Load the config file
require_once 'config.inc';
/*
* __autoload($class)
* @desc Please refer to PHP documentation
*/
function __autoload($class) {
if (is_file(LIBS.$class.'.core.php')) require LIBS.$class.'.core.php'; //LIBS = /system/libs
}
new Dispatcher(); //chargement par autoload($class) qui fait le require necessaire ($class.core.php)
Je n'ai aucun namespace.
Mon problemeil y a conflit entre ma fonction __autoload() et celle de composer. quand j'ajoute le require "/vendor/autoload.php"; j'ai une fatal error :class Dispatcher not found
j'ai bien suivi le tuto de Grafikart à propos de Composer, fait l'exemple simple de la vidéo moi-même afin de bien comprendre... mais j'ai pas compris en fait... je ne m'en sors pas avec les namespaces.
j'ai mis des namespace system/libs à toutes mes classes "core" mais ensuite c'est dans mes class.controller.php que ça ne marche plus. Du coup j'ai mis use system/libs à mes class.controller mais c'est PDO (dans database.core) qui n'est plus trouvé.
Bonjour,
Ton problème ne viendrait pas du fait que tu as défini un fonction "__autoload" et que composer avec son autoloader déclare aussi la fonction avec le même nom?
les namespaces n'ont qu'une seule utilité, c'est éviter les conflicts entre différentes bibliothèques.
Si tu veux protéger les classes de ton MVC, tu leur mets un namespace
Pour ton projet en lui même, tu peux t'en passer
Pour info DS ne sert à rien pour les chemins que tu crées, tu peux mettre / à la place
le DIRECTORY_SEPARATOR de php sert à parser des chemins fournis par le système comme dirname()
Alors là Merci, comme quoi on peut tourner en rond ...
du coup j'ai modifié comme ça
require "vendor/autoload.php";
require_once 'config.inc';
function Mvc_autoload($class) {
if (is_file(LIBS.$class.'.core.php')) require LIBS.$class.'.core.php';
}
spl_autoload_register('Mvc_autoload');
new Dispatcher();
et ça semble marcher nickel. il y a d'ailleurs des sujets interessant sur cette fonction spl_autoload_register();
ça ne resoud pas mon pb d'espace de nom mais au moins ça fait cohabiter composer et mon mvc ^^
c'est ce que je voudrais mais je n'arrive pas à me servir des namespace.
en fait si je met un namespace par exemple MvcCore pour Dispatcher, je dois ajouter use MvcCore\Dispatcher, puis je dois faire ça avec toutes mes classes... je vois pas trop l’intérêt à vrai dire...
Les namespaces c'est simple
tu choisis des namespaces par catégorie d'objet, par exemple maboite\monprojet\models
ou maboite\monprojet\controllers
tu affectes un namespace à chaque classe
Si dans une classe tu dois appeler une classe du même namespace, tu indiques seulement le nom de la classe.
Si tu dois appeler une classe d'un autre namespace, il faut utiliser 'use'
use maboite\monprojet\controllers\PostController;
$crtl = new PostContoller();
ou alors utiliser le nom complet de la classe
$ctrl = new \maboite\monprojet\controllers\PostController();
il faut penser à mettre un antislah devant si c'est un nom complet, y compris pour les classes sans namespace comme PDO
sinon il rajoute le namespace courant devant;
$pdo = new \PDO(...);
... fetch(\PDO::FETCH_ASSOC)
Si tes classes sont réutilisables, comme par exemple un MVC, alors tu peux les mettre dans le dossier vendor
\vendor\maboite\mvc
il faut ensuite mettre à jour le composer.json pour faire correspondre les namespaces et les chemins
"require": {},
"autoload": {
"psr-4": {
"App\\": "app",
"maboite\\": "vendor\\maboite",
"monprojet\\models\\": "app\\models",
"monprojet\\controllers\\": "app\\controllers"
}
}
et un petit coup de composer update pour que ce soit pris en compte
C'est bien sur ton fichier Database.core.php que les namespaces buggent ? peut tu envoyer le code ? (sans les identifiants bien sur)
Merci pour ces précisions
@Sparkosis : entre autre mais en spécifiant le namespace \ partout ça fonctionne.
je précise :
mes classes Core ne sont pas instanciées pour la plupart.
elles me servent de base pour mes classes controllers ou models propres à chaque vue. (par exemple class Accueil extend Controller)
par exemple la classe Dispatcher dispose de cette méthode :
www.monsite/accueil
function loadController(){
$name = ($this->request->controller);
//$name vaut accueil
$file ='application'.DS . 'controllers' . DS .$name.'.control.php';
// $file vaut 'application/controllers/accueil.control.php'
if(!is_file($file)){
$this->load_error();
return false;
}else{
require $file; // le fichier existe
return new $name(); //hop on le crée.
}
}
ici la classe Accueil extend Controller est créée.
classe qui s'occupe de créer la classe Accueil_Model extend Model
et de créer la vue 'Accueil' qui se trouve dans le répertoire Views/Accueil.
Donc tout part de www.monsite/accueil, il se passera la même chose pour www.monsite/blog . le tout est de faire les fichiers blog.control.php, blog.model.php et le répertoire views/blog.
j'ai fais comme ceci
mes classes Core prennent le namespace MvcCore
mes classes controllers le namespace MvcCore\Controller
mes classes models le namespace MvcCore\Models
ce que je ne comprend pas c'est pourquoi je devrais me prendre le chou avec tous ces namespace ? c'est l'enfer !!!
je dois préciser partout de quel namespace ça vient, du coup quand je fais get_called_class() je n'obtient plus un simple 'Accueil' mais un \MvcCore\Controller\Accueil sur lequel je dois faire des explodes pour récupérer à nouveau 'Accueil'
je dois caser des use, des \machin\chose par milliers, mettre des \ devant mes PDO...
bref pourquoi faire ?
ok du coup j'ai viré les namespace de mon projets et gardé ceux de mon mvc :) youhou ! merci :)