Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызвать метод в классе перед необходимым методом 
V
    Опции темы
Fortop
Дата 29.9.2012, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(neoks @  29.9.2012,  18:57 Найти цитируемый пост)
просто мне интересовал метод чтоб не писать проверку в каждом методе чтоб все проверял только один метод

Это и делает ACL на этапе роутинга или сразу после него.

Цитата(neoks @  29.9.2012,  18:57 Найти цитируемый пост)
Как мне тут реализовать ?  

Вот после 26й строки и делайте проверку в ACL
А дальше у вас все идет как обычно или доступ отказан.
Реализовывать это в каждом модуле, который может и не знать имеет ли пользователь права для доступа к нему - нет смысла.

Цитата(neoks @  29.9.2012,  18:57 Найти цитируемый пост)
$realPathS = str_replace('index.php','',$_SERVER['SCRIPT_NAME']);

Это вообще что? smile


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Sanchezzz
Дата 29.9.2012, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



Цитата

Это вообще что?  

попытка получить путь к файлу когда можно использовать pathinfo или realpath
интересно а расширение файла как проверяются  substr до первой точки? 









--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
neoks
Дата 29.9.2012, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



Цитата(Fortop @  29.9.2012,  19:05 Найти цитируемый пост)
А дальше у вас все идет как обычно или доступ отказан.

А дальше у меня идет /** Инициализация модулей **/ это тот же ACL тока расширенный, могу любой модуль запустить а он уже решит что ему там нуно проверить помимо авторизации или доступа, много чего он может проверить и решит дать мне доступ к другому модулю или нет например за доступ отвечает модуль auth, но вот и прикол, я могу удалить это модуль если он мне не нужен  smile 

То есть избавится от лишней проверки и нагрузки на сервак, например замутить какойта парсер где и не нужна проверка )
Меня интересует не тока авторизация и доступ, например проверка бд, что тоже там ставить на проверку ? а если мне не нужна БД для моего скрипта, то есть об этом я все подумал  smile 

Все дело в том что если в /** Инициализация модулей **/ не включен модуль там какой-та проверки скажем БД да и вообше зачем мне везде проверять ? вот в чем смысл, скажем скрипт работает отлично без БД все работает как надо но вдруг я решил установил какой-та модуль с маркета и решил его запустить проигнорировал все его настройки или не почитав что там нуно настроить.

Так вот запускаю модуль а мне сразу вылазят ошибки что к БД нет доступа и тд, решение есть, сразу в методе сделать проверку работает бд или нет и если не пашет то завершить работу модуля и сообщить что так и так БД не пашет.

Все отлично и так но один минус есть, то что проверку нуно писать в каждом модуле или сказать пользователю что нуно его включить в /** Инициализация модулей **/  чтоб он проверил работает бд или нет и самое худшие если я включю а бд не будет работать то сайт сразу накроится и будет везде светится что бд не настроена.

Ну надеюсь что уже досконально объяснил в чем прикол, мне не нужна ошибка об нерабочий бд чтоб светилась по всему сайту а только когда я запрашиваю этот модуль.

Добавлено через 2 минуты и 17 секунд
Цитата(Fortop @  29.9.2012,  19:05 Найти цитируемый пост)
Это вообще что?

А это чтоб стереть index.php с адресной строки чтоб не определяло как модуль index.php ))
PM MAIL   Вверх
ksnk
Дата 29.9.2012, 20:22 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



neoks, Единственное здравое решение, которое мне приходит в голову ( это кроме "сжечь такие исходники и написать все заново"  smile ) - завести таблицу, в которой каждой паре класс-метод будет соответствовать список необходимых для корректной работы инициализаций. Возможно, можно сэкономить строчки таблицы, если методы одного класса нуждаются в одинаковом списке стартовых объектов. Просто описать их для пустого метода этого класса. При вызове пары - просто вызывать нужные проверки до вызова.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
neoks
Дата 29.9.2012, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



ksnk я понял о чем ты клониш и все это у меня реализовано только без таблиц чтоб не использовать БД даром
Вот как уменя стартуют модули до того как запустить необходимый модуль к которому обратился пользователь.

user posted image

Тут все я контролирую, какой метод при каком модули или какой исключить и где его запустить )
Мне тут настроить как два пальца об* но вот другие врятли так быстро вдуплят что и как, вот и хочется иметь страховочный вариант  smile 
PM MAIL   Вверх
Fortop
Дата 30.9.2012, 09:51 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(neoks @  27.9.2012,  18:13 Найти цитируемый пост)
 у меня класс это модуль загружаемый с адресной строки, я могу вбить там любой модуль и любой метод ) и все это мне нужно проверять чтоб умники там не хулиганили 

Цитата(neoks @  29.9.2012,  17:05 Найти цитируемый пост)
когда модуль сам может самостоятельно все отсечь без вмешательств со стороны

Цитата(neoks @  29.9.2012,  20:07 Найти цитируемый пост)
но вот и прикол, я могу удалить это модуль если он мне не нужен  

Я не понимаю этого прикола
Либо он вам нужен чтобы умники не хулиганили, либо он вам не нужен.
Но вы, уж, батюшка либо трусы оденьте, либо крестик снимите...


Я вам собственно даже рассказывать уже что-либо опасаюсь.
Поскольку намеков вы не понимаете, язык, которым вы изъясняетесь, заставляет у меня шевелиться волосы в самых неожиданных частях тела при одной мысли, что вы еще и код пишете...


Но попробую...

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

Код


abstract class AbstractModule {

}


abstract class ModuleWithDB {
    public function __construct($connect = false) {
        if (!$connect) {
            throw new Exception ('No connect');
        }
    }
}

abstract class ModuleWithoutDb {
}

class MySampleModuleWithDB extends ModuleWithDb {
    public function someMethod() {
        echo 'called';
    }
}

// тут у нас служебная инициализация всего что должно обязательно работать.
// роутинг
// проверка прав доступа


// а тут уже идет вызов конкретного модуля
try {
    $module = new MySampleModuleWithDB();
    $module->someMethod();
} catch (Exception $e) {
    die('error');
}



У нас есть некий абстрактный модуль AbstractModule.
Далее этот модуль может либо требовать наличие БД ModuleWithDB,
либо не требовать ModuleWithoutDb

Все модули которым нужна БД у нас должны расширять класс ModuleWithDB (как MySampleModuleWithDB)
Если модулю не требуется наличие БД, то он будет расширять класс ModuleWithoutDb 


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


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
neoks
Дата 30.9.2012, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 5.7.2010

Репутация: нет
Всего: 1



Цитата(Fortop @  30.9.2012,  09:51 Найти цитируемый пост)
обязательный "системный" модуль.

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

Ух переписывать все это как то не вариант  smile 
Плюс скажем я хочу вызвать модуль в шаблоне, например тот же код что и в try
Код

$module = new MySampleModuleWithDB();
$module->someMethod();


Вылетит птичка Fatal error: Uncaught exception 'Exception' with message 'No connect' что есть не гуд так как это считается уязвимость, пихать в try cath ради одного модуля не вариант, + еше не понял как с него сделать автозагрузку модулей чтоб не писать постоянно new MySampleModuleWithDB() как я себе сделал ))

Для примера вот мой автозагрузчик

Код

class sl{
    var $ajaxLoad = false;
    var $content = '';
    var $header  = '';
    var $stopModule = false;
    
    function load($class,$params = false){
        global $ajaxLoad,$moduleInfo;
        
        $classFile = SL_DIR.'/modules/' . $class . '/class.php';
        
        if (!class_exists($class)) {
            if (is_file ($classFile)){
                require_once ($classFile);
                
                $_class = new $class($params);
                
                $this->$class = $_class;
                
                /**
                 * Ишим название классов
                 */
                
                $arr = (array)$this;
                
                foreach($arr as $name=>$obj) $buldName[] = $name;
                
                $buldName = array_unique($buldName);
                
                /**
                 * Переписываем глобальный класс во всех классах
                 */
                
                foreach($buldName as $obj) if(method_exists($this->$obj, 'init')) $this->$obj->init($this,($moduleInfo && $moduleInfo[0] == $obj ? array_merge($moduleInfo,[0=>$obj]) : [$obj]),$obj == $moduleInfo[0] && !empty($moduleInfo[3]) ? 1 : 0,$ajaxLoad);
                
                /**
                 * Вызываем функцию типа __construct()
                 */
                 
                if(method_exists($_class, 'init_member')) $this->$class->init_member();
            }
            else{
                if($moduleInfo[0] == $class){
                    if($ajaxLoad) echo json_encode(['error'=>'Класс ('.$class.') не найден'])."\n";
                    else echo $this->stpl() ? $this->stpl->class_error($class) : '<div class="classError">Класс ('.$class.') не найден</div>';
                }
                return false;
            }
        }
        return true;
    }
    function __call($class, $params = false) {
        return $this->load($class,$params);
    }
    function __get($class){
        if($this->load($class)) return $this->$class;
        else return $this;
    }
    public function __toString(){
        return $this->content;
    }
}

$sl = new sl();


Конечно стоило как то пошаманить с статическим классом но на тот момент я пока не разбирался ))
PM MAIL   Вверх
Fortop
Дата 30.9.2012, 12:03 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(neoks @  30.9.2012,  11:21 Найти цитируемый пост)
, + еше не понял как с него сделать автозагрузку модулей чтоб не писать постоянно new MySampleModuleWithDB() как я себе сделал ))

PHP это динамический язык
поэтому допускаются конструкты вида
Код

new $moduleName;

где $moduleName содержит имя класса.

Цитата(neoks @  30.9.2012,  11:21 Найти цитируемый пост)
пихать в try cath ради одного модуля не вариант

Цитата(neoks @  30.9.2012,  11:21 Найти цитируемый пост)
Вылетит птичка Fatal error: Uncaught exception 'Exception' with message 'No connect' что есть не гуд так как это считается уязвимость

После такого перла я, пожалуй, пас.

А вам читать... долго и упорно.

Шлосснейгл "Профессиональное программирование на PHP"
http://habrahabr.ru/post/30399/
http://www.phpfaq.ru/debug2
http://www.phpfaq.ru/debug3

Добавлено через 5 минут и 9 секунд
Ах, да.
А самый цимес в том, что в моем случае не возникает никаких ваших проблем.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0608 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.