Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Vingrad CMS > Начало работ.


Автор: Opik 27.6.2005, 18:56
Думаю уже пара приступать писать FrameWork.
Что должно быть в нем включено?
[offtop]
Раньше обходился без оных, поэтому вопрос может быть некорректным.
[/offtop]

Автор: IZ@TOP 28.6.2005, 00:42
Думаю что должна быть базовая библиотека (к примеру Web.php), в ней должен находится класс отвечающий за подключение и настройку всех остальных Framework библиотек, назовем его Web, так же в ней, как мне кажется, должен быть включен класс (от которого наследуется класс Web) обработки и вывода ошибок пользователю.
Далее идут все стандартные наборы библиотек:
  • Работа с базами данных.
  • Работа с XML, XSL.
  • Контролеры пользовательских интерфесов, данных.
  • Библиотека для работы с изображениями.
  • Классы для работы с электронной почтой (отправка там).
Ну и далее что понадобиться. Сейчас не соображу.

Набор получается примерно следующий:

Код
Framework Class Library

Web.php
Web.Data.php
Web.Image.php
Web.Interface.php
Web.Xml.php

Автор: Opik 28.6.2005, 02:24
Накидал немного:
web.php
Код

<?php
   class fatalException extends Exception {};

   class Web
   {
        public $load = array();

        function __construct($libs = NULL)
        {
              $this->parseConfig();
              if(is_array($libs))
              {
                    $this->useLib($libs);
              }
        }

        function useLib($libs)
        {
              if(is_array($libs))
              {
                    foreach($libs as $lib)
                    {
                          if(!file_exists('fw.'.$lib.'.php')) throw new fatalException("file not found");
                          include_once('fw.'.$lib.'.php');
                          $this->$lib = new $lib;
                          $this->load[] = $lib;
                    }
              }
              else
              {
                      throw new fatalException("1st parametr type must/should be array"); // Забыл как правильно :))
              }
        }
        
        function parseConfig()
        {

        }  
     
        function __destruct()
        {

        }
   }
?>

test.php (Использование)
Код

<?php
  include('web.php');
  try
  {
       $web = new Web;
       $web->useLib(array('XML', 'Image'));
// или просто    $web = new Web(array('XML', 'Image'));

  } catch (fatalException $e) {
       $out  = 'Can\'t locate file: ' . $e->getMessage() . '<br />';
       $out .= 'Error code: ' . $e->getCode() . '<br />';
       $out .= 'File and line: ' . $e->getFile() . '(' . $e->getLine() . ')<br />';
       $out .= 'Trace: ' . $e->getTraceAsString() . '<br />';
       die($out);
  }
?>

Здесь ещё не включены в работу конфиги...

Автор: IZ@TOP 28.6.2005, 16:13
Несколько замечаний:

1. Функция загрузки библиотеки мне кажется должна быть реалдизована без передачи в нее массива, а с передачей неопределенного количества параметров. Еще лучше было бы сделать функцию выозова библиотек статичной.

2. Думаю что в корневую библиотеку нуежно включить класс парсера конфигурационных файлов.

3. Все сообщения об ошибках, которые связаны с библиотекой классов, будут находится в файле Framework.Exceptions.xml. Все данные об ошибке, так же как и определение степени фатализма ошибок будут находится там же. Разбор данных об исключении будет идти через xPath в нашем XML файле.
Т.е. Допустим, для твоей ошибки будет пераданы следующие параметры:

Код

throw new fatalException('Web.Framework.EmptyLibraryName');


Далее получая имя ошибки мы с помощью xPath выдираем нужные нам данные из XML файла, выводим данные или отправляем их на мыло. Все зависит от того какой уровень фатализма у данной ошибки.

Хотя в данном случае наверное придется немного переделать наш класс обработки ошибок.

4. Все классы библиотеки наследуются от корневого Web, это значит что передаем мы имя библиотеки целиком:

Код

Web::Using(
    'Web.Xml',
    'Web.Data',
    'Web.OtherLib'
);


Файлы библиотеки соответственно у нас Web.Xml.php и т.п.

5. Названия ошибок все должны быть на русском + при выводе должен быть красивый шаблон, если ошибка критическая. И данные о том что мол свяжитесь с администратором в случае возникновения ошибки.

PS осталось только прикрутить по человечиски РНР 5 к своей машине и можно будет написать нормальный пример smile

Автор: Opik 28.6.2005, 16:20
1) Ок, передеалаю на get_function_args()
3) Я же писал, что пример без конфигов, поэтому так накодил smile
4) Думаю нужно всё таки сделать объявление класса, что бы было гораздо удобнее со всем работать...

Автор: skalex 28.6.2005, 16:28
Как собираетесь организовать доступ к экземплярам создаваемых объектов внутри классов ?

Автор: Opik 28.6.2005, 16:30
Код

$this->$lib = new $lib;

Код

$object->xml->method

?

Автор: skalex 28.6.2005, 17:38
Я не про это ... smile

Допустим есть такие классы, доступ к экземплярам которых хочется осуществить из любой точки компонента веб-приложения (наиболее просто).

Я иногда делаю так. Я пользуюсь не пользуюсь явно конструктором класса, а использую заранее определенный метод (например, ClassName::Instance())).

Что делает этот метод? Концептуально все такие экземпляры классов хранятся в спец. массиве (например $GLOBALS['permament']). Метод проверяет, был ли уже создан данный экземпляр. Если да, то он вытаскивает его из массива, иначе возвращает новый.

Автор: IZ@TOP 28.6.2005, 20:48
Цитата(Mace @ 28.6.2005, 18:38)
Что делает этот метод? Концептуально все такие экземпляры классов хранятся в спец. массиве (например $GLOBALS['permament']). Метод проверяет, был ли уже создан данный экземпляр. Если да, то он вытаскивает его из массива, иначе возвращает новый.

Вот с этим я согласен.

И еще, если класс не загружен, вызывается библиотека в которой он содержится с помощью статичного метода Web::Using внутри модуля которому он требуется.

Хотя нет. Точнее будет так. В наших модулях будет просто объявление

Web:Using(...) тех модулей которые ему нужны, сама функция юзинг проверит загружали ли те библиотеки, если нет - загрузит.

Автор: Wowa 11.7.2005, 04:52
Давайте поактивнее smile

Автор: Opik 11.7.2005, 16:41
Wowa
я у себя потихоньку делаю. Как будет новое - выложу. Правда медленно идет из-за нехватки времени.

Автор: IZ@TOP 14.7.2005, 06:47
Wowa, я сейчас уже подобную систему на РНР 4 заканчиваю, как только доделаю - возьмусь переписывать свою часть на РНР 5.

Автор: Render 29.7.2005, 20:46
Предлагаю выкладывать какие-то наработки дорабатывать будем командно. А то что-то дальше обсуждения и мечтаний не ушли. smile smile smile smile

Автор: IZ@TOP 1.8.2005, 13:34
Render, могу выложить классы на под РНР 4. Кто будет переписывать под 5ку?

Автор: Wowa 1.8.2005, 13:41
Цитата(IZ @ 1.8.2005, 12:34)
Render, могу выложить классы на под РНР 4. Кто будет переписывать под 5ку?

ты ведь вроде собирался smile

Автор: Render 1.8.2005, 18:27
Да не всё ли равно кто их будет переписывать, сейчас выложишь, начнем хоть что-то обсуждать, делать, предлагать. А то мы так надолго засядем...

Автор: IZ@TOP 3.8.2005, 08:57
Вот несколько файлов, правда кое что может и не пригодится, а кое что еще придется малость переписать.

Но это платформа. Как на счет структуры базы? Есть предложения?

Автор: Wowa 3.8.2005, 10:36
Я до 18 августа в отпуске

Автор: Gold Dragon 29.9.2005, 09:01
Ну так что-нибудь продвигается?

Автор: Wowa 30.9.2005, 02:37
нет, все застыло. Т.к. программисты разбежались %)

Автор: Gold Dragon 30.9.2005, 08:17
зато сколько было энтузиазна в начале smile А так хотелось...

Автор: Gold Dragon 28.10.2005, 12:25
А не чего я опят напоминаю

Автор: ImamMahdi 12.2.2008, 16:12
Тема походу давно сдохла, но может получится поднять ;)

Я вот тут тоже взялся дурь такую писать и на эту тему наткнулся smile

Вот отпощу каркас того, что у меня уже есть

Это гланый файл, в котором происходит подключение главного контроллера
Код

<?php

require_once('./Config/Constants.php');
require_once('./Controller.php');

try {
    $Controller = new Controller;
    $Controller->setResource(CONFIG_CLASS, 'ConfigController', 'Config');
} catch (Exception $e) {
    echo $e->getMessage();
}


?>


Это главный контроллер, который регает все остальные

Код

<?php

class Controller {
    /**
     * Массив объектов
     *
     * @var array
     */
    protected $resource = array();

    public function __construct() {
        true;
    }

    /**
     * Регистрация объекта класса контроллера
     *
     * @param string $path
     * @param string $class
     * @param string $name
     */
    public static function setResource($path = null, $class = null, $name = null, $params) {
            require_once($path);
            $this->resource[$name] = new $class;
    }

    /**
     * Возврещение ссылки на объект контроллера
     *
     * @param string $resource
     * @return object
     */
    public function getResource($resource) {
        return $this->resource[$resource];
    }
}

?>

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)