Как стать автором
Обновить
26
0

Разработчик

Отправить сообщение

Внутри продукта константа всегда true если подключен файл пролога main/include/prolog_before.php , но никогда не знаешь, чего можно ожидать от кастомных интеграцией :)

Начиная с версии main,24.0.0 вы можете регистрировать свои команды через конфигурацию модуля ;-)

Дока: https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&LESSON_ID=11685

Поверите если скажу что это действительно в работе? :-)

Тут скорее правильней задать вопрос вопрос про популяризацию CMS в целом, т.к. планов отчуждать отдельно фреймворк на текущий момент нет.

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

Также ведутся работы по переработке документации конкретно по фреймворку и CMS, чтобы документация стала более френдли к разработчикам.

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

Примите как данность — тестировать визуальную составляющую придется на костылях

Отсутствия адекватного инструмента, это прям сильно тормозящий фактор :/

Неужели вендоры Android и iOS не могут дать нормальной тулзы?

Они хотя бы делают что-то в этом направлении? :D

Этот набор компонентов используется только для REST приложений, он коррелирует с имеющейся библиотекой внутри продукта.

Это был пример когда нужно вшивать какой-то кусок в какой-то SQL.

При желании можно использовать и convertToDb :

$sql = "WHERE name LIKE " . $sqlHelper->convertToDb("%{$value}%");

Не очень понял, что имеется в виду. forSql используется в SqlHelper, фактически, только один раз, для реализации convertToDbString.

В любом случае, нет ни одной причины использовать forSql вместо convertToDb где бы то ни было.

Один раз, зато какой :) Тут я имел ввиду сам класс как кейс использования forSql.

Если говорить про конструирование SQL запросов без ORM, даже банальных LIKE конструкций, то convertToDb не подойдёт, и там нужно использовать только forSql :

$sql = "WHERE name LIKE '%" . $sqlHelper->forSql($value) . "%'";

Ну так он и должен быть на две строки. Если больше, то надо вынести формирование запросов в отдельные методы. Тогда любой код транзакции будет содержать столько строк, сколько в ней запросов. Плюс "на простыне кода разница уже не будет заметна", и функция не нужна - так себе аргумент.

С таким примером соглашусь, что наличие замыкания имеет смысл и будет удобно.

Я не очень люблю когда в качестве аргументации приводят очень простые примеры, которые чаще всего далеки от жизни, поэтому не упустил возможности указать на это :)
Саму реализацию через коллбэк возьмём на заметку и возможно реализуем, спасибо!. Насколько знаю уже во всех фреймворках и ORM такая история есть, не будем отставать от устаревающих трендов :)

Тут вполне можно было согласиться, что да, такой метод в Битриксе не помешал бы

Если со всем соглашаться, то времени не хватит ни на ответы, ни на реализацию, поэтому приходится достаточно консервативно подходить ко всему новому :D

Такой экзотики из коробки нет :) В данном случае можно добавить свое поле:

Кастомное поле
use Bitrix\Main\ORM\Fields\ScalarField;

abstract class Geometry
{}

class GeometryField extends ScalarField
{
    public function cast($value)
    {
        if ($this->is_nullable && $value === null)
        {
            return null;
        }

        if ($value instanceof Geometry)
        {
            return $value;
        }

        return Geometry::createFromWKT($value);
    }

    public function convertValueFromDb($value)
    {
        return $this->cast($value);
    }

    public function convertValueToDb($value)
    {
        if ($value === null)
        {
            if ($this->is_nullable)
            {
                return null;
            }
            
            throw new Exception('Is not nullable');
        }
        
        if ($value instanceof Geometry)
        {
            return $value->toWKT();
        }
        
        throw new Exception('Invalid value');
    }
}

Конкретно с JSON справляется: можно использовать поле Bitrix\Main\ORM\Fields\ArrayField , при сохранении/чтении будет выполнятся преобразование данных в/из JSON.

Про работу с бинарными данными в статье упоминание есть.

На счет "прочих типов", тут уже нужна конкретика :)

Удивился, полез посмотреть, и действительно, на самом деле выполняется более логичный запрос с LIMIT 0.

Действительно, опечатка в статье. Спасибо!

Всё-таки, слово "подготовленный" имеет строго определённое значение. Здесь лучше подойдёт "отформатированный".

Верное замечание, убрал по тексту использования термина, чтобы не путать умы юнных читателей :)

и видимо поэтому показаны максимально невнятно, и без исходника в них разобраться довольно сложно

Раскрыл использование методов convert* детальнее ;-)

Спасибо, кстати, некоему А.В.Шаталову за то что код можно нормально посмотреть. Самому Битриксу это, судя по всему, не нужно.

Зачем, если исходники у нас всегда под рукой? :) Если серьезно, то проблема с докой и справочником API известная, мы ей занимаемся!

Судя по всему, автор статьи сам не понимает, что делает метод convertToDb, и почему его всегда следует предпочесть методу forSql

Завидую вашей способности читать чужие мысли, но в данном случае это лишь вопрос неверной терминологии, а не непонимания)

Не всегда стоит использовать convertToDb , вместо forSql . В целом сам класс SqlHelper , является хорошим примером когда стоит использовать forSql .

Если мы говорим про клиентский код, то тут да, почти всегда нужно использовать метод convertToDb , либо его конкретные реализации.

Вот эта привычка молча обрезать строку по длине наверняка подпортила нервов не одному поколению программистов: они думали что данные записались норм - ошибок ведь не было - а потом через полгода выплывает, что там какие-то обрезки.

Надеюсь мы оба понимаем, что это неправда ;) Обрезка происходит не "молча", а только в случае указания длинны в методе convertToDbString , либо при указании размера в ORM в некоторых классов Bitrix\Main\ORM\Fields\* .

В случае ORM, вместо указания размера и обрезки, можно использовать Bitrix\Main\ORM\Fields\Validators\LengthValidator

И снова термин, который во всём остальном мире означает одно, а в битриксе - что-то совсем другое.

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

... Но при этом что именно другое - в статье не объясняется!

Очень жаль, что вы не заметили блок кода который следует сразу за этой фразой :(

И никто не догадался сделать простую онанимку

Пока вы пишите простой код на 2 строки, то действительно выглядит лучше. Если речь уже про более большие куски кода, что замыкание, что try/catch выглядят одинаково ;)

Дизайн - сущность, дизайнить - процесс ;-)

UserStoryMapping тут не рассматривается, потому что он сильно хуже данных подходов? Кажется он самый попсовый :)

Ясно, понятно. В целом могли сразу ответить что сами не понимаете о чем пишите ;-)

Много буковок и ни одной картинки :( Диаграмма C4 это про системный дизайн или про архитектуру?

Можете в картинках привести пример: вот схемка архитектуры, вот схемка системного дизайна?

Или разница вообще не в схемках? :)

Крутая статья, спасибо вам!

Пример достаточно простой, но как быть если проект большой? :)

Т.е. в текущем примере у вас модуль Shop, но в реальных проектах модулей как минимум 10, а если мы говорим еще и про контексты внутри домена, то иерархия достаточно сложная. Как это всё должно выглядеть?

Чем хуже конкретно данный валидатор?

Подкол был в том, что у вас возникли вопросы к Битрикс, и не возникли к Yii и Laravel, которые тоже свои валидаторы сделали, а не заиспользовали Symfony ;)

1. Атрибуты, которые семантически должны представлять из себя классы метадаты отвечают ещё за валидацию. Смешение логики и правил маппингов.

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

2. В примерах кода не вижу вообще возможностей вынести правила валидации отдельно от DTO, например в yaml, php, json, etc. Чтобы правила можно было указывать во внешних файлах и изолировать от DTO.

Как мне кажется, нигде кроме symfony вы и не найдёте вынос правил валидации в yaml файл :D

Нужно ли валидацию насколько далеко уносить от кода, который её использует? Очень сомнительно.

3. Не вижу зависимых правил и сложных выражений, типа When X then (Y or Z). И даже реализовать подобное невозможно, кажется, учитывая то что в правила валидации приходит значение только одного поля.

Если речь про атрибут свойства - то да, валидироваться будет только значение одного свойства.

Если сделать атрибут класса - то он принимает весь объект и может формировать любые правила и условия. В статье проверка нескольких полей отражена в примере AtLeastOnePropertyNotEmpty

Напишите пример как это должно работать по вашему мнению, желательно на примере валидаторов симфони, раз уж вы начали сравнивать с ним ;)

4.Способа внедрить в конструктор в валидаторы тоже не вижу, т.к. см. п.1. Ну типа есть, например, сервис, предоставляющий анализ текста на "мат", как его всунуть в валидатор, чтоб сказать: #[DoesNotContainSwearWords(criteria: 0.2)], который уже делегируется нужному валидатору, который содержит инфу и локализации, и нужные коннекты к сервису и прочее.

А в чем проблема? Создаете атрибут DoesNotContainSwearWords , который принимает все настройки и поставляет нужный валидатор, создаете собственно этот валидатор DoesNotContainSwearWordsValidator , который реализует необходимую вам логику.

5.Контекста и прочей инфы тоже нет, т.к. см. п.1

А прочей это какой? И насколько это надо для операции валидации конкретного поля?

Опять же если сопроводите примерами из symfony, будет невероятно великолепно ;)

6.А в виде пакета как это поставить и посмотреть? Ну вот я хочу использовать у себя этот пакет отдельно в проекте, например...

А вы в целом работали с Битрикс? Знаете что он не через composer устанавливается? :)

А если же сравнивать с тем же Symfony, то, например у меня, сразу возникает такой же вопрос "зачем": Т.к. фактически это копипаста существующего решения, но с худшей реализацией и наличием критичных (в т.ч. архитектурных) косяков, которые не позволяют нормально использовать этот компонент. Ну помимо того, что использовать его просто невозможно ввиду отсутствия в пакагисте)))

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

Адаптация и интеграция того самого великолепного решения, которое лучше в тыщу раз, под используемые в Битрикс классы и сущности также не задача из разряда "просто сделай composer require".

Ну и вам уже надо определиться с вашим отношением к валидации в Битрикс: это всё-таки "копи-паста" или же это "худшая реализация" ;)

Отсюда, с точки зрения здравого смысла и этот вопрос: Зачем делать то, что и так существует, только архитектурно неправильно и в целом хуже? И варианта кроме как "потому что могут" тут, боюсь что нет.

Я тоже с точки зрения здравого смысла не понимаю зачем нужны еще какие-то решения и фреймворки, если есть symfony ;)

А чем Битрикс хуже чем Yii или Laravel? Тоже хочется велосипед :)

1
23 ...

Информация

В рейтинге
Не участвует
Откуда
Курган, Курганская обл., Россия
Работает в
Дата рождения
Зарегистрирован
Активность

Специализация

Fullstack Developer, Software Architect
Senior
PHP
Docker
Database
OOP
Algorithms and data structures
Object-oriented design
Database design
Software development
Designing application architecture