Structure d'un site

a marqué ce sujet comme résolu.

Bonjour, je voudrais votre avis sur ma structure de projet que est celle-ci:

  • Un dossier app
    • Controlleur
    • Router
    • Mes classes
  • Un dossier public
    • js
    • css
    • index.php
  • Un dossier pages
    • Un dossier template
    • Les pages …

Mon dossier app contient mes Controlleurs ainsi que mes classes. Mon dossier public contient le routeur (index.php) ainsi que les js/css. Mon dossier template contient mes templates (non sans blague ??).

PLus explicitement mon template ressemble à une page html normal, mais avec un <?= $content ?>.

D'ou elle sers cette $content ?

Cette variable sors de la temporisation de sortie du router c'est vraiment plus simple de procéder de cette manière ^^.

Et vous comment-vous ferez ? Un avis sur mon architecture ? Je pense que je dois oublier des choses.

Arck

+0 -0

Salut,

J'arrive pas à comprendre pourquoi tu as un dossier pages avec des pages dedans et un dossier template. C'est quoi la différence ?

À part cela, je n'ai rien vu de choses trop contre productifs.

On voit que tu n'utilises pas de modèles, mais ce n'est pas grave, si c'est ça qui te convient. Je trouve que des fois les gens suivent trop les patterns à la lettre sans vraiment réfléchir à la meilleur solution pour leurs problèmes.

Comment gères-tu tes instances de classe ? Si tu les instancies avec new, etc. Tu pourrais peut-être regarder du côté des DIC.

Pour que sa soit utile, tu n'as pas besoin d'en utiliser un vraiment complexe. Il y en a qui utilisent la reflexion pour trouver les paramètres à injecter. Je me rappelles, quand je faisais du PHP, j'en avais un vraiment plus simple que toutes les libs qu'on trouve : on a deux méthodes, set et get. Un exemple sera le mieux :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php

class Foo {}

class Bar
{
    public $foo;

    public function __contruct(Foo $foo)
    {
        $this->foo = $foo;
    }
}

$c = new Container;

$c->set('foo', function () {
    return new Foo;
});

$c->set('bar', function () {
    return new Bar($this->get('foo'));
});

$c->get('bar'); // pour récupérer bar

$c->set('foo2', function () {
    return new Foo;
}, true)

// true, car quand le 3ème param vaut false (valeur par défaut) le container met
// en cache le résultat
$c->get('foo') === $c->get('foo');

// false, car la closure est exécuté à chaque get, pas de mise en cache
$c->get('foo2') === $c->get('foo2');

Je pense pouvoir retrouver le code si tu veux.

Oups, je crois que je suis partit un peu loin du sujet initial.

Salut tleb,

pour la question concernant le dossier template je l'utilise pour avoir un template de page.

Ce template ressemble à ceci :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <?= $content ?>
  </body>
</html>

En fait la variable content va être remplacée par ce que le router renvoie :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<?php
require '../app/class/autoloader.php';
autoloader::register();

$router = new Router($_GET['url']);
ob_start(); # On démarre la temporisation, tout l'HTML renvoyé ne sera pas envoyé au client.

$router->get('/', function(){
    require '../pages/homepage.php';
});

$content = ob_get_flush();  # On stocke l'HTML renvoyé dans la variable $content;

require '../pages/template/template.php'; # On inclus le template;

Après pour les DIC je n'ai pas vraiment compris ce que c'était :(.

Mais merci !

+1 -0

Je comprends mieux. Je te demandais ça parce que on traite souvent les pages et les templates comme un seul type, tous ensemble et avec un template engine on ajoute le contenu au template.

Pour les DIC, ça permet de faciliter l'instanciation de tes classes : tu as juste à faire $c->get('db') pour récupérer une instance de la classe que tu utilises pour gérer ta base de données. Pas besoin de se souvenir du nom de la classe et surtout pas besoin de gérer ses paramètres. Et le container met en cache tes classes donc tu as juste à faire $c->get('db') sans devoir récupérer la classe de l'endroit où elle a été utilisé avant.

C'est utile surtout quand on a différentes étapes pour répondre à une requête HTTP avec par exemple des middlewares mais je pense que ça peut t'aider à avoir un code plus propre.

C'est plus adapté pour un projet. Les factories sont utilisés par les libs qui ont une ou deux classes à instancier. Un container s'occupe de toutes les classes de ton projet. Ca permet aussi de facilement remplacer une classe par une autre ou débuger. Tu as juste à modifier la définition et retourner une classe qui log ce que tu fais, par exemple.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte