chameleon
Новичок
кстати, "один из" и не самый интересный...Кстати, вот интересный проект есть, зацени: http://www.phpmvc.net
для идеологии уж лучше доки к struts почитать ..
кстати, "один из" и не самый интересный...Кстати, вот интересный проект есть, зацени: http://www.phpmvc.net
Ямерт согласен,Чтобы идти к MVC, надо чётко разделять Контроллер (обработчик, диспетчер запроса), Модель (вся прочая логика), Вид (отображение информации). В том, что ты привёл, я не вижу никакого разделения на эти три составные вообще - только разбивку на модули.
chameleon прежде чем состряпать что-то свое - и стратс читал и пытался с турбиной разобраться. Думаешь описывать действия контроллера xml файлами - лучший вариант?для идеологии уж лучше доки к struts почитать
тогда кол-во файлов возрастает до 300 и более и начинаешь путаться в каком файле что реализованно - разве это не лучший вариант для продуктивности?С точки зрения продуктивности работы -- модуль это файл на 30-300 строк кода,
имхо, уж самый удобный для описания точно. Быстродействия конечно не добавляет, а какие есть еще альтернативы?Думаешь описывать действия контроллера xml файлами - лучший вариант?
Screjet Нужно искать золотую середину, и я стараюсь ее придерживаться. Если я чуствую, что мой класс превращается в "супертяжелый файл", я используя все предести ООП и разбиваю его на подклассы. В Яве есть пакеты, которые в принципе можно ассоциировать с каталогами. С таким же успехом, модуль может состоять из основного файла и файлов с вспомогательными классами, которые можно запихнуть в один из каталогов (данной папки или /base - основные классы и модули).Можно (как в жаве) группировать файлы по каталогам (тоже с продуманной структурой)
switch(action)
{
case "all" :
str = all();
break;
case "cancel" :
cancel(id);
str = all();
break;
case "delete":
this.delete( id );
str = all();
break;
}
Это то что я пытался объснить с самого начала.у меня отделение контроллера от логики заключается в
след коде
Не мона у нуноДумаю это можно как-то вынести?
принято, буду рисовать (возможно с ошибками ))А вообще, можешь привести диаграмму класов? A то все приходится представлять в голове, что не есть удобно
код C#Топик и так абстрактен до бесполезности, а теперь еще код-фантазия...
ScrejetНужно четко разделить "главный-подчиненный". Кто на что влияет и приоритеты.
Например как у меня:
$tmpl = new template1( new controller1() );
когда то пришло вдохновение написать фреймворк. Конфиг, описывающий структупу всего приложения (модули, действия, роли и пр.) в xml. А при каждом изменении он компилится в php файл и потом просто инклудится. чем не вариант?Думаешь описывать действия контроллера xml файлами - лучший вариант?
wrapper кстати вариант интерестный,А при каждом изменении он компилится в php файл и потом просто инклудится. чем не вариант?
и в соответствии с возвращенным кодом реализуется соответствующий метод [action] "Источника данных" (инклудится соотвкетствующий класс Источника данных и выполняется соотвкетствующий метод класса.)
Результатом реализации метода [action] Класса "Источника данных" является строка внешнего представления данных.
Метод [action] использует из данных MVConfig.xml соответствующий шаблон.
Данная строка может быть как конечным результатом, так и представлять собой Шаблон представления данных (уровень View).
Предлагаю след. структуру MVConfig.xml:
[php]<MVConfig>
<action name=[value of $_REQUEST[action]]>name of method
<model name=[value of $_REQUEST[model]]>name of business objects</>
<DataSource code=[return code class of model] name=[name of DataSource objects] template=[name of template] >name of DataSource object method</>
</action >
<action name="all" >all
//т.к. нет данных для бизнес-модели, то тег <model> опущен
<DataSource name="userDS" template="user_view" >viewAll</DataSource>
// идет вызов метода viewAll объекта name="userDS
// по окончанию отработки - вызывается шаблон template="user_view
</action >
<action name="edit" >edit
<model name="users" ]>update</model> // осуществляется вызов метода update
//класса name="users"
<DataSource name="userDS" template="user_view" >viewAll</DataSource>
// При коде возврата =0 реализации метода объекта users
// идет вызов метода viewAll объекта name="userDS
// по окончанию отработки - вызывается шаблон template="user_view
<DataSource code=1 name="userDS" template="user_edit" >edit</DataSource>
// При коде возврата =1 /* ошибка в принятых на редактирование данных */
// реализации метода объекта users
// идет вызов метода edit объекта name="userDS
// по окончанию отработки - вызывается шаблон template="user_edit
//
// на один код возврата Контроллера может быть сформированно несколько откликов
// от разных источников данных.
</action >
</MVConfig>[/php]
[size=1][i]-~{}~ 02.09.04 10:08:[/i][/size]
[b]Screjet[/b]
не знаю ответил-ли я на твой вопрос.
__________________________________________________
на первом этапе вместо парсинга конфига, можно использовать MVConfig.php, который представляет массив адекватной MVConfig.xml структуры.
Эту идею (идею конфига) я украл из phpmvc, а ее представление в xml из strats
[size=1][i]-~{}~ 02.09.04 10:13:[/i][/size]
____________________________________________________
остается еще продумать решение нескольких вопосов на счет отработки нескольких ДатаСоурсов и вывод на несколько разных шаблонов.
Достоинство предложенной идеи:
- минимальный рефакторинг
- отсутствие повторного использования кода (чем страдают большинство WEB приложений)
- возможность одновременного использования нескольких шаблонов
class UserModule extends AbstractModule() {
insert($user) {}
update($user) {}
listAllUsers() {}
....
}
class UserLoginView extends AbstractView {
render() {
//здесь может использоваться функциональность модуля и переменные ложатся в темплейт
return $this->engine->$smarty->fetch("fo/user/loginForm.tpl.html");
//или просто
//return "<form>...</form>";
}
}
<project>
<!--
Users defined here can be used for testing, quick start or in simple applications
In majority of cases you will use users stored in database
-->
<roles>
<role id="anonymous"/>
<role id="user"/>
<role id="admin"/>
</roles>
<users>
<user id="user" password="user" role="user"/>
<user id="admin" password="admin" role="admin"/>
</users>
<modules>
<module id="ErrorModule" className="ErrorModule" classPath="error/ErrorModule.php">
<view id="FOErrorView" className="FOErrorView" classPath="error/FOErrorView.php"/>
</module>
<module id="PrivateModule" className="PrivateModule" classPath="private/PrivateModule.php">
<view id="PrivateView" className="PrivateView" classPath="private/PrivateView.php"/>
</module>
<module id="NewsModule" className="NewsModule" classPath="news/NewsModule.php">
<view id="FONewsListView" className="FONewsListView" classPath="news/FONewsListView.php"/>
</module>
<module id="UserModule" className="UserModule" classPath="user/UserModule.php"/>
<static id="MenuStatic" template="fo/menu/menu.tpl.html"/>
<static id="LoginFormStatic" template="fo/user/loginForm.tpl.html"/>
<static id="LogOutLink" template="fo/user/logoutLink.tpl.html"/>
</modules>
<profile role="anonymous" errorContainer="ErrorContainer" defaultContainer="MainContainer">
<container id="ErrorContainer" template="fo/error.tpl.html" alias="/error">
<component moduleId="ErrorModule" viewId="FOErrorView" templateVariable="content"/>
<static-component staticId="MenuStatic" templateVariable="menu"/>
</container>
<container id="RootContainer" template="fo/root.tpl.html">
<static-component staticId="MenuStatic" templateVariable="menu"/>
<static-component staticId="LoginFormStatic" templateVariable="login_form"/>
</container>
<container id="MainContainer" template="fo/defaultContainerTemplate.tpl.html" parentContainer="RootContainer" templateVariable="content">
<component moduleId="NewsModule" viewId="FONewsListView" templateVariable="content"/>
</container>
<container id="LoginContainer" template="fo/defaultContainerTemplate.tpl.html" alias="/login" parentContainer="RootContainer" templateVariable="content">
<static-component staticId="LoginFormStatic" templateVariable="content"/>
</container>
<actions></actions>
</profile>
<profile role="user" errorContainer="UserErrorContainer" defaultContainer="UserMainContainer">
...
</profile>
</project>
<?php
global $projectDescriptor;
$projectDescriptor = new ProjectDescriptor();
.....
$moduleDescriptor = new ModuleDescriptor();
$moduleDescriptor->id="NewsModule";
$moduleDescriptor->className="NewsModule";
$moduleDescriptor->classPath="news/NewsModule.php";
$moduleDescriptor->viewList=array();
$viewDescriptor = new ViewDescriptor();
$viewDescriptor->id="FONewsListView";
$viewDescriptor->className="FONewsListView";
$viewDescriptor->classPath="news/FONewsListView.php";
$moduleDescriptor->viewList[]=$viewDescriptor;
$projectDescriptor->moduleList[] = $moduleDescriptor;
.....
...
$engine = new ProjectEngine($projectDescriptor, $context, $templateEngine, $db);
$engine->handleRequest();
...
нет - я имел ввиду, что ранее мне приходилось на базе однойэто достоинство? или ты имел ввиду присутствие?
и как часто?компилится в PHP файл: