2010-07-18 4 views
1

Bon, alors je crée un framework MVC en PHP et je veux qu'il soit assez flexible. Tout va bien - je travaille là-dessus en ce moment et tout va bien (donc je ne veux pas utiliser Zend ou un autre framework préexistant, haha!), Mais je voulais faire à la fois le framework et l'application assez dynamique. Je vais essayer d'expliquer:Qui vient en premier, le cadre ou l'application? Cadre dynamique et dossiers d'application

Voici une structure de répertoire simplifiée:

- index.php   (wants to use app1 or app2 depending on domain name) 
- /app1    (wants to use framework 1.1) 
    - /config 
     - config.php 
- /app2    (wants to use framework 1.2) 
    - /config 
     - config.php 
- /framework_1.1 
- /framework_1.2 

Un fichier Bootstrap /index.php reçoit toutes les demandes entrantes. Il charge alors un certain fichier de configuration de l'application de /app1/config/config.php ou /app2/config/config.php, etc, selon une certaine condition, par exemple .. l'hôte HTTP:

// /index.php 
switch ($_SERVER[ 'HTTP_HOST' ]) { 
    case 'localhost': 
     $app_root = ROOT . 'app1/'; 
     break; 
    case 'site.com': 
     $app_root = ROOT . 'app2/'; 
     break; 
    default: 
     $app_root = ROOT . 'application/'; 
     break; 
} 
define('APP_ROOT', $app_root); 

le fichier d'amorçage puis charge le fichier de configuration de l'application:

// /index.php 
include(APP_ROOT . 'config/config.php'); 

Un tableau de configuration $ sera retourné à partir du fichier de configuration de l'application, qui indiquera où les fichiers cadres sont situés.

// /app2/config/config.php 
$config['framework_root'] = '/framework_1.2/'; 

Bootstrap exécute ce cadre.

// /index.php 
include($config['framework_root'] . 'config/bootstrap.php'); 

Est-ce la meilleure façon de procéder?

Le seul problème avec cela, est que le fichier index.php doit savoir sur toutes les applications possibles, l'utilisateur devra modifier l'instruction switch dans /index.php (ou un /apps.php fichier que le /index.php inclut, peut-être?).

En outre, le fichier de configuration de l'application doit être chargé avant chargement des fichiers du cadre, ce qui me semble un peu bizarre ...

est-il un moyen simple de faire en sorte que la demande précise l'application, et l'application spécifie quel framework utiliser, ou est-ce la manière ci-dessus la plus simple? Désolé, si cela était déroutant!

me Confus un peu écrire;)

Répondre

0

J'utilise Symfony la plupart du temps, donc je vais y appliquer mes connaissances en répondant à vos questions:

est-il un moyen simple pour faire de sorte que le Précise demande l'application

utiliser plusieurs "index.php" (ou utiliser ?app=xxx) avec un combo URL-rewrite. Cela rend les choses un peu plus propres.

De plus, le fichier de configuration de l'application doit être chargé avant de charger les fichiers du framework, ce qui me semble un peu bizarre ...

Ce n'est pas bizarre, vous avez certainement besoin de configurer et lancer certains états avant Amorcer votre cadre, mais peut-être que vous pouvez fournir sous-classe de la classe d'amorçage de votre cadre, de définir ce qui doit être fait au cours de bootstrapping-cadre.

Je vous recommande de regarder dans Symfony2 pour savoir comment ils modularisent/gérer les bibliothèques et les dépendances. Sérieusement, il n'y a aucune raison d'écrire un autre cadre mais de contribuer à un cadre existant - à moins que vous ne les trouviez ne partageant pas les mêmes visions avec les vôtres.

+0

J'ai jeté un coup d'œil à Symphony mais je ne pense pas en savoir assez sur les espaces de noms pour pouvoir suivre efficacement le code2. Je vais continuer à l'étudier cependant. Le problème avec plusieurs fichiers "index.php" est le fait que beaucoup de code serait dupliqué à plusieurs reprises, et que toute petite modification devrait être répliquée dans chaque fichier. Désolé, je ne comprends pas très bien ce que vous entendez par le sous-classement de ma classe bootstrap pour définir ce qui doit être fait pendant le bootstrap. Pourriez-vous élaborer? Merci pour le conseil! Et je ne pense pas que je suis assez intelligent pour contribuer pour le moment;) – manbeardpig

+0

Jetez un oeil à ProjectConfiguration de Symfony. Chaque nouveau projet aura un fichier bootstrap qui l'étendra. La répétition de code peut être éliminée avec des aides et un héritage orienté objet :) – yclian

+0

OK, mais supposons que ma classe AppConfiguration doive étendre la configuration. Si j'appelle mon fichier de configuration d'application avant d'exécuter mon framework, comment AppConfiguration va-t-il savoir ce qu'est la configuration? La configuration ne serait-elle pas une classe dans le répertoire/classes/dir du framework? Ce qui signifie que cela changerait selon le cadre que l'application veut utiliser ...? – manbeardpig