/v2
одной строкой в роутах (ну или если в аннотациях задаете -- в них указать префикс)Не стоит юзать JMS сериалайзер или Symfony Serializer с аннотациями для сущностей. Для респонсов можно использовать обычные DTO-шки либо fractal.
API доку удобно писать с помощью https://github.com/bukalapak/snowboard
new Assert\Collection([
'address' => ...
new Assert\Expression([
'expression' => 'this.isValidAddress()',
'message' => 'Адрес или пустой или массив',
])
public function isValidAddress(): bool
{
return $this->address === null || \is_array($this->address);
}
migration_versions
рукамиЯ вроде читаю https://symfony.com/doc/4.4/validation/custom_cons... но чё то понять не могу.
/**
* @Annotation
*/
class ContainsAlphanumeric extends Constraint
{
public function validate($value, Constraint $constraint) {}
}
размер
, а если не передадим, то его значение будет 55 (ну так хотим). Причем это будет относиться не к кполю, которое валидируем, а именно к констрейнту, То есть то, что он отдаст валидатору. Ну например возраст или некий пинг,да что угодно, в общем ориентируясь на который валидатор применит некую логику. /**
* @Annotation
*/
final class AnyConstraint
{
/**
* @Required
* @var int
*/
public $size = 55;
/**
* Вот тут мы укажем некий валидатор, тот класс, который и будет валидировать наше значение
* Дял удобства он будет называться также + слово Validator, в нашем случае AnyConstraintValidator
*/
public function validatedBy()
{
return \get_class($this).'Validator';
}
}
class AnyConstraintValidator extends ConstraintValidator
{
public function validate($value, Constraint $constraint): void
{
// Тут логика, при которой или все пройдет до return - все отлично
// Или вообще исключение вывалится (если пришло чего-то не то)
// Или (для чего и используется валидатор) создастся violation
// например число в объекте больше того, которое мы указали в size (по дефолту если не указали: 55)
if($value > $constraint->size) {
$this->context->buildViolation('Тут пинг пришел вообще большой — такой нельзя, брат')
->setParameter('{{ string }}', $value)
->addViolation();
}
}
}
class AnyEntity
{
/**
* Если значение больше 55 — то не пройдет валидацию
* @AnyConstraint(120)
*/
protected $name;
}
@Target({"PROPERTY", "METHOD", "ANNOTATION"})
class User
{
/**
* Кого пригласил
* @var ArrayCollection
* @ORM\OneToMany(targetEntity="User", mappedBy="invitedBy")
*/
private $invitedMembers;
/**
* Кем был приглашен
* @var User
* @ORM\ManyToOne(targetEntity="User", inversedBy="invitedMembers")
*/
private $invitedBy;
public function __construct() {
$this->invitedMembers = new \Doctrine\Common\Collections\ArrayCollection();
}
}
/** @Accessor(getter="getName") */
private $name;
public function getName()
{
return $this->name;
}
@serializer
сразу после установки компонента и можно просто заинжектить через SerializerInterface
в конструкторе dd(get_class($event->getController()));
// Класс, который содержит ваши сервисы под разные окружения
class MyServiceDependencyRegistry
{
private $dependencies = [];
public function register(DependencyInterface $dependency, string $env)
{
// Тут всякие проверки можно сделать
// (особенно, что константа допустима)
$this->dependencies[$env] = $dependency;
}
public function getDependency(string $env): DependencyInterface
{
// Тут проверочки
// особенно, что константа допустима и есть с такой константой сервис
// иначе исключение
return $this->dependencies[$env];
}
}
class MyServiceFactory
{
private $dependencies;
public function __construct(MyServiceDependencyRegistry $dependencies)
{
$this->dependencies = $dependencies;
}
public function createNewService(string $env)
{
$envDependency = $this->dependencies->getDependency($env);
// Если у вашего сервиса больше зависимостей
// то вам нужно их передать в фабрику и тут уже передать в ваш сервис
return new MyService($envDependency);
}
}
# Регаем ваши зависимости (если сервисы — они должны быть зареганы)
# Помним, что сами значения ключей (окружения) лучше константой использовать
App\Email\MyServiceDependencyRegistry:
calls:
- [register, ['@App\Email\RealDependency', 'prod']]
- [register, ['@App\Email\FakeDependency', 'test']]
# Регаем фабрику, которая принимает в себя сервис,
# который отдаст вам зависимости по ключу
App\Email\MyServiceFactory:
arguments:
- '@App\Email\MyServiceDependencyRegistry'
# Регаем ваш сервис, указав фабрику и ее метод,
# который в зависимости от переменной создаст нужный инстанс
App\Email\MyService:
factory: ['@App\Email\MyServiceFactory', createNewService]
arguments:
- '%env(APP_ENV)%'
migrations_directory
migrations_directory: "<path>"
migrations_namespace: Application\Migrations
table_name: migration_versions
doctrine:migrations:migrate --configuration=<path_to_configuration_of_migration_yml>
doctrine:
orm:
mappings:
UserEntities:
type: annotation
dir: "%kernel.root_dir%/../src/Models/User/Entity"
is_bundle: false
prefix: <YOUR_NAMESPACE>\Models\User\Entity
Removed deprecated method JsonSerializationVisitor::addData, use :visitProperty(new StaticPropertyMetadata('', 'name', null), 'value') instead