О чем и говорит TheCluster. Этого уже нет. Вот, к примеру, конфиг для демо приложения. Он отличается от дефолтного всего несколькими строчками.
Ну а что касается аннотаций, то их можно не использовать: php, yaml, xml — выбирай не хочу
Эти переменные используются в описании сервисов и конфигов, т.е. напрямую в коде обращения к ним нет. Загрузка идет через Dotenv компонент. Если вдруг понадобится, то можно обратится к ним стандартным способом, но это не рекомендуется и может привести к ошибкам компиляции контейнера.
Если речь про дефолтные значения, то их можно задать в конфиге:
parameters:
env(FOO): bar
но не думаю, что так кто-то делает, если они все равно загружаются из .env. Иначе это добавляет еще одно место, где нужно синхронизировать дефолтные значения.
Правильно понимаю, что вам нужно синхронизировать дефолтные значения не только в .env.example, но и везде, где эти переменные используются (к примеру, везде где есть вызов env('FOO', 'bar'))?
Для локальной разработки нужно скопипастить содержимое файла .env в файл .env.local и заполнить значение ключей.
Идея как раз в том, что копировать содержимое не нужно, а только тех переменных, которые отличаются. К примеру, APP_NAME, порты БД, Redis etc дублировать нет смысла
Я все-таки в уме держу некоторую абстракцию, где кеш может быть не только в redis, где такого флага может не быть
И вот как раз в ситуации большого количества запросов TTL1 < t < TTL2, когда запрос на перегенерацию уже отправлен, но еще не выполнен, есть вероятность получить много таких холостых перегенераций
Я так понял, вашем случае защиты сервера нет. Когда одновременно прилетает 100500 запросов на одно кеш-значение, да, вы быстро отдадите пользователю ответ, но при этом 100499 раз избыточно перегенерируете кеш.
Как правило это фантазии и 99% мапиться 1 к 1, а если не мапится, то это ошибки архитектуры. Примеры кидайте.
Недавно была задача: при регистрации заполнять анкету. По факту часть полей формы использовалась для генерации документов и в таблицу в итоге не уходила. При этом форма достаточно большая плюс присутствовала загрузка файлов поэтому, кстати, было отдельное требование, чтобы вся валидация была на фронтенде.
Еще немаловажный факт, что валидные данные нам нужны до вставки в БД.
Пример
{
"username": null
}
class UserDTO
{
/**
* @var mixed
*
* @Assert\NotBlank()
* @Assert\Type("string")
*/
public $username;
}
class User
{
/**
* @ORM\Column(type="string")
*/
private string $username;
public function __construct(string $username)
{
$this->username = $username;
}
}
Как много проектов вы реализовали с таким подходом? Судя по packagist, это очень похоже на концепт, который нигде не применяется, даже вами...
На практике все равно придется иметь отдельную от БД библиотеку для валидации, т.к. база не покрывает всех кейсов. При этом проверка на уникальность в 99.99%, как вы сами сказали, сработает и в стандартном валидаторе. Я, к примеру, ни разу не встречал зафейленные таким образом запросы. И получается, что не будет единого источника правды: за тем, чтобы узнать реальные правила валидации надо будет всегда заглядывать в оба места. Лично мне это не удобно, т.к. смена контекста код — база очень напрягает.
Это все не обращая внимания на то, что DTO с которым работает пользователь маппится на базу не один к одному. К примеру, в БД поле name, а от пользователя приходит firstName, lastName и middleName.
Уверен, на 100%, если бы какая-нть, из выше указанных библиотек в статье, совместила свою поделку с разработанным мною принципом Database First, то она стала бы отраслевым стандартом.
Но чтобы VARCHAR(4) применился нам эти данные придется транкейтить вручную. Как при таком подходе уменьшить разрешенную длину строки, но чтобы старые данные остались неизменными?
Еще частый юзкейс: валидация на базе всех введенных данных. К примеру, для валидация р/с и к/с надо знать значение БИК. На первый взгляд rakit/validation так не умеет.
Я ниже ответил подробно. Как раз из-за того, что вы смешали два способа реализации формы: форма сгенерированна под аутентификатор, а в итоге используется form_login, вам пришлось искать эти параметры.
В Symfony есть несколько способов реализовать форму входа:
Изначальный form_login. По сути требует от себя только небольшого конфига
form_login:
login_path: login
check_path: login
и собственно самой формы. К сожалению, шаг влево, шаг вправо — она уже не подойдет (хотя мне всегда хватало)
Аутентификация на базе symfony/security-guard. В этом случае у пользователя есть полный контроль над процессом, но требует от себя больше действий, а именно реализации интерфейса AuthenticatorInterface. Как раз этот способ предлагается в документации, т.к. используется MakerBundle и весь бойлерплейт можно переложить на кодогенерацию.
В вашем гайде используются оба подхода. Вы описываете создание аутентификаторов, но потом ни с того, ни с сего добавляете ключ form_login в конфиг фаерволов. В итоге от команды make:auth вы берете только форму логина, а сгенерированные аутентификаторы лежат мертвым грузом.
О чем и говорит TheCluster. Этого уже нет. Вот, к примеру, конфиг для демо приложения. Он отличается от дефолтного всего несколькими строчками.
Ну а что касается аннотаций, то их можно не использовать:
php
,yaml
,xml
— выбирай не хочуЭти переменные используются в описании сервисов и конфигов, т.е. напрямую в коде обращения к ним нет. Загрузка идет через Dotenv компонент. Если вдруг понадобится, то можно обратится к ним стандартным способом, но это не рекомендуется и может привести к ошибкам компиляции контейнера.
Если речь про дефолтные значения, то их можно задать в конфиге:
но не думаю, что так кто-то делает, если они все равно загружаются из
.env
. Иначе это добавляет еще одно место, где нужно синхронизировать дефолтные значения.Правильно понимаю, что вам нужно синхронизировать дефолтные значения не только в
.env.example
, но и везде, где эти переменные используются (к примеру, везде где есть вызов env('FOO', 'bar'))?Еще раз… Для Symfony ваш пакет бесполезен, т.к.
.env
загружается всегда, а.env.local
не содержит всех параметров.Даже если представить, что разработчик добавил новый параметр в
.env.local
и забыл его указать в.env
, ваша утилита генерирует неверный код:.env
(aka.env.example
).env.local
(aka.env
)У вас генерируется:
Идея как раз в том, что копировать содержимое не нужно, а только тех переменных, которые отличаются. К примеру, APP_NAME, порты БД, Redis etc дублировать нет смысла
В Symfony — не так: https://symfony.com/doc/current/configuration.html#overriding-environment-values-via-env-local
Описание изменений https://symfony.com/doc/current/configuration/dot-env-changes.html
Из плюсов:
Не надо переназначать все переменные, а только те, которые отличаются.
Если добавились новые параметры они автоматом подтянутся.
Мне кажется привязка к Eloquent не обязательна. Если передавать массив параметров вместо одной сущности, то область применения расширится
Я так понял, вашем случае защиты сервера нет. Когда одновременно прилетает 100500 запросов на одно кеш-значение, да, вы быстро отдадите пользователю ответ, но при этом 100499 раз избыточно перегенерируете кеш.
Недавно была задача: при регистрации заполнять анкету. По факту часть полей формы использовалась для генерации документов и в таблицу в итоге не уходила. При этом форма достаточно большая плюс присутствовала загрузка файлов поэтому, кстати, было отдельное требование, чтобы вся валидация была на фронтенде.
Еще немаловажный факт, что валидные данные нам нужны до вставки в БД.
Как много проектов вы реализовали с таким подходом? Судя по packagist, это очень похоже на концепт, который нигде не применяется, даже вами...
На практике все равно придется иметь отдельную от БД библиотеку для валидации, т.к. база не покрывает всех кейсов. При этом проверка на уникальность в 99.99%, как вы сами сказали, сработает и в стандартном валидаторе. Я, к примеру, ни разу не встречал зафейленные таким образом запросы. И получается, что не будет единого источника правды: за тем, чтобы узнать реальные правила валидации надо будет всегда заглядывать в оба места. Лично мне это не удобно, т.к. смена контекста код — база очень напрягает.
Это все не обращая внимания на то, что DTO с которым работает пользователь маппится на базу не один к одному. К примеру, в БД поле
name
, а от пользователя приходитfirstName
,lastName
иmiddleName
.В symfony/validator есть нечто похожее
При любом подходе это будет проблемой.В общем случае свойство будет инициализировано
null
Если говорить о symfony/serializer, то это решается кастомным нормалайзером
Для одного файла один объект, для другого — другой.
Но чтобы
VARCHAR(4)
применился нам эти данные придется транкейтить вручную. Как при таком подходе уменьшить разрешенную длину строки, но чтобы старые данные остались неизменными?Есть примеры таких SPA? Вот смотрю сейчас на twitter.com. Сам документ вернулся за 196мс + основной контент ленты пришел за 865мс
БД тут не при чем. Как, к примеру, отвалидировать такую форму?
Валидность
rs
иks
в данном случае зависит отbik
.Еще частый юзкейс: валидация на базе всех введенных данных. К примеру, для валидация р/с и к/с надо знать значение БИК. На первый взгляд
rakit/validation
так не умеет.А такие коммерческие решения уже существуют?
Я ниже ответил подробно. Как раз из-за того, что вы смешали два способа реализации формы: форма сгенерированна под аутентификатор, а в итоге используется form_login, вам пришлось искать эти параметры.
В Symfony есть несколько способов реализовать форму входа:
Изначальный form_login. По сути требует от себя только небольшого конфига
и собственно самой формы. К сожалению, шаг влево, шаг вправо — она уже не подойдет (хотя мне всегда хватало)
Аутентификация на базе symfony/security-guard. В этом случае у пользователя есть полный контроль над процессом, но требует от себя больше действий, а именно реализации интерфейса AuthenticatorInterface. Как раз этот способ предлагается в документации, т.к. используется
MakerBundle
и весь бойлерплейт можно переложить на кодогенерацию.В вашем гайде используются оба подхода. Вы описываете создание аутентификаторов, но потом ни с того, ни с сего добавляете ключ
form_login
в конфиг фаерволов. В итоге от командыmake:auth
вы берете только форму логина, а сгенерированные аутентификаторы лежат мертвым грузом.После WebSocket, можно упомянуть Mercure