Мне нужен ваш совет по поводу структуры приложения php (не MVC, но что-то попроще) - PullRequest
0 голосов
/ 07 августа 2010

Я не использую MVC-фреймворк, и моя структура приложения довольно проста ...

actions/
  registration.php
classes/
views/
  header.php
  footer.php
  registration.php
index.php

actions / registration.php

<?php
$variable = htmlspecialchars($_GET['name'], ENT_QUOTES).", are you ok!?";
include("views/registration.php");
?>

views / registration.php

<?php
include("header.php");
echo $variable;
include("footer.php");
?>

index.php - вход, поэтому вызов index.php?action=registration выполнит actions/registration.php

Как видите, эта структураэто довольно просто, и я думаю, что почти каждый разработчик PHP использовал эту структуру в какой-то момент.Есть ли у вас какие-либо советы относительно этой структуры приложения?Как бы вы реализовали модули, использующие эту структуру?Знаете ли вы какие-либо приложения с открытым исходным кодом, использующие эту структуру для изучения?

Ответы [ 3 ]

3 голосов
/ 07 августа 2010

Основная проблема, которую я вижу, заключается в том, что вы будете много повторяться.

Если ваши действия и представления делают схожие вещи, они будут поддерживать почти дублированный код, который после5 или 6 лет могут стать чудовищным кошмаром.

У меня есть проект, унаследованный от 2001 года (тогда, когда идея включения плоских сценариев была одним из наиболее распространенных способов разделения задач в PHP), которая имеет похожую структуру,Теперь, спустя 9 лет, вот краткое изложение:

vlad:~/workspace/myproj% find . -name '*.php' | wc -l
4357
vlad:~/workspace/myproj% du -hs
1.8G    .

Вы можете себе представить, как весело пробовать это делать.

Даже если вам удастся успешно отделить все свои действияв соответствующие плоские файлы вы все еще проигрываете, поскольку данные не разделены должным образом и поэтому не могут быть организованно распределены по всему приложению.По сути, не используя классы для управления вашей организацией и функции управления тем, какие действия могут повлиять на какие данные, вы настраиваете себя на кучу спагетти-кода, как только ваше приложение будет развиваться и развиваться.Кроме того, вы в конечном итоге получите приложение, в котором 1/3 строк вашего кода включают в себя операторы, ни одно из которых на самом деле не указывает на то, что происходит напрямую.Это может привести к путанице в погоне за дикими гусями во время поиска ошибок.

Возможно, вы захотите взглянуть на http://wshell.wordpress.com/2009/10/12/encapsulation-in-php/,, что, похоже, дает хороший взгляд на то, почему ваша организационная модель может быть плохой идеей.,Есть также фантастические статьи developerWorks, одна из которых посвящена некоторым полезным привычкам, которые вы можете использовать по мере развития вашего проекта: http://www.ibm.com/developerworks/opensource/library/os-php-7oohabits/

1 голос
/ 07 августа 2010

Я не большой поклонник традиционного способа использования include (). Вставляя включения на основе некоторых условий, вы в основном используете их как вызовы функций. Это может привести к всевозможным путаницам, поскольку код в этих включенных файлах находится в глобальной области, потенциально конфликтуя с другим кодом или вызывая неоднозначность относительно того, определены ли определенные вещи.

Обычно я включаю все файлы PHP, которые могут понадобиться в верхней части index.php. Затем создайте экземпляры объектов или вызовите функции на основе запрошенных действий. И чтобы ответить на ваш первый вопрос, нет, это не замедляет работу приложения заметным образом. Esp, если вы используете систему кеширования.

(это просто упрощенный псевдокод)

include( 'someclass.php');  //contains Some Class definition
include( 'someclass2.php');  //contains Some Class definition
include( 'someclass2.php');  //contains Some Class definition

switch( $action)
{
    ACTION_REGISTRATION:
       $sc = new SomeClass();
       $html = $sc->DoSomething();
       break;

    ACTION_SOMETHINGELSE:
       $sc = new SomeClass2();
       $html = $sc->DoSomeOtherThing();
       break;

    ....

}

//insert into template

echo $html;
0 голосов
/ 07 августа 2010

На самом деле, здесь у вас есть , это начало простой структуры MVC - index.php действует как ваш маршрутизатор, а код в вашей папке /actions действует как комбинированные контроллеры и модели.Ваши /views/*, конечно, действуют как взгляды.Было бы лучше перевести эту модель на MVC или HMVC (контроллер представления иерархической модели), поскольку это упростит «модульную» систему.

При этом следует помнить некоторые вещи:

  • Вы не можете доверять пользовательскому вводу - или вещам, которые могут быть пользовательским вводом.

    index.php?action= // This counts as user input
    
  • Для ваших представлений было бы лучше иметь функцию render, которую вы вызываете, когда хотите визуализировать свои представления, или, точнее, ту, которая вызывается при вызове echo это представление для клиента - таким образом, если вам нужно отправить пользовательские заголовки, вам не нужно перекодировать шесть представлений, просто чтобы предотвратить отправку данных перед вашими заголовками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...