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

Поиск:

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


Walking around mad.
***


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

Репутация: 21
Всего: 91



хай.

есть некий код:
Код


    $path = bj_sys_controllers_dir . $module . '.control.php';
    $act  = system::getParm( 'action' );

    if( ! file_exists( $path ) )
    {
  error::setError( system::lang( "page_not_found" ) );
    }
    
    require_once $path;


А как теперь можно вызвать, например,:
$module_controller::$action( );

Поясню, у нас модуль - login и action - page
надо вызвать login_controller::init( 'page' )
Как это реализовать? Никак не надумаю...


Это сообщение отредактировал(а) gta4kv - 21.10.2008, 19:54
PM MAIL   Вверх
Sunvas
Дата 21.10.2008, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


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

Репутация: 8
Всего: 89



gta4kv, пожалуйста, опишите проблему детальнее.


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
gta4kv
Дата 21.10.2008, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


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

Репутация: 21
Всего: 91



Sunvas
слов уж не хватает всё описать smile

Вызвается у нас модуль
/module/action/
запрос уходит в index.php?module=module&act=action
мне нужно что бы вызвался метод init( 'act' ) в классе module_controller

т.е с моим примером это будет
module_controller:init( 'action' );

если брать:
/news/show/
то должно вызваться:
news_controller::init( 'show' );
PM MAIL   Вверх
Sunvas
Дата 22.10.2008, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


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

Репутация: 8
Всего: 89



Единственное решение, которое мне представляется, это eval:
Код

eval($module."_controller:init( '".$act."' );");



--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
gta4kv
Дата 22.10.2008, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


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

Репутация: 21
Всего: 91



Ммм, значит будем искать другой подход.
eval... для меня такой функции нет. smile
PM MAIL   Вверх
Sunvas
Дата 22.10.2008, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


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

Репутация: 8
Всего: 89



Цитата(gta4kv @  22.10.2008,  09:12 Найти цитируемый пост)
eval... для меня такой функции нет.

Почему? Ну ладно, как вариант могу предложить:
Код

$module.='_controller';
$module::init($act);



--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
gta4kv
Дата 23.10.2008, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


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

Репутация: 21
Всего: 91



Sunvas, если бы, так нельзя. (пробовал уже)

Цитата

Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM


(такой метод катит только с ->)

Это сообщение отредактировал(а) gta4kv - 23.10.2008, 19:06
PM MAIL   Вверх
sTa1kEr
Дата 23.10.2008, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


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

Репутация: 56
Всего: 146



gta4kv,
Код

call_user_func_array($module.'::init', array($act));

Или через рефлекшен
Код

$method = new ReflectionMethod($module, 'init');
$method->invoke(null, $act);


Это сообщение отредактировал(а) sTa1kEr - 23.10.2008, 19:41
PM MAIL   Вверх
gta4kv
Дата 23.10.2008, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


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

Репутация: 21
Всего: 91



sTa1kEr
Что по-твоему мнению предпочтительнее в данной ситуации? (Да и вообще).
PM MAIL   Вверх
sTa1kEr
Дата 23.10.2008, 20:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


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

Репутация: 56
Всего: 146



Цитата(gta4kv @  23.10.2008,  20:48 Найти цитируемый пост)
Что по-твоему мнению предпочтительнее в данной ситуации? (Да и вообще). 

Предпочтительнее вообще избегать подобных решений. Но если от этого не уйти, то, имхо, лучше использовать рефлекшены. Это несколько безопаснее, удобнее и значительно функциональнее. Но по большому счету - это дело вкуса/стиля.
PM MAIL   Вверх
gta4kv
Дата 23.10.2008, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


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

Репутация: 21
Всего: 91



Цитата

Предпочтительнее вообще избегать подобных решений.

Я тоже так думаю, но а как лучше то можно сделать? 
Вот код: 
(думаю будет понятна идея)
Код

$module = system::getParm( 'module' );
if( ! $module )
{
    template::init( 'index' );
}
else 
{
    $path = bj_sys_controllers_dir . $module . '.control.php';
    $act  = system::getParm( 'action' );
     
    if( ! file_exists( $path ) )
    {
        error::setmsg( system::lang( 'page_not_found', 'system' ) );
        return;
    }
    
    if( ! $act ) $act = 'page';
    
    require_once $path;
    
    
    try
    {
        $method = new ReflectionMethod( $module . '_controller' , 'init' );
        $method -> invoke( null, $act );
    }
    catch ( Exception  $e )
    {
        error::setmsg( system::lang( 'someerror', 'system' ) );        
    }
}


т.е задача сделать "систему" модульной. (динамической/расширяемой(как больше нравится))

Это сообщение отредактировал(а) gta4kv - 23.10.2008, 20:25
PM MAIL   Вверх
sTa1kEr
Дата 23.10.2008, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


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

Репутация: 56
Всего: 146



Цитата(gta4kv @  23.10.2008,  21:19 Найти цитируемый пост)
Я тоже так думаю, но а как лучше то можно сделать? 

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

Это сообщение отредактировал(а) sTa1kEr - 23.10.2008, 20:37
PM MAIL   Вверх
gta4kv
Дата 23.10.2008, 20:41 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


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

Репутация: 21
Всего: 91



sTa1kEr, можно подробнее?
Имеешь в веду сделать интерфейс и описать там все стандартные методы?
Я, на самом то деле, думаю что это не пригодится. Так как разработкой занимаюсь я сам, и модули все тоже буду я писать. smile
PM MAIL   Вверх
sTa1kEr
Дата 23.10.2008, 21:09 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


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

Репутация: 56
Всего: 146



Цитата(gta4kv @  23.10.2008,  21:41 Найти цитируемый пост)
Так как разработкой занимаюсь я сам, и модули все тоже буду я писать.

Это не имеет значения. С точки зрения PHP ты вызываешь совершенно неизвестный метод совершенно не известного ему класса. Имхо, это очень плохой стиль программирования (кстати, возможный только в PHP), который может привести не самым лучшим результатам. Если уж ты обращаешься к классу с неизвестным тебе именем, а тем более если имя это приходит "из-вне", то как минимум методы доступа к этому классу просто обязаны быть как-то описаны.
Для данной задачи интерфейс контроллера должен как минимум иметь метод init
Код

interface IController
{
    static function init($action);
}


И соответственно перед вызовом этого метода PHP должен знать, что класс имплементирует этот интерфейс.
Код

$controller = new ReflectionClass($module.'_controller');
if (!$controller->implementsInterface('IController'))
{
    throw new Exception('Not implemented', 0);
}

// С этого момента $controller это уже не неизвестный и/или какой-то левый класс, 
// а именно контроллер, не отличающийся от контроллера с известным именем
$controller->getMethod('init')->invoke(null, $act); // Здесть никогда не будет fatal error: method not exists

PM MAIL   Вверх
gta4kv
Дата 23.10.2008, 21:45 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


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

Репутация: 21
Всего: 91



sTa1kEr, благодарен за исчерпывающий ответ.


Цитата

Имхо, это очень плохой стиль программирования 

Ну, как уже выше обсуждалось, по-другому не выходит. smile
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

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

Важно:

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

Внимание:

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

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

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


 




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


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

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