За последние 24 часа нас посетили 49738 программистов и 1689 роботов. Сейчас ищут 1058 программистов ...

Реализация интерфейса вызова модулей системы

Тема в разделе "Прочие вопросы по PHP", создана пользователем enshtein, 10 дек 2007.

  1. enshtein

    enshtein Активный пользователь

    С нами с:
    27 авг 2006
    Сообщения:
    291
    Симпатии:
    0
    Вызов модулей в моей CMS происходит следующим образом, например запрос вида index.php?mod=news&task=view&id=5 подключает модуль Новостей, далее вызывается метод, который выводит Новость с id = 5 т.е. метод view - впринципе стандартная схема..
    Структура файла модуля (в нашем случае модуля News) у меня выглядит следующим образом:
    PHP:
    1. /** вывод списка новостей */
    2. if ($task == 'list') {
    3.     //
    4. }
    5. /** вывод отдельной новости */
    6. if ($task == 'view') {
    7.     //
    8. }
    т.е. задавая $task в строке запроса мы вызываем нужный функционал....

    Так вот тоже самое можно было бы конечно реализовать и с помощью вызова функций, т.е:
    PHP:
    1. /** вывод списка новостей */
    2. function NewsList() {
    3.     //
    4. }
    5. /** вывод отдельной новости */
    6. function NewsViewId{
    7.     //
    8. }
    Достоинством первого метода является то что не надо думать каждый раз о том чтобы не забыть сделать обьявить очередную глобальную переменную в функции (т.е. global $var), впрочем у меня их не так много - но все же....., а с другой стороны такая локализация позволяет не думать о пространстве имен - ведь оно реализуется в каждой из функций модуля... потому можно забыть о пересечении глобальных переменных ядра системы с переменными используемыми внутри любого модуля...
    Так вот вопрос в том, что же предпочесть? Кроме того, поделитесь своими решениями такого рода проблем...
     
  2. QQQ

    QQQ Активный пользователь

    С нами с:
    21 ноя 2007
    Сообщения:
    538
    Симпатии:
    0
    мне ближе первый вариант
     
  3. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Как я понимаю, 1 модуль - 1 файл? При использовании второго варианта можно сделать call_user_func для автоматического вызова функции.
     
  4. enshtein

    enshtein Активный пользователь

    С нами с:
    27 авг 2006
    Сообщения:
    291
    Симпатии:
    0
    да так и есть...
     
  5. enshtein

    enshtein Активный пользователь

    С нами с:
    27 авг 2006
    Сообщения:
    291
    Симпатии:
    0
    - да я тоже считал до последнего времени его достаточно простым и легким решением.. но бывали случаи пересечения имен переменных (особенно при подключении сразу нескольких модулей) впринципе для себя можно и ограничится выработкой правила именования переменных, да бы ислючить возможность пересечения имен переменных в разных модулях...
    или вообще подключать файл модуля в функции - тем самым убрав заботу о пространстве имен переменных и обьявив в все необходимые глобальные переменные для использования в модуле
     
  6. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    предлагаю сделать 1 таск = 1 файл
     
  7. enshtein

    enshtein Активный пользователь

    С нами с:
    27 авг 2006
    Сообщения:
    291
    Симпатии:
    0
    да это же охренеть можно.... Вы что??? у меня в модуле по 10-20 функций и модулей штук 20 ... трудно будет такую систему поддерживать, да и файлов неимоверное много будет... намного проще инкапсулировать весь функционал модуля в один файл- ну если уж файл слишком большой или есть какое разделение , можно рядом положить еще один файлик и синклудить его в файл модуля...
     
  8. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    наоборот. поддерживать будет очень легко. особенно если пользуешься svn-ом.
     
  9. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    > у меня в модуле по 10-20 функций

    а можно их список?


    > и модулей штук 20

    ну и их тоже
     
  10. enshtein

    enshtein Активный пользователь

    С нами с:
    27 авг 2006
    Сообщения:
    291
    Симпатии:
    0
    легко в смысле отдельная функций (или функциональность) будет лежать в отдельном файле - да согласен.... но все же: -кол-во инклудов возрастет (ибо может возникнет ситуация вызова сразу нескольких task'ов); - код принадлежащий одному модулю (так сказать определяющий его целостный функционал) раскиданный по файлам - ИМХО все-таки неудобно...
     
  11. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Это смотря ещё какой размер экшенов.
     
  12. enshtein

    enshtein Активный пользователь

    С нами с:
    27 авг 2006
    Сообщения:
    291
    Симпатии:
    0
    ну список модулей, к примеру:
    help\
    links\
    login\
    mainmenu\
    menu\
    system\
    templates\
    update\
    users\
    backup\
    blocks\
    catalog\
    config\
    content\
    editors\
    и т.д. ... ну а список функций чего приводить то...?? у каждого модуля соответственно свой набор... иногда модуль может вообще содержать класс... впринципе структура модуля не формализована - это черный ящик... со своими методоми (тасками), меня тут больше интересовала организация интерфейса вызова методов модуля...
    Хотя впринципе я уже почти сам ответил на свой вопрос... :)
     
  13. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    то есть типа у тебя пользователь зная нужное имя сможет вызвать любую внутреннюю функцию? :)
     
  14. enshtein

    enshtein Активный пользователь

    С нами с:
    27 авг 2006
    Сообщения:
    291
    Симпатии:
    0
    да, только лучше сформулировать так: "пользователь может вызвать открытую функцию конкретного модуля" - в моей системе не предполагается использование call_user_func() - т.е. пользователь не сможет подменой task'а вызывать что угодно...
     
  15. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    когда пользователь запрашивает что-то по какому-то урлу - он вызывает один определённый контроллер. контроллер уже решает какие модули, классы. функции подгрузить и с какими параметрами их вызвать.
    у тебя сейчас каждая функция является таким контроллером.


    вот, например, у нас есть статья. с ней можно сделать следующие действия:
    посмотреть
    редактировать
    создать
    удалить
    переместить

    в зависимости от организации это может быть вообще только:
    посмотреть
    отредактировать

    вот эти вот "таски" я и предлагал вынести в отдельные файлы.
     
  16. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    > пользователь может вызвать открытую функцию конкретного модуля

    это public что-ли? то есть, если один класс может вызвать определённый метод другого класса, то его сможет вызвать и кулхацкер Вася?
     
  17. enshtein

    enshtein Активный пользователь

    С нами с:
    27 авг 2006
    Сообщения:
    291
    Симпатии:
    0
    нет контроллер запросов у меня один на самом деле...
    тут речь шла про task'и - будем их называть методами конкретного модуля, так вот они как правило общедоступны... а такого рода операции как редактирование, создание, удаление и перемещение например решаются через систему управления доступом - потому даже в случае вызова злоумышленником запрещенной для него функции из конкретного модуля он ничего не получит и не сможет сделать...
     
  18. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    > нет контроллер запросов у меня один на самом деле

    я вижу :) гигантский такой свич...


    > а такого рода операции как редактирование, создание, удаление и перемещение например решаются через систему управления доступом

    ты можешь поручиться, что все внутренние функции перед исполнением лезут к юзер-контроллеру для проверки прав?
     
  19. enshtein

    enshtein Активный пользователь

    С нами с:
    27 авг 2006
    Сообщения:
    291
    Симпатии:
    0
    dark-demon, я еще не пришел к окончательной реализации интерфейса вызова методов модулей, но все равно считаю что выбрасывать отдельный task в отдельный файл - это черезчур много уж файлов получается... и ИМХО мне проще когда основной функционал модуля у меня в одном файле... ибо стока много файлов - путанница... да конечно можно как-то сгруппировать функционал одного модуля по файлами при его большем размере, но все же концепция "основной функционал в одном файле " ближе к телу :D
     
  20. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Предлагаю задуматся об ООП системе - 1 модуль = 1 класс = 1 фаил. Никакого пересечения переменных и названий методов.
     
  21. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    зато есть пересечение имён классов :)
     
  22. enshtein

    enshtein Активный пользователь

    С нами с:
    27 авг 2006
    Сообщения:
    291
    Симпатии:
    0
    уже думал.. проблема в том, что модули в будущем вполне возможно будут писаться другими программистами - а накладывать ограничение в виде обязательного применения ООП во всех модулях не совсем правильно ИМХО будет