Челендж на 2026

ArbNet
На сайте с 27.10.2019
Offline
158
#631
Sly32 #:
Если честно - это гораздо интереснее твоего ФФ

Прикольная игрушка получилась.

Может работать как обычный чат и как агент, создавать и дорабатывать проекты, имеет память чата, сканирует и запоминает проект, может настраиваться под конкретный проект в конфиге, при открытии другого проекта меняется и конфиг и память проекта.

ЗЫ. Больше ничего не расскажу и не покажу, код выкладывать не буду.

S3
На сайте с 29.03.2012
Offline
404
#632
ArbNet #:
Больше ничего не расскажу и не покажу, код выкладывать не буду.

значит ничего у тебя нет. То что ты описал - делается на расте за полчаса. 

А те модели, которыми ты пользуешься - просто смех. Для детей. Естественно что они ничего не умеют. 

Александр Воробьев
На сайте с 03.02.2020
Offline
70
#633
ArbNet #:
Давай, ради интереса, может другим пригодится.

Эта инструкция нужна только тем, кто не соблюдает простейшие стандарты де-факто вебразработки. Таковых бесконечно мало. Большинству достаточно одной командой поставить стан и типовой конфиг взять. 

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

Шаг 1. Необходимо установить PHPStan https://github.com/phpstan/phpstan

Тут два варианта

Вариант 1 Если очень не хочется composer:
Скачай готовый исполняемый файл phpstan.phar отсюда: https://github.com/phpstan/phpstan/releases

Вариант 2 Рекомендую этим воспользоваться.
1.1 Установить composer Инструкция тут https://getcomposer.org/download/
1.2 Ставим стан. php composer.phar require --dev phpstan/phpstan если композер поставишь в проект или если глобально composer require --dev phpstan/phpstan

Шаг 2. Создаем bootstrap.php он необходим т.к. у тебя своя автозагрузка. Просто скопируй свой run.php в нем оставь все функции, установку констант и регистрацию автозагрузчика. остальное (например установка обработчика ошибок) убирай. 
В общем убери всё, что выполняет действия прямо сейчас (кроме регистрации автозагрузчика). Иначе анализатор зависнет или упадет.

Шаг 3. Создаем конфиг в корне проекта файл phpstnan.neon

parameters:
    phpVersion: 80100
    bootstrapFiles:
        - bootstrap.php  # подключить существующий загрузчик
    level: 9  # начать с минимального уровня
    paths:
        - node/
        - skin/
        - mods/

Версию php установи какую тебе надо именно в том формате как в примере. (там 8.1)
bootstrap.php - файл который делали на втором шаге
level - от 0 до 9. По хорошему надо начинать с уровня 1 устранять все ошибки и повышать пошагово. На 9 уровне там пипец какие условия :). Возможно в твоем фреймворке 9ый не возможен.
paths - каталоги где могут быть исходники

Шаг 4 Запуск
Если выбрал первый путь php phpstan.phar analyse
Если выбрал второй путь php vendor/bin/phpstan analyse 

php phpstan.phar analyse /papth/to/file.php - так можно проверить только один файл

Конечно инструмент не скажет "вот это замени на это". Т.е. ошибку надо будет понять, проанализировать и исправить. Т.е. эта не халява отменяющая необходимость знаний. Этот инструмент только подсветит проблему.

Бдит стан за многим. Понимаю, что ты себя считаешь очень знающим, но рекомендую править. Т.к. если кто то будет пользоваться твоим фреймворком, это поможет избежать неоднозначностей. Для примера таких ситуаций:


Стан бдит за более строгой типизацией чем php. Т.е. если написать

/**
* @param list<int> Входящий параметр
* @result array<string,float> Результат
*/
function foo(array $props):array{
    ...
}

то стан будет проверять, что на вход передается НЕ ассоциативный массив содержащий только целые числа, а результат обрабатывается как ассоциативный массив где ключ - строка, а значение - флоаты. В случае массивов он, с определенного уровня, вообще будет требовать уточнения типа, т.е. без подобного phpdoc не пропустит.  ИМХО это все важно для проектов класса фреймворк (т.е. расcчитано, что будут пользоваться другие разработчики)
GitHub - phpstan/phpstan: PHP Static Analysis Tool - discover bugs in your code without running it!
GitHub - phpstan/phpstan: PHP Static Analysis Tool - discover bugs in your code without running it!
  • phpstan
  • github.com
PHP Static Analysis Tool - discover bugs in your code without running it! - phpstan/phpstan
Александр Воробьев
На сайте с 03.02.2020
Offline
70
#634
 ArbNet забыл важное добавить: в своем автозагрузчике (тот что перенесешь в bootstrap) убери выбрасывание ошибки при отсутствии класса
MP
На сайте с 05.05.2025
Offline
30
#635
Александр Воробьев #:

Эта инструкция нужна только тем, кто не соблюдает простейшие стандарты де-факто вебразработки. Таковых бесконечно мало. Большинству достаточно одной командой поставить стан и типовой конфиг взять. 

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

Шаг 1. Необходимо установить PHPStan https://github.com/phpstan/phpstan

Тут два варианта

Вариант 1 Если очень не хочется composer:
Скачай готовый исполняемый файл phpstan.phar отсюда: https://github.com/phpstan/phpstan/releases

Вариант 2 Рекомендую этим воспользоваться.
1.1 Установить composer Инструкция тут https://getcomposer.org/download/
1.2 Ставим стан. php composer.phar require --dev phpstan/phpstan если композер поставишь в проект или если глобально composer require --dev phpstan/phpstan

Шаг 2. Создаем bootstrap.php он необходим т.к. у тебя своя автозагрузка. Просто скопируй свой run.php в нем оставь все функции, установку констант и регистрацию автозагрузчика. остальное (например установка обработчика ошибок) убирай. 
В общем убери всё, что выполняет действия прямо сейчас (кроме регистрации автозагрузчика). Иначе анализатор зависнет или упадет.

Шаг 3. Создаем конфиг в корне проекта файл phpstnan.neon


Версию php установи какую тебе надо именно в том формате как в примере. (там 8.1)
bootstrap.php - файл который делали на втором шаге
level - от 0 до 9. По хорошему надо начинать с уровня 1 устранять все ошибки и повышать пошагово. На 9 уровне там пипец какие условия :). Возможно в твоем фреймворке 9ый не возможен.
paths - каталоги где могут быть исходники

Шаг 4 Запуск
Если выбрал первый путь php phpstan.phar analyse
Если выбрал второй путь php vendor/bin/phpstan analyse 

php phpstan.phar analyse /papth/to/file.php - так можно проверить только один файл

Конечно инструмент не скажет "вот это замени на это". Т.е. ошибку надо будет понять, проанализировать и исправить. Т.е. эта не халява отменяющая необходимость знаний. Этот инструмент только подсветит проблему.

Бдит стан за многим. Понимаю, что ты себя считаешь очень знающим, но рекомендую править. Т.к. если кто то будет пользоваться твоим фреймворком, это поможет избежать неоднозначностей. Для примера таких ситуаций:


Стан бдит за более строгой типизацией чем php. Т.е. если написать


то стан будет проверять, что на вход передается НЕ ассоциативный массив содержащий только целые числа, а результат обрабатывается как ассоциативный массив где ключ - строка, а значение - флоаты. В случае массивов он, с определенного уровня, вообще будет требовать уточнения типа, т.е. без подобного phpdoc не пропустит.  ИМХО это все важно для проектов класса фреймворк (т.е. расcчитано, что будут пользоваться другие разработчики)
Зачем на 9 ступене проверять? Я на 5 всегда прогоняю + юнит тестами покрываю
Александр Воробьев
На сайте с 03.02.2020
Offline
70
#636
MrPi #:
Зачем на 9 ступене проверять? Я на 5 всегда прогоняю + юнит тестами покрываю

Мне кажется в "Общем случае" в идеале проект должен проходить уровень 10 без ошибок. Но не всегда этот идеал оправдан. и тут уже зависит от конкретики проекта. И, как правило, например проекты подобные фреймворкам (т.е. пользоваться ими будут другие разработчики в разных проектах с разными взглядами и подходами) - чуть ли не обязаны. (правда у меня фреймворк остановился на 6ом, а шаблонизатор на 8. (надо будет освежить память "почему" :) )

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

А так вот подобрал примерчик (в комментариях на каком уровне появляется ошибка)

/**
* @param array{connection:string,status?:string} $row
*/

function foo(array $row): void{
        // 1 На уровне 7: Offset 'status' might not exist on array{connection: string, status?: string}.
        $status = $row['status'] ;
        echo  "test";
}
class Example {  
    public function test(?string $value): void {
                // 2 На уровне 8: Parameter #1 $string of function strlen expects string, string|null given.
        echo strlen($value);
    }
}

/**
* @param array<string,mixed> $data
*/

function foo1(array $data): string {
    $name = $data['name'];
        // 3 На уровне 9:  Function foo1() should return string but returns mixed.
    return $name;
}

1. Согласись потенциально возможное место для бага. Особенно если метод будет длинный.

2. Тут тоже от ситуации. Причем если пользователи только мы (и писали этот код не давно) еще ни чего. а вот если пользователь другой или мы через 100 лет. вдруг если передать null и результат 0 - это будет некорректно для логики.

3. Ну тут тоже повод для багов. вот упрощенные примеры

/**
* @param array<string,mixed> $data
*/

function bar(array $data): string {
    $name = $data['name'];
    return $name;
}

// ============================================
// Данные пришли из JSON API
// ============================================
$jsonInput = '{"name": null, "email": "test@example.com"}';
$data = json_decode($jsonInput, true);

$userName = bar($data);
    
$query = "INSERT INTO users (name) VALUES ('" . $userName . "')";
// INSERT INTO users (name) VALUES ('')  


/**
* @param array<string,mixed> $row
*/

function getUserName(array $row): string {
    return $row['name'];  
}

$dbRow = ['name' => null, 'email' => 'user@example.com'];
$name = getUserName($dbRow);
$query = "SELECT * FROM users WHERE name = '{$name}'";
// Выполнится: WHERE name = '' — вернёт всех пользователей с пустым именем!

(только не придирайся к выбранному примеру с именем пользователя - суть не в таких деталях :).  

Александр Воробьев
На сайте с 03.02.2020
Offline
70
#637

[9/12] движение...

Модуль для работы с базами данных

Выпустил первый релиз модуля для работы с SQL базами данных. На данном этапе только взаимодействие на низком уровне - т.е. работа с сырыми запросами.  Из коробки драйвер работающий через PDO (соответственно можно подключаться ко всем типам СУБД, которые есть и в нем). 

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

Реализованный драйвер поддерживает вложенные транзакции.

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

Проверено на версиях PHP 8.5 и 8.6

Репозиторий на github

Документация там же

Записал видео, но не успел подготовить к публикации - будет несколько позднее.

Фреймоворк

Тут тоже было много работы, но релиз пока не выпустил, по этому в ветке next

Накопилось много пунктов в списке, которые приводят к потере обратной совместимости, решил их сделать (т.е. следующая версия будет мажорной 2.0.0). В числе прочего минимальную версию PHP изменил на 8.5 (правда в ноябре будет релиз 8.6 - возможно и я отложу релиз и сделаю минимальной 8.6, но пока не решил). В общем сделал все эти пункты - в основном "технические" в доке есть статья по миграции на данный момент она такая

Добавил в фреймворк сервис аутентификации

Так же сделал гибкое ядро этой системы. Позволяет добавлять свои драйверы аутентификации, а из коробки: аутентификация на сессиях и jwt. Можно в одном проекте подключать разные одновременно.

Так же предусмотрена как точка расширения подключение различных источников прав пользователей из которых собирается итоговый набор прав пользователя. Т.к. в самом ядре фреймворка нет работы с БД, то из коробки на основе конфигов. (драйвер для БД будет отдельным модулем). Можно в одном проекте подключать разные одновременно.

Так же и с источником данных пользователя. Можно подключать несколько на проекте.

Сделал конфигурируемый middleware аутентификации, который можно подключать как на все маршруты, так и на группы маршрутов, так и на отдельные маршруты с разными параметрами.

Хотел успеть доделать полностью к отчетной дате. Но пока делаю демо, необходимо еще написать доку. Все, что готово есть в репо в неймспейсе Auth и контракты для пользовательских реализаций.

Пока делал демо примеры понял, что работа с CORS не достаточно умная - из за ее доработки и не успел :)


PS. ArbNet у тебя есть продвижение?

ArbNet
На сайте с 27.10.2019
Offline
158
#638
Александр Воробьев #:
у тебя есть продвижение?
Честно говоря опять подзабросил. После того как в начале записал видео, начал делать дизайн, вернее каркас для сайта, чтобы он был универсальным так сказать почти на все случаи, долго возился, сначала с самим каркасом, потом с js скриптами(кое-что переделывал), с serverworker и тд. Потом в теме про ai-агенты возился немного со своим, выложил его тогда, потом вот решил полностью сам написать своего агента по своему, а не через генерацию на ИИ, т.к. убедился, что это фигня хоть и работает, но хочется более качественный продукт. Сейчас уже и подзабыл, что я там хотел в челлендже делать. Короче надо доделывать да, у меня тоже с БД ещё не решён вопрос.
S3
На сайте с 29.03.2012
Offline
404
#639
ArbNet #:
Честно говоря опять подзабросил. После того как в начале записал видео, начал делать дизайн, вернее каркас для сайта, чтобы он был универсальным так сказать почти на все случаи, долго возился, сначала с самим каркасом, потом с js скриптами(кое-что переделывал), с serverworker и тд. Потом в теме про ai-агенты возился немного со своим, выложил его тогда, потом вот решил полностью сам написать своего агента по своему, а не через генерацию на ИИ, т.к. убедился, что это фигня хоть и работает, но хочется более качественный продукт. Сейчас уже и подзабыл, что я там хотел в челлендже делать. Короче надо доделывать да, у меня тоже с БД ещё не решён вопрос.
🤡🤡🤡
Александр Воробьев
На сайте с 03.02.2020
Offline
70
#640
ArbNet #:
у меня тоже с БД ещё не решён вопрос.
Я, скорее всего, продолжать модуль БД буду после форума. Нынешнего функционала для форума достаточно. А перед продолжением работ по модулю БД нужны модули консольных команд и миграций (по моему плану). 

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий