[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Многопользовательская система
Страницы: 1, 2
AllesKlar
Доброго всем.

Имеется скрипт, назовем его "многопользовательская система".

На сервере имеется "ядро".
Там же организованы каталоги с пользовательскими конфигами и темплейтами.
У каждого пользователя своя база данных.

схематично выглядит так:

site.com

├── app
│ ├─ controllers
│ └─ classes

├── user_1
│ ├─ config
│ └─ template

├── user_2
│ ├─ config
│ └─ template

└── user_n
├─ config
└─ template


Пользовательская версия доступна по субдомену user_name.site.com
user_name.site.com/index.php инклюдит свои конфиги, прописывает пути к своим темплейтам и инклюдит основное приложение из app

Все работает, все довольны.

Вопрос в следующем:

Как наиболее грамотно организовать механизм "индивидуализации" логики системы.
Т.е. иногда необходимо, чтобы для определенного пользователя какой-либо метод класса или контроллер (в общем-то тоже метод класса ControllerName) из центрального приложения вел себя иначе.
Cобственно говоря то, что называется перегрузкой методов, что так застенчиво отсутсвует в php

Пока вижу 2 варианта:
1. При необходимости, у пользователя будет класс IndBaseClass с соответсвующим индивидуальным методом, а центральное приложение, после отработки своего метода, будет проверять, существует ли пользовательский, и если да, то вызывать его.
Минус данного решения - зачастую придется полностью игнорировать результаты работы метода центрального приложения и делать повторные запросы к базе.

2. Сразу проверять, существует ли индивидуальный класс с соответсвующим методом, если да, то вызывать его.
Минус данного решения - дублирование кода. При внесении глобальных изменений (актуальных для всех пользователей) в логику метода центрального приложения, придется
следить, чтобы все соответсвующие индивидуальные методы у пользователей так же были изменены.


_____________
[продано копирайтерам]
AllesKlar
UPDATE 0.1
// рассуждения вслух
В идеале это могло бы быть нечто типа системы плагинов. И если для метода центрального приложения существует индивидуальный плагин, то этот плагин изменяет логику метода.

Если же их "интересы" не пересекаются, то просто подготавливает переменные для темплейта, которые не предусмотренны основным методом.

_____________
[продано копирайтерам]
bestxp
Это называется behavior или event как варианты,
ранее еще делали такие штуки как хуки, но это такое извращение через eval() и не предсказуемое,

у тебя может быть преЭвент или послеЭвент которые дополнят работу основного события до начала его работы и после работы и могут соотвественно прервать выполнение как например

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

_____________
[продано копирайтерам]
inpost
AllesKlar
В config глобальный (базовый) помести переменную:
$lib = 'file.php';

Дальше по коду подключаешь конфиги конкретного пользователя, там переопределяешь путь к классу:
$lib = 'file2.php';

Ну и подключаешь его
include $lib;

_____________________________

То есть переопределение дефолтного значения через конфиги. Ну как второй вариант проверяешь наличие специального класса юзера: if(file_exists('class_decoder_user17.php')), то подключаешь его, else подключаешь основной. Хотя в отличии от переопределения дефолтного значения тебе надо будет каждый раз дёргать лишнюю проверку файловой системы. В первом же случае ты просто подключаешь конфиг и всё, что делаешь всегда для конкретного юзера (по структуре видно).

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
chee
если я правильно все понял вам нужно сделать так.

general/classes/util.php, класс Util
mysite1/classes/util.php, клас MySite1Util унаследованный от Util из класса находящегося в general/classes/util.php

при обращении на site.ru у вас должен подключаться general/classes/util.php и управление должно переходить классу Util,
при обращении на mysite1.site.ru у вас должен подключаться mysite1/classes/util.php, управление же переходит классу MySite1Util

так как все будет унаследовано от базового класса,то это избавить вам от дублирования кода.

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
AllesKlar
inpost
Как бы вопрос не в том, как мне подключить класс, это тривиально.
Вопрос
Цитата
Как наиболее грамотно организовать механизм "индивидуализации" логики системы.

А то, что ты написал, я описал в своем Варианте 2. И его огромный минус - дублирование кода.

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

chee - здравая мысль, очень здравая. Это было одно из первых, что мне в голову пришло. И, скорее всего это и буду делать для классов рабыоты с базой. Но для контроллера этот подход не годится.

Собственно говоря, нужно эдак сообщить котроллеру "Эй, стоп! Вот в этом месте запускаем пользовательский код, а потом уже дальше ты работаешь". Причем, для раличных клиентов эти места в контроллере могут быть разными.

Т.е. вопрос в технической реализации вообще не стоит, вопрос именно в алгоритме, в идее.

Видимо, самым удачным решением будет совет от bestxp
Цитата

у тебя могут быть цепочки эвентов

Раздробить контроллер на множество private методов, а в нем уже сделать некое подобие обмена сообщениями между объектами.

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

_____________
[продано копирайтерам]
inpost
AllesKlar
Какой конкретно будет дублироваться? Ты про подключение код, или код другого класса?

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Aeq
Цитата (AllesKlar @ 11.01.2014 - 05:07)
Cобственно говоря то, что называется перегрузкой методов, что так застенчиво отсутсвует в php

ЩИТО? перегрузка методов отсутствует в похапэ?? Поясните пожалуйста, может тут имелось ввиду немного не то что я понял под этой фразой biggrin.gif
chee
AllesKlar Ну тогда используй события с тем подходом что я предложил, вот статейку для ознакомления http://habrahabr.ru/post/202234/

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
chee
Цитата (inpost @ 12.01.2014 - 02:25)
ЩИТО? перегрузка методов отсутствует в похапэ?? Поясните пожалуйста, может тут имелось ввиду немного не то что я понял под этой фразой

ТС видимо не знает, что перезагрузка методов в php реализована на уровне магических методов. Но такой как например в java перезагрузки методов в php нет, потому что не нужно.

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
Aeq
Цитата (chee @ 12.01.2014 - 12:57)
Цитата (inpost @ 12.01.2014 - 02:25)
ЩИТО? перегрузка методов отсутствует в похапэ?? Поясните пожалуйста, может тут имелось ввиду немного не то что я понял под этой фразой

ТС видимо не знает, что перезагрузка методов в php реализована на уровне магических методов. Но такой как например в java перезагрузки методов в php нет, потому что не нужно.

ЩИТО? зачем магические методы, по-моему тут про обычную перегрузку было написано:
Цитата
чтобы для определенного пользователя какой-либо метод класса или контроллер (в общем-то тоже метод класса ControllerName) из центрального приложения вел себя иначе.
Aeq
Цитата (chee @ 12.01.2014 - 12:57)
Но такой как например в java перезагрузки методов в php нет, потому что не нужно.

как нет?? куда дели?? кто отобрал??

с сохранением функционала родителя:
class A
{
function foo() {
echo 'foo';
}
}


class B extends A
{
function foo() {
parent::foo();
echo 'boo';
}
}


$b = new B();
$b->foo(); //fooboo


полная перегрузка, без сохранения функционалу родителя:
class A
{
function foo() {
echo 'foo';
}
}


class B extends A
{
function foo() {
echo 'boo';
}
}


$b = new B();
$b->foo(); //boo


это же базовая работа с классами. перечитать ман про наследование: http://www.php.net/manual/ru/language.oop5.inheritance.php и про область видимости: http://www.php.net/manual/ru/language.oop5.visibility.php.
Aeq
перегрузки под разные типы/кол-во аргументов нет, но тут вроде не об этом речь
sergeiss
Цитата (Aeq @ 12.01.2014 - 13:13)
перегрузки под разные типы/кол-во аргументов нет

Но этот функционал легко реализовать самому; используем ту самую "базовую работу с классами", что ты "напомнил" smile.gif и используя функции func_num_args/func_get_arg/func_get_args.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.