2009-09-04 8 views
1

J'ai expérimenté de première main l'étendue de l'horreur et du tir au pied que la laideur de PHP peut causer. Je suis sur mon prochain projet (vous vous demandez peut-être pourquoi je ne change pas de langue mais ce n'est pas pour ça que je suis ici) et j'ai décidé d'essayer de le faire correctement, ou du moins mieux, cette fois.Implémentation de la vue dans MVC ou MVP (en PHP)

J'ai quelques modèles définis, et j'ai commencé sur un contrôleur principal. Je suis à une fourchette dans mes décisions sur la façon de mettre en œuvre la vue. Jusqu'à présent, le contrôleur principal peut recevoir des listes de fonctions d'affichage à appeler, puis il peut diffuser la totalité de la page en un seul appel. Il ressemble à:

function Parse_Body() 
{ 
    foreach ($this->body_calls as $command) 
    { 
     $call = $command['call']; 
     if (isset($command['args'])) $call($command['args']); 
     else $call(); 
    } 
} 

Mon dilemme est le suivant:

Serait-il préférable d'avoir toutes mes fonctions d'affichage retour le code HTML qu'ils génèrent, de sorte que le contrôleur principal peut juste echo $page; ou si les les fichiers d'affichage utilisent du HTML brut en dehors de PHP, qui est édité dès sa lecture? Avec le premier, le contrôleur d'application principal peut contrôler précisément quand les choses sont sorties, sans abandonner simplement le contrôle complet au gré des affichages. Sans oublier que toutes ces listes de fonctions d'affichage à appeler (ci-dessus) ne peuvent pas vraiment être exécutées à partir d'un fichier d'affichage à moins qu'elles ne soient transmises. Avec cette dernière méthode, j'ai l'avantage de faire du HTML en HTML réel, au lieu de faire d'énormes blocs de chaînes PHP. De plus, je peux simplement inclure le fichier pour l'exécuter, au lieu d'appeler une fonction. Donc je suppose qu'avec cette méthode, un fichier est comme une fonction.

Toute contribution ou conseil s'il vous plaît?

+0

Commencez juste une ligne avec 4 espaces pour le formatage du code. http://stackoverflow.com/editing-help –

+0

J'ai essayé et échoué à plusieurs reprises. Peut-être parce que j'ai utilisé les balises de code réelles? – Tesserex

Répondre

1

Serait-il préférable d'avoir toutes mes fonctions d'affichage retourner le code HTML qu'elles générer, de sorte que le contrôleur principal peut juste afficher $ page; ou devrait les fichiers d'affichage utilisent HTML brut en dehors de PHP, qui obtient la sortie dès que c'est lire?

L'un des avantages de php est que le traitement est similaire à la sortie:

Alors:

<h1> <?= $myHeading; ?> </h1> 

est plus claire que:

echo "<h1>$myHeading</h1>"; 

Un encore plus que:

echo heading1($myHeading); //heading1() being an hypothethical user defined function. 

Basé sur cela, je considère qu'il est préférable d'avoir HTML et juste imprimer les champs dynamiques appropriés en utilisant php.

Afin d'obtenir un contrôle plus fin sur la sortie, vous pouvez utiliser: ob_start comme recommandé par gurunu.

Vous pouvez bien sûr utiliser l'un des nombreux framework MVC MVC disponibles. Mon preferred un, est maintenant: Solarphp

mais Zend Framework et Cakephp pourrait vous aider aussi.

Et enfin, si vous ne voulez pas utiliser un cadre Vous pouvez toujours utiliser un moteur de template assez mince: phpSavant. Cela vous évitera quelques maux de tête dans le développement de votre vue. e

+0

mais encore une fois, PHP Group recommande d'abandonner les shorttags. Pensez donc à utiliser de nouveau car vous pourriez avoir besoin de le changer à l'avenir. – mauris

+0

L'utilisation de l'un des cadres suggérés (ZF, Solar) est probablement un bon plan d'action. –

+1

Mauris Pouvez-vous pointer vers la "recommandation d'étiquettes courtes à déposer". Les gens déconseillent de les utiliser car sur certaines installations php, ils sont désactivés dans php.ini Cependant, je les aime dans mes vues/modèles. C'est plus facile que d'écrire: sur plusieurs adresses. – elviejo79

1

Vous pouvez obtenir le bénéfice des deux, l'obtention d'une chaîne de HTML tout en intégrant également HTML dans le code PHP en utilisant les fonctions de contrôle de sortie:

A partir du manuel PHP @http://www.php.net/manual/en/ref.outcontrol.php:

<?php 

function callback($buffer) 
{ 
    // replace all the apples with oranges 
    return (str_replace("apples", "oranges", $buffer)); 
} 

ob_start("callback"); 

?> 
<html> 
<body> 
<p>It's like comparing apples to oranges.</p> 
</body> 
</html> 
<?php 

ob_end_flush(); 

?> 
0

Premier tampon tout. remplacez ensuite les balises à l'aide d'un analyseur à la fin du script.

<?php 

$page_buffer = ''; 

function p($s){ 
    global $page_buffer; 
    $page_buffer .= $s; 
} 

$page_buffer = str_replace(
    array('<$content$>','<$title$>'), 
    array($pagecontent,$pagetitle), 
    $page_buffer); 

echo $page_buffer; 

?> 

Samstyle PHP Framework implémente en mémoire tampon de sortie et voir le modèle de cette façon

Et ai-je mentionné sur les avantages de tamponner votre sortie dans une variable avant « écho-ing »? http://thephpcode.blogspot.com/2009/02/php-output-buffering.html