PurpleSchool — курсы программирования онлайн
  • Пути
    • Frontend React разработчик
    • Frontend Vue разработчик
    • Backend разработчик Node.js
    • Fullstack разработчик React / Node.js
    • Mobile разработчик React Native
    • Backend разработчик Golang
    • Devops инженер
    • Backend разработчик Python
  • AI для кодаНовое
  • О нас
    • Отзывы
    • Реферальная программа
    • О компании
    • Контакты
  • Иконка открытия меню
    • Сообщество
    • PurpleПлюс
    • AI Собеседование
    • AI тренажёр
    • Проекты
PurpleSchool — платформа бесплатных roadmap и курсов для разработчиков
ютуб иконка
Telegram иконка
VK иконка
VK иконка
Курсы
ГлавнаяКаталог курсовFrontendBackendFullstack
Практика
КарьераПроектыPurpleПлюс
Материалы
БлогБаза знаний
Документы
Договор офертаПолитика конфиденциальностиПроверка сертификатаМиграция курсовРеферальная программа
Реквизиты
ИП Ларичев Антон АндреевичИНН 773373765379contact@purpleschool.ru

PurpleSchool © 2020 -2026 Все права защищены

  • Курсы
    • FrontendИконка стрелки
    • AI разработкаИконка стрелки
    • BackendИконка стрелки
    • DevOpsИконка стрелки
    • MobileИконка стрелки
    • ТестированиеИконка стрелки
    • Soft-skillsИконка стрелки
    • ДизайнИконка стрелки
    Иконка слояПерейти в каталог курсов
  • Бесплатно
    • Курсы
    • JavaScript Основы разработкиPython Основы PythonCSS CSS FlexboxКарта развитияВопросы для собеседований
    • База знанийИконка стрелки
    • Новостные рассылкиИконка стрелки
  • PurpleSchool — курсы программирования онлайн
    • AI для кодаНовое
    • Сообщество
    • PurpleПлюс
    • AI Собеседование
    • AI тренажёр
    • Проекты
    Главная
    Сообщество
    Управление распределенной системой на Framework Foton

    Управление распределенной системой на Framework Foton

    Аватар автора Управление распределенной системой на Framework Foton

    Константин

    Иконка календаря19 октября 2026
    распределенная системаframework FotonseniorИконка уровня senior
    Картинка поста Управление распределенной системой на Framework Foton

    Для создания своей распределенной системы на Framework Foton в отличии от других фреймворков вместо middlware и сервис провайдеров используются типы запросов. Типы запросов - это полноценные изолированные области фреймворка которые могут взаимодействовать со всей системой и даже включать в себя другие типы запросов, но через api, посредством RPC методов могут запускать микросервисы, но при этом имеют свой собственный роутинг, рендеринг и пространство имен.

    В этой статье мы рассмотрим создание своего типа запроса.

    В файле /core/etting/dev.php вы можете найти основные настройки типов запросов 

    <?php
    $arr['typeFormat'] = [
        "function"=>[
            "mvc"=>[
                "tpl"=>"/app/view/[dir]/[name].tpl",
                "php"=>"/app/view/[dir]/[name].php",
                "api"=>"/system/api/tpl/[dir]/[name].php"
            ],
            "modul"=>[
                "view"=>"/dev/modul/[name]/index.php",
                "modul"=>"/dev/modul/[name]/[method]/index.php"
            ],
            "widget"=>[
                "view"=>"/dev/widget/".$arr['sitedir']."/[name]/index/template.php",
                "style"=>"/dev/widget/".$arr['sitedir']."/[name]/index/style.php",
                "script"=>"/dev/widget/".$arr['sitedir']."/[name]/index/script.php"
            ],
            "micro"=>[
                "tpl"=>"/dev/service/micro/[name]/return/index.tpl",
                "setting"=>"/dev/service/micro/[name]/setting.json"
            ],
            "face"=>[
                "view"=>"/app/face/".$arr['admindir']."/tpl/[name].tpl",
                "method"=>"/app/face/".$arr['admindir']."/tpl/[name]/[method].tpl"
            ],          
            "tpl"=>[
                "view"=>"/app/type/".$arr['sitedir']."/tpl/[name].php"
            ],
            "tplfront"=>[
                "style"=>"/app/type/".$arr['sitedir']."/css/[name].css",
                "script"=>"/app/type/".$arr['sitedir']."/js/[name].js"
            ],
            "ajax"=>[
                "ajax"=>"/dev/modul/[name]/ajax.php",
                "view"=>"/dev/modul/[name]/ajax/[method].php"
            ],
            "ajaxadmin"=>[
                "ajax"=>"/app/ajax/".$arr['admindir']."/[name].php",
                "view"=>"/app/ajax/".$arr['admindir']."/".$arr['admindir']."/[name]/[method]/index.php"
            ],
            "ajaxsite"=>[
                "ajax"=>"/app/ajax/".$arr['sitedir']."/[name].php",
                "view"=>"/app/ajax/".$arr['sitedir']."/".$arr['sitedir']."/[name]/[method]/index.php"
            ]        
        ],
        "admin"=>[
            "modul",
            "face", 
            "ajax",
            "ajaxadmin",
        ],
        "boot"=>[
            "mvc"=>[
                "Controller",
                "Model"
            ],  
            "modul"=>"ModulController",
            "widget"=>"Widget",
            "micro"=>"Micro",
            "face"=>"Faces",          
            "tpl"=>"Tpl",
            "tplfront"=>"Tpl",
            "ajax"=>"Ajax",
            "ajaxadmin"=>"Ajaxadmin",
            "ajaxsite"=>"Ajaxsite"
        ],
        "front"=>[
            "mvc"=>[
                "css"=>["/app/view/[dir]/css/style.css","/app/view/[dir]/css/[page].css","/app/view/[dir]/css/[head].css","/app/view/[dir]/css/[foot].css"],
                "js"=>["/app/view/[dir]/js/jquery.js","/app/view/[dir]/js/script.js","/app/view/[dir]/js/[page].js","/app/view/[dir]/js/[foot].js"]  
            ],
            "modul"=>[
                "css"=>["/dev/modul/[page]/css/style.css","/dev/modul/[page]/css/face.css"],
                "js"=>["/app/view/".$arr['admindir']."/js/jquery.js","/dev/modul/[page]/js/face.js","/dev/modul/[page]/js/script.js"] 
            ],
            "face"=>[
                "css"=>["/app/view/".$arr['admindir']."/css/style.css","/app/view/".$arr['admindir']."/css/[head].css","/app/view/".$arr['admindir']."/css/[foot].css","/app/face/".$arr['admindir']."/css/[page].css"],
                "js"=>["/app/view/".$arr['admindir']."/js/jquery.js","/app/view/".$arr['admindir']."/js/script.js","/app/view/".$arr['admindir']."/js/[head].js","/app/view/".$arr['admindir']."/js/[foot].js","/app/face/".$arr['admindir']."/js/[page].js"]
            ]
        ],
        "recurse"=>[
            "ajaxadmin",
            "ajaxsite"
        ],
        "autoload"=>[
            "mvc"=>[
                "Controller"=>"app/controller/[name].php",
                "Model"=>"app/model/[name].php"
            ],
            "modul"=>[
                "ModulController"=>"dev/modul/[name]/controller.php",
                "ModulModel"=>"dev/modul/[name]/model.php"
            ],
            "widget"=>[
                "Widget"=>"dev/widget/".$arr['sitedir']."/[name]/index.php"
            ],
            "micro"=>[
                "Micro"=>"dev/service/micro/[name]/return/class.php"
            ],
            "face"=>[
                "Faces"=>"app/face/".$arr['admindir']."/php/[name].php"
            ],          
            "tpl"=>[
                "Tpl"=>"app/type/".$arr['sitedir']."/php/[name].php"
            ],
            "ajax"=>[
                "Ajax"=>"dev/modul/[name]/ajax.php"
            ],
            "ajaxadmin"=>[
                "Ajaxadmin"=>"app/ajax/".$arr['admindir']."/[name].php"
            ],
            "ajaxsite"=>[
                "Ajaxsite"=>"app/ajax/".$arr['sitedir']."/[name].php"
            ]  
        ]
    ];
    

    Ключ function содержит пути к файлам методов по ключам типов запроса, пути к css,js,php файлам

    Ключ admin содержит список значений типов запросов, если тип запроса включен в список, доступ к данному типу будет открыт только для авторизованных в админ панели пользователей

    Ключ boot содержит namespace типов запросов

    Ключ front содержит списки массивов данных содержащих пути подключения front-end файлов

    Ключ recurse содержит типы запросов, в которых может работать вложенность методов и последовательный вызов в текучем интерфейсе как 

    <?php
    $this->core->view()->ajaxsite->test->test2->test3->end();
    

    Ключ autoload содержит список с ключами являющимися типами запросов и значениями как список с ключами namespace типов запросов и значениями путями к файлам с соответствующими классами

    После добавления своего типа в настройки необходимо добавить файл с определением класса типа запроса по пути /core/foton/view/type/ваштип.php

    Вот пример файла для ajax запросов сайта

    <?php
    namespace Foton\View\Type;
    
    final class Ajaxsite{
        public function appclass($class,$name){
            $arr = explode('\',$name);
            $method = array_pop($arr);
            $class = ucfirst($class);
            foreach($arr as $item){
                $class.= '\'.ucfirst($item);
            }
            $class = str_replace('Ajaxsite','Ajaxsite\Site',$class); 
            return $class;
        }
    
        public function datareturn(\Foton\View $view,$obj,$nameSpace){
            $arr = explode('\',$view->page);
            $name = array_pop($arr);
            if(method_exists($obj,$name)){
                if(empty($view->attr)){
                    $view->data = $obj->$name(); 
                }
                else{       
                    $view->data = $obj->$name(...array_values($view->attr)); 
                }
                return $view; 
            }
            echo 'Метода не существует';        
        }
    
        public function render(\Foton\View\Render $render){        
            $page = $render->view->page;
            if($render->init->setting('ajaxsite')){
                //переопределяем формат вывода объекта new Format
                $render->init->format = 'ajaxsite';
                $render->init->wrapper = 'page';
                $render->init->page($page);
                //подключаем языковые файлы
                $render->init->lang();
            }
            return $render;
        }
    }
    

    Класс обязательно должен быть финализирован, чтобы не было возможности создания дубликата объекта

    Также класс должен содержать основные методы:

    appclass($class,$name)

    datareturn(FotonView $view,$obj,$nameSpace)

    render(FotonViewRender $render)

    Первый метод формирует namespace из url типа запроса

    Второй метод datareturn формирует массив data для использования в представлении

    Третий метод render после получения и проверки всех данных из свойства setting формирует  страницу с определением формата, оболочки, инициализации страницы и подключения языковых файлов

    cli() - не обязательный метод, если его добавить он будет вызываться для данного типа запроса через командную строку с помощью команды

    php foton type названиевашеготипа_запроса

    Создадим пример типа запроса

    <?php
    $arr['typeFormat'] = [
        "function" => [
            "mvc" => [
                // ...
            ],
            "report" => [                  // <-- новый тип
                  "tpl"  => "/dev/report/view/[name].tpl",
                  "view" => "/dev/report/view/[name].php",
                  "api"=>"/system/api/tpl/report/[name].php"
            ],
            // остальные типы...
        ],
        "admin" => [
            // ...
            "report",                      // <-- разрешаем доступ только в админке (если нужно)
        ],
        "boot" => [
            // ...
            "report" => "Report",          // <-- имя класса (без namespace), будет сопоставлено с FotonViewTypeReport
        ],
        "front" => [
            // можно добавить css/js, если отчётам нужны свои стили/скрипты
            "report" => [
                "css" => ["/dev/report/css/[page].css"],
                "js"  => ["/dev/report/js/[page].js"]
            ]
        ],
        "recurse" => [
            // если нужна вложенность методов, добавляем сюда
            // "report",
        ],
        "autoload" => [
            "report" => [
                "Report" => "dev/report/[name].php"  // путь к файлу класса типа
            ]
        ]
    ];
    

    Создаем файл типа запроса report

    <?php
    namespace Foton\View\Type;
    use Foton\Lib\Cli;
    final class Report
    {
        /**
         * Формирует namespace из URL типа запроса.
         * В простом случае можно возвращать тот же класс или модифицировать его.
         */
       public function appclass($class, $name)
        {
            $arr = explode('\',$name);
            if(count($arr)>1){
                $method = array_pop($arr);
                $class = ucfirst($class);
                foreach($arr as $item){
                    $class.= '\'.ucfirst($item);
                }
            }
            else{
                $class = $class.'\'.ucfirst($name);
            }
            return $class;
        }
    
        /**
         * Метод для работы с CLI
         */
        public function cli(){
            $cli = new Cli;
            return $cli->green('Инициализация метода cli');
        }
    
        /**
         * Получает данные из метода контроллера и кладёт в $view->data.
         */
        public function datareturn(Foton\View $view, $obj, $nameSpace)
        {
            
            $pageParts = explode('\', $view->page);
            //если в ЧПУ есть метод ищем его и только его и подключаем
            if(count($pageParts)>1){
                $name = array_pop($pageParts);
                if (method_exists($obj, $name)) {
                    if (empty($view->attr)) {
                        $view->data[$name] = $obj->$name();
                    } else {
                        $view->data[$name] = $obj->$name(...array_values($view->attr));
                    }
                    
                    return $view;
                }
            }
            // иначе подключаем все доступные методы
            else{
                foreach(get_class_methods($obj) as $method){
                    if (empty($view->attr)) {
                        $view->data[$method] = $obj->$method();
                    } else {
                        $view->data[$method] = $obj->$method(...array_values($view->attr));
                    }
                }
                return $view;
            }
            echo 'Метода не существует';
            return $view;
        }
    
        /**
         * Настраивает формат вывода, обёртку, страницу, языки и т.п.
         */
        public function render(Foton\View\Render $render)
        {
            $page = $render->view->page;
    
            if ($render->init->setting('report')) {
                // Устанавливаем формат вывода специально для отчётов
                $render->init->format = 'report';
                $render->init->wrapper = 'page';
    
                // Инициализируем страницу
                $render->init->page($page);
    
                // Подключаем языковые файлы
                $render->init->lang();
            }
    
            return $render;
        }
    }
    

    Так как мы добавили свой формат report в метод render нам нужно также добавить метод для работы в библиотеку форматов в трейт Format /core/foton/view/lib/format.php

    <?php
        // 3 аргумента берутся по ключам из настройки function в typeFormat (/core/setting/dev.php)
     public function report($tpl,$view,$api){
            //Подключаем глобальный класс инициализации
            $init = new Foton\View\Init($this->view);
            // записываем в массив данных, для того, чтобы инициализировать подключение css,js на странице представления, так как могут быть страницы в формате json  и т.д.
            $this->view->data['css'] = $init->css();
            $this->view->data['js'] = $init->js();
            $this->tpl($tpl,$view,$api);
     }
    

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

    Теперь создаем файл класса Report /dev/report/sales.php

    И файл представления /dev/report/view/sales.tpl

    Добавим содержимое класса

    <?php
    namespace Report;
    
    class Sales
    {
        // Метод, который будет вызван при обращении к report-типу
        public function summary($month=null)
        {
            global $FG;
            if($month!=null){
                  return $month;
           }
            return  $FG->get()->month;
        }
    }
    

    И представление для типа запроса

    <h1>Отчёт по продажам за @{data['summary'] }</h1>
    <p>Можно добавить как пример Итого: @{data['total'] }</p>
    <ul> Можно добавить как пример
        for:{$data['items'] as $item}
            <li>@{item['name'])}: @{item['amount'] }</li>
        @:@
    </ul>
    

    Теперь мы можем вызвать наш тип запроса в коде

    <?php
    $this->core->view()->report->sales->summary->end(['month'=>'2024-09']);
    

    Или через запрос в url /sales/summary.report?month=2024-09

     ```php <?php

    // 3 аргумента берутся по ключам из настройки function в typeFormat (/core/setting/dev.php)

    public function report($tpl,$view,$api){

        //Подключаем глобальный класс инициализации
        $init = new Foton\View\Init($this->view);
        // записываем в массив данных, для того, чтобы инициализировать подключение css,js на странице представления, так как могут быть страницы в формате json  и т.д.
        $this->view->data['css'] = $init->css();
        $this->view->data['js'] = $init->js();
        $this->tpl($tpl,$view,$api);

    }

    
    
    Иконка глаза8

    Комментарии

    0

    Постройте личный план изучения HTML и CSS - полный курс по вёрстке с нуля до уровня Middle — бесплатно!

    HTML и CSS - полный курс по вёрстке с нуля — часть карты развития Frontend, Mobile

    • step100+ шагов развития
    • lessons30 бесплатных лекций
    • lessons300 бонусных рублей на счет

    Бесплатные лекции

    Лучшие курсы по теме

    изображение курса

    CSS Flexbox

    Антон Ларичев
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.9
    бесплатно
    Подробнее
    изображение курса

    Основы JavaScript

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.8
    3 999 ₽ 6 990 ₽
    Подробнее
    изображение курса

    Продвинутый JavaScript

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.8
    3 999 ₽ 6 990 ₽
    Подробнее

    Похожие статьи

    Картинка поста Настройка очередей с retray на laravel и Foton сравнение
    Иконка аватараКонстантин
    Иконка календаря08 октября 2026
    очередиlaravelretray+ 3middleИконка уровня middle

    Настройка очередей с retray на laravel и Foton сравнение

    Создание очередей с retray на примерах фреймворков Laravel и Foton

    Иконка чипа0
    Иконка глаза95
    Иконка комментариев0
    Картинка поста Работа с DI-контейнером на Framework Foton
    Иконка аватараКонстантин
    Иконка календаря07 октября 2026
    di-контейнерframework FotonFotonmiddleИконка уровня middle

    Работа с DI-контейнером на Framework Foton

    Что такое DI-контейнер и как с ним работать с примерами для самых маленьких на примере системы сборщика и внедрения зависимостей с автоматическим разрешением аргументов конструктора через рефлексию на Framework Foton

    Иконка чипа0
    Иконка глаза123
    Иконка комментариев0
    Картинка поста Сколько стоит Claude Code в 2026: расход в день и в месяц
    Иконка аватараАнтон
    Иконка календаря19 октября 2026
    Claude CodeAnthropicAI-инструментыjuniorИконка уровня junior

    Сколько стоит Claude Code в 2026: расход в день и в месяц

    По данным Anthropic, в компаниях Claude Code в среднем обходится примерно в $13 на разработчика за рабочий день и в $150–250 за месяц по ценам API, а у 90% пользователей расход не превышает $30 в день. У одиночного разработчика день обычно выходит дешевле, но точная сумма зависит от трёх вещей: какая модель стоит по умолчанию, сколько контекста агент таскает за собой и сколько дней в месяц вы с ним работаете. Ниже — из чего складывается счёт, как прикинуть свой расход по прайсу, как посмотреть фактический и как пользоваться Claude Code из России с оплатой в рублях через AI для кода от PurpleSchool.

    Иконка чипа0
    Иконка глаза68
    Иконка комментариев0
    Иконка чипа0