Conseils pour une architecture PHP5 simple et efficace

Nouveau WRInaute
Bonjour à tous.

Dans le cadre d'un projet de site web développé en PHP5, j'aimerais recueillir quelques avis sur l'architecture de mon code. Je désire avant tout un code simple, performant et maintenable. Pour informations, mon site doit être traduit en plusieurs langues.

serveur :
- Debian/Apache/PHP5/mysql

Base de données :
- schéma classique avec une table par entité + table association.
- une base de données par langue
- tables texte_menu, texte_footer, ... contenant les textes du site

Acces aux données :
- une classe Connect.class.php qui prend en parametre $_GET("lg"), correspondant à la langue (www.example.com/fr, www.example.com/us,...), pour attaquer la bonne base
- des Manager.class.php qui ont pour attribut la connection et qui font des requetes SQL, grâce à des méthodes de classes

Code:
public function getNews($i) {
$sql = "SELECT * FROM news ORDER BY date limit $i";
$res = mysql_query($sql, $this->connect);
return $rew;
}

Affichage dynamique :
- des pages php dans /inc

Code:
<?php>
include_once "/core/ManagerNews.php";
$mng = new ManagerNews();
$news = $mng->getNews(10);
?>

<div class="recent-news">
	<div class="news">
		<?php while ($row = mysql_fetch_assoc($res)) {
		echo '<p>'.$row["title"].'</p>';
		echo '<p>'.$row["description"].'</p>';
		?>
	</div>
</div>


Page html/php
index.php


Code:
<body>
	<?php include_once 'inc/menu.php' ?>
	<?php include_once 'inc/home_news.php' ?>
	<?php include_once 'inc/footer.php' ?>
</body>



Arborescence des fichiers :

index.php
error.php
news.php
.htaccess
robots.txt
...

/inc/menu.php
/inc/footer.php
/inc/home_news.php
...

/core/db/Connect.class.php
/core/mng/Manager_News.class.php
/core/mng/Manager_Client.class.php
/core/utils/GenerateSitemap.class.php

/script/generateSitemap.php
/script/testServeur.php

Concernatn l'URl rewritting, est-il plus judicieux d'utiliser l'url comme index (SELECT * FROM news WHERE url="nouveautes-google"), de mettre l'id dans l'URL (SELECT * FROM news WHERE id substr(19, 2, "nouveautes-google-25") ou de faire une requete suppléméentaire pour retrouver l'identifiant ?

Merci d'avance pour vos réponse et l'analyse de mon architecture.
 
WRInaute passionné
Pour avoir un code maintenable déjà préfère l'utilisation de template (et donc d'un moteur de template) et pas mixer HTML avec le PHP (dur à lire, pas vraiment évolutif, ...).
Ensuite, si tu es en PHP5 tu as la librairie PDO pour l'accès à la base. C'est plus propre que faire des mysql_query() dans ton code.

Et pour tes méthodes de classe : pourquoi renvoyer un retour de base plutôt qu'une collection de news? Autant profiter des méthodes de classe et séparer données et code métier.

Ensuite evite les include_once() pour inclure un fichier de classe. Utilise la méthode __classLoader() pour automatiser ça.

Pour avoir un truc bien cadré et propre tu peux aussi te pencher sur un framework (Zend, Synfony, Cake, ...).
 
WRInaute accro
Je ne vois pas l'intérêt du titre totalement en majuscule, mis à part nous faire passer l'envie de lire ton sujet et d'y répondre.
 
Nouveau WRInaute
J'ai remis le titre en minuscules et utilisé www.example.com

Je vous avourais que j'ai une mauvaise expérience des frameworks (notamment en Java, Spring, Hibernate, EJB, ...) et je pense que la mise en place d'un Frameworks est intéressante pour de gros projets avec beaucoup de développeurs, mais peut-être pas pour les sites que je développe.

Je ne comprends pas l'intèrêt du classeLoader.
include_once(/core/ManagerNews.class.php) ne prend qu'une ligne et ne demande aucune installation.

require 'classloader.php';
ClassLoader::addPath('/my/class/dir');
prend 2 lignes, requiert de créer une classe et doit être "lègérement" plus gourmand en mémoire.

Concernant PDO, ça à l'air d'être intéressant, mais full object.
Je me renseigne
 
WRInaute impliqué
+1 pour un système de template surtout avec de l'internationalisation,
une arbo avec tes templates par pays
/template/fr/
/template/en/

et même pour bien faire il te faudrait tenir compte de la culture :

/template/fr-FR/
/template/en-US/

ensuite l'archi controller / view / model c'est quand même bien pour du web

après zend, cake, et autre symphony je te conseillerais pas tout comme utiliser de l'objet pour des raisons de performances...
 
WRInaute passionné
kalagan> le classloader (en fait plutôt autoload, me suis trompé de nom) ça permet quand tu fais
$taClasse = new taClasse();

Là tu n'as pas l'import du fichier à faire.
Mais oui en haut de page tu as un fichier importé, mais de toute façon tu en aura forcément un que tu inclu sur toutes tes pages pour les variables de connexion à la BDD ou des variables "globales", non?

Ensuite ton code pour le autload ça sera plus qqchose comme ça :
Code:
<?php
function __autoload ($className)
{	
    $fileName = str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';    
    $status = (@include_once $fileName);    
   
    if ($status === false) {
        // TODO : gestion erreur
    }  
}
Plus besoin de faire d'include ou require, ce fichier fera tout le boulot.
(là mes classes ont un nom de ce type com_metalorgie_utils_String, par exemple).

Et les framework : Zend est pratique car tu peux utiliser que des parties des fonctionnalités, pas forcément rentrer dans leur architecture, ...
Et codant en java aussi, j'ai bcp de mal avec les framework java, mais là c'est vraiment bénéfique.
 
Nouveau WRInaute
Merci pour toutes ces infos.

J'ai tester __autoload. ça marche bien et ça diminue le nombre de lignes de codes :D
 
WRInaute passionné
Note : si le chargement est géré par __autoload (ou l'équivalent via la SPL) on peut remplacer include_once() par include().
D'autant plus que include_once() a bien mauvaise réputation coté perfs.
 
Discussions similaires
Haut