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

Поиск:

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


Опытный
**


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

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



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

Но темнемение __construct() удобен тем что в нем мона все проверить и потом назначить какой-та var true или false нежели в каждом методе проверять все параметры, а так нуно будет проверить одну var ))

Но мне интересовало возможно ли вообще обойтись без проверки в методах ? чтоб за них делал какой-та специальный метод ? как я показал в примере, видимо это нереально, ну тогда буду значить и дальше проверять везде ))
PM MAIL   Вверх
Fortop
Дата 28.9.2012, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(neoks @  28.9.2012,  15:24 Найти цитируемый пост)
та var писать мов доступ запрещен и потом в каждом методе все равно проверять эту var разрешено или нет

Зачем?

У вас на каждое посещение адреса будет инстанцирование объекта, а значит вызовется конструктор.


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


Опытный
**


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

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



Цитата(Fortop @  28.9.2012,  15:55 Найти цитируемый пост)
У вас на каждое посещение адреса будет инстанцирование объекта, а значит вызовется конструктор. 


Ну а что толку мне от него ?

вызываю модуль с адресной строки http://site.ru/МОДУЛЬ ТО ЕСТЬ CLASS/МЕТОД ТО ЕСТЬ ЛЮБОЙ/ПАРАМЕТРЫ

а значит вот что ))

Код

class test{
    var $stop = false;

    function __construct(){
        // и что мне тут делать ? могу тока некоторый проверки сделать и вписать $this->stop = true;
    }
    function a(){
        // ну и как мне узнать разрешено или нет ? все работает или нет ? могу только проверить if($this->stop) return; значит что то пошло не так и мне сюда нельзя
        return 'full accsec';
    }
}


В результате если я не буду использовать $this->stop то по этому адресу http://site.ru/test/a вернет мне результат full access что значит не какой проверки не было и кто угодно может что угодно сделать без ведома админа ))

Меня интересует именно метод без проверки на if($this->stop) return;  smile 

Это сообщение отредактировал(а) neoks - 28.9.2012, 18:40
PM MAIL   Вверх
Fortop
Дата 28.9.2012, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(neoks @  28.9.2012,  18:38 Найти цитируемый пост)
Ну а что толку мне от него ?

Цитата(neoks @  28.9.2012,  18:38 Найти цитируемый пост)
В результате если я не буду использовать $this->stop то по этому адресу http://site.ru/test/a вернет мне результат full access что значит не какой проверки не было и кто угодно может что угодно сделать без ведома админа ))

 smile 
феерично
Вот в который раз убеждаюсь, что люди ищут не ответ на вопрос, а черти что.

Ознакомьтесь
Код

class Sample {
    public function __construct() {
        if (!checkUserRights) {
            throw new Exception("Что-то пошло не так");
        }
    }
    public function someMethod() {

    }
}


В качестве checkUserRights может стоять проверка в ACL - имеет ли доступ пользователь данной сессии к данному урлу.
Но ваши проблемы проверки прав доступа к данному вопросу вообще не относятся.

Поскольку более правильным будет другой подход.
Т.е. у вас имеется приложение следующего вида:
  • Точка входа (роутер/контроллер и т.д.)
  • Модули.


Вопрос имеет ли право данный пользователь получить доступ к данному URL решается на этапе роутинга при помощи ACL
Модулям должно быть вообще безразлично кто и какие права имеет.

Соответственно, если проверка прав доступа провалена, то никакой модуль и метод не вызывается.




Это сообщение отредактировал(а) Fortop - 28.9.2012, 19:44


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


Опытный
**


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

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



Цитата(Fortop @  28.9.2012,  19:42 Найти цитируемый пост)
Вот в который раз убеждаюсь, что люди ищут не ответ на вопрос, а черти что.

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

Попробовал и мне выбело вот такую ошибку 
Fatal error: Uncaught exception 'Exception' with message 'Что-то пошло не так'

Это что то не так написано или так и должно быть ?  smile 
Вижу Exception' with message значит наверно так и должно быть, а как теперь избавится от этого сообщения ? )

Добавлено через 3 минуты и 30 секунд
Цитата(Fortop @  28.9.2012,  19:42 Найти цитируемый пост)
Вопрос имеет ли право данный пользователь получить доступ к данному URL решается на этапе роутинга при помощи ACL

Движок полностью модульный и роутер не имеет не каких php функций, все делают модули, + не на всех модулях нужно проверять а также помимо доступа нуно проверить и другие параметры если понадобится ) например работает ли БД и тд
PM MAIL   Вверх
Fortop
Дата 28.9.2012, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(neoks @  28.9.2012,  20:07 Найти цитируемый пост)
 а как теперь избавится от этого сообщения ? )


Код

try {
    //тут наш код
} catch (Exception $e) {
    //тут обработка ошибок
}





Цитата(neoks @  28.9.2012,  20:07 Найти цитируемый пост)
Движок полностью модульный и роутер не имеет не каких php функций, все делают модули, + не на всех модулях нужно проверять а также помимо доступа нуно проверить и другие параметры если понадобится ) например работает ли БД и тд 

Подключение к БД - в конструктор.
А роутер переписать будет достаточно легко.
И это будет намного проще чем пытаться внедрить все эти проверки в каждый ваш модуль.


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


Опытный
**


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

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



Набросал пример для теста какой та из того что понял что эта такое ))

Код

class Sample {
    public function __construct() {
try {

    $fh = fopen("contacts.txt", "r");
    if (! $fh) {
        throw new Exception("Could not open the file!");
    }
}
catch (Exception $e) {
    echo "Error (File: ".$e->getFile().", line ".
          $e->getLine()."): ".$e->getMessage();
}
    }
    public function someMethod() {
        return 'test result oblom ))';
    }
}

$a = new Sample;

echo $a->someMethod();


Все также, вернуло  Error (File: C:\Winginx\home\roki.com\public_html\index.php, line 54): Could not open the file !test result oblom ))
Где test result oblom )) это результат метода someMethod


Цитата(Fortop @  28.9.2012,  21:22 Найти цитируемый пост)
И это будет намного проще чем пытаться внедрить все эти проверки в каждый ваш модуль.

В этом и дело, из 10 модулей понадобится 2м проверка БД, МОДУЛЯ БД !!, модулю БД может понадобится проверка права доступа, другому модулю может понадобится проверить то и то, другим вообше что та другое и так далее )

Я не знаю кому что может понадобится проверить и следовательно в роутер я не могу впихнуть куча проверок )

PM MAIL   Вверх
Fortop
Дата 29.9.2012, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



 smile жесть

Код

try {
  $module = new Module();
 $module->method();
} catch (Exception $e) {

}



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


Опытный
**


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

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



Ладно, буду дальше проверять как и проверял, пока в этот try cath не врубаюсь зачем оно нуно так как любой пример у меня не пашет, смысл не понятен  smile 

Вот грубый тест
Код

class Module{
    function __construct(){
        return false;
    }
    function method(){
        echo 'test module';
    }
}


try {
  $module = new Module();
 $module->method();
} catch (Exception $e) {
    echo 'error';
}


Вернуло test module или я снова чет напутал ? ))
PM MAIL   Вверх
Fortop
Дата 29.9.2012, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Из конструктора нужно бросать исключение


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


Опытный
**


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

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



Ну вот снова и таже история
Цитата(Fortop @  29.9.2012,  15:07 Найти цитируемый пост)
Из конструктора нужно бросать исключение 


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

Мона один но нормальный пример показать ?  smile  нечего удивительно что на форумах разводят такой флуд как я ша развожу )) ибо пример я не скоро увижу а буду пытаться чет химичить и по сто раз спрашивать что на сей раз и тд пока наконец то не увижу полноценный нормальный пример )

PM MAIL   Вверх
Fortop
Дата 29.9.2012, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(neoks @  29.9.2012,  15:22 Найти цитируемый пост)
Как там бросить ? че нуно сделать ? каким макаром ?

В мануал.
И изучаем синтаксис, как бросать исключения.

выше уже были примеры.

У вас очень простая схема.
  • Пришел урл, проверили, имеет ли доступ к нему человек 
  • если имеет, то в блоке try/catch создали класс модуля, где в кострукторе установили/проверили наличие подключения БД
    •  если подключение есть - ок
    •  если подключения нет - то бросили исключение
  • если не имеет, то завернули еще до вызова модуля.

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



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


Опытный
**


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

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



Цитата(Fortop @  29.9.2012,  16:31 Найти цитируемый пост)
Пришел урл, проверили, имеет ли доступ к нему человек 

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

У меня все же напротив, у меня есть роутер и автозагрузка класса, вот и весь движок, всего 2 файла не превышающие 140 строчек кода, а все остальное это самостоятельные модули.

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

Разумеется зачем мне это нужно ? когда модуль сам может самостоятельно все отсечь без вмешательств со стороны, вопрос как его заставить чтоб в каждом методе не проверять
И да, мануалы я читал и примеры тестил, логику я пока не понял, что эта такое и зачем оно нужно мне не понятно, взял пример с проверкой соединения с базой данных, не знаю чем оно лучше if(), if() хоть правильно проверил а try cath даже не пискнул  smile 

Следовательно здесь я хоть спросил как это сделать на примере чтоб врубится для чего же оно, в мануалах я уже второй день читаю и не вкуриваю, куча примеров перебробывал и все они почти не работают, как по мне лучше все таки if() юзать чем это  smile 
PM MAIL   Вверх
Fortop
Дата 29.9.2012, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

Кто сказал что не можете?

А как вы вообще планируете реализовывать ACL?

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

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



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


Опытный
**


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

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



Ну вот скажем роутер
Код

$uri = $_SERVER["REQUEST_URI"];

$realPathS = str_replace('index.php','',$_SERVER['SCRIPT_NAME']);

$uri = substr($uri,strlen($realPathS),strlen($uri));

$uri = preg_replace("'([/]+)'si",'/',$uri);

if($uri[0] == '/') $uri = substr($uri,1,strlen($uri));

$xp = explode('/',$uri);

$ajaxLoad = $xp[0] == 'ajax' ? true : false;

if($ajaxLoad) array_shift($xp);

$uri_r = implode('/',$xp);

/**
 * Параметры модуля
 */
 
$modul  = preg_replace("'[^a-z0-9_]'si",'',$xp[0]);
$action = preg_replace("'[^a-z0-9_]'si",'',$xp[1]);
$params = array_slice($xp,2);

foreach($params as $pk=>$pv) $params[$pk] = urldecode($pv);

if($modul && !$action) $action = 'show';

$moduleInfo = [$modul,$action,$params,$ajaxLoad,true,false];

/**
 * Параметры шаблона
 */

$tpl = $sl->settings->get('tpl_name');
 
define('TPL_NAME',$tpl == '' ? 'default' : $tpl);
define('TPL_DIR',SL_DIR.DIR_SEP.'tpl'.DIR_SEP.TPL_NAME);
define('TPL_ALT_DIR','/tpl/'.TPL_NAME);

/**
 * Редирект на файл если есть
 */
 
if($uri !== '' && file_exists(TPL_DIR.DIR_SEP.$uri) && !strstr(end($xp),'php')){
    header('Location: ' . TPL_ALT_DIR.'/'.$uri);  
    die();
}
/**
 * Инициализация модулей
 */
$init_mod = $sl->fn->conf('get',SL_DATA.DIR_SEP.'init_modules');

foreach((is_array($init_mod) ? $init_mod : []) as $key=>$arr){
    $findEx = false;
    
    if($key != '' && $arr['method'] != '' && $arr['status'] == 1){
        $excluded = explode("\n",trim($arr['excluded']));
        
        foreach($excluded as $goex){
            $goex = trim($goex);
            if($goex !== ''){
                if(@substr($uri_r,0,strlen($goex)) == $goex){
                    $findEx = true;
                    break;
                }
            }
        }
        if(!$findEx){
            if(($arr['type'] == 2 || $arr['type'] == 4) || (($arr['type'] == 3 || $arr['type'] == 5) && !$ajaxLoad)){
                
                if($arr['is_module'] !== ''){
                    $is_m_ex = explode("\n",trim($arr['is_module']));
                    
                    foreach($is_m_ex as $ifex){
                        if(@substr($uri_r,0,strlen($ifex)) == $ifex){
                            $sl->$key->$arr['method']();
                            break;
                        }
                    }
                }
                else $sl->$key->$arr['method']();
            }
        }
    } 
}
/**
 * Загрузка модуля
 */
if($modul !== '' and $action !== '' and !$sl->stopModule){
    
    if($sl->fn->infomod($modul)['status'] == 'on' || $modul == 'fn'){
        if($sl->$modul()){
            if(method_exists($sl->$modul, $action)){
                if(!$ajaxLoad) $sl->$modul->modInfo[5] = true;
                
                $sl->content = call_user_func_array([$sl->$modul, $action], $params);
                
                /**
                 * ILINK
                 */
                 
                $ilink = $sl->fn->conf('get',SL_DATA.DIR_SEP.'ilink');
                
                foreach($ilink as $imod){
                    if($imod['status']){
                        if(@substr($uri_r,0,strlen(trim($imod['module']))) == trim($imod['module'])){
                            $iac_ex = explode('/',trim($imod['action']));
                            
                            if($iac_ex[0] && $iac_ex[1]) $sl->content .= $sl->$iac_ex[0]->$iac_ex[1](array_slice($params,intval($imod['offset'])),explode("\n",trim($imod['params'])));
                        }
                    }
                }
            } 
        }
    }
    else{
        if($ajaxLoad) $sl->fn->info('Модуль ('.$modul.') отключен');
        else $sl->content = $sl->stpl->module_off($modul);
    }
}

if($sl->stopModule){
    if($ajaxLoad) $sl->fn->info('Модуль ('.$modul.') был остановлен по требованию инсталляционного модуля');
    else $sl->content = $sl->stpl->stop_module('Модуль ('.$modul.') был остановлен по требованию инсталляционного модуля');
}

if($ajaxLoad){
    echo is_array($sl->content) ? json_encode($sl->content) : $sl->content; die();



Как мне тут реализовать ?  smile 

Цитата(Fortop @  29.9.2012,  17:27 Найти цитируемый пост)
А как вы вообще планируете реализовывать ACL?

Очень просто, через Инициализацию модулей которая настроена по стандарту, я настроил и забыл
Модули успешно все отсекают если все проверять в каждом методе как я ша и делаю, просто мне интересовал метод чтоб не писать проверку в каждом методе чтоб все проверял только один метод )
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.0591 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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