Manual CallBack для GameCMS

oni

Участник
Сообщения
4
Реакции
3
Баллы
3
Данная статья расскажет Вам о том, как внести в движок GameCMS систему CallBack (отлова тех или иных событий в системе).
Было бы отлично, если бы данная система была бы внесена в предстоящих обновлениях движка.

И так, начнем:
Для начала, нам нужно создать файл inc/callback.php со следующим содержимым:
PHP:
    require_once(
        __DIR__ . '/classes/class.callback.php'
    );
    
    $CallBack = new CallBack;                        // Вызов класса
    
    $CallBack->Register([
        __DIR__ . '/callbacks/',                    // Регистрация директории
        __DIR__ . '/callbacks/admin/'                // Регистрация директории
    ]);
    
    $CallBack->Execute();                            // Исполнение

А так же создать inc/classes/class.callback.php со следующим содержимым:
PHP:
    /*
        Автор: ONI ANY
        Телеграм: https://t.me/oniany
    */
    class CallBack {
        var $Calls = [], $Path = [];
        
        public function Register($Path) {
            $this->Path += $Path;
        }
        
        public function Add($_ACTION, Closure $_DATA) {
            $this->Calls[] = [
                $_ACTION => $_DATA
            ];
        }
        
        public function Call($_NAME, $_ARGS = []) {
            foreach($this->Calls as $_CALL) {
                if(array_key_exists($_NAME, $_CALL)) {
                    if(!is_callable($_CALL[$_NAME])) {
                        throw new Exception('Функция обратного вызова - не вызываемая!');
                    }
                    
                    call_user_func($_CALL[$_NAME], $_ARGS);
                }
            }
        }
        
        public function GetList() {
            return $this->Calls;
        }
        
        public function Execute() {
            foreach($this->Path as $Path) {
                $Dirs = scandir(
                    $Path
                );
                
                foreach($Dirs as $Key => $Link) {
                    if(is_dir($Path . $Link)) {
                        unset(
                            $Dirs[$Key]
                        );
                        
                        continue;
                    }
                    
                    require_once(
                        $Path . $Link
                    );
                }
            }
        }
    }

Прописываем в inc/config.php (в самый низ):
PHP:
require_once __DIR__ . '/callback.php';

А так же создать директорию inc/callbacks, где будут расположены наши функции под вызов.
Для примера, предлагаю отлов вызова в ajax/admin_panel.php
Создаем inc/callbacks/admin/request.php с содержимым:
PHP:
    $this->Add('AdminRequest', function($_ARGS) {
        file_put_contents(
            $_SERVER['DOCUMENT_ROOT'] . '/log.txt',
            json_encode($_ARGS)
        );
    });

И не забываем прописать вызов функции в удобное для нас место, к примеру в ajax/admin_panel.php, для вызова AdminRequest:

PHP:
$CallBack->Call('AdminRequest', [
'POST' => $_POST,
'GET' => $_GET
]);

В итоге мы получим возможность вызывать функции для отлова тех или иных событий в системе.
 

Вложения

  • GameCMS CallBack.zip
    3 KB · Просмотры: 7
Назад
Сверху