/** * @param OptionsResolver $resolver * @throws AccessException * @throws UndefinedOptionsException * @throws MissingFamilyException * @throws \UnexpectedValueException */ public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults(['required' => false, 'routes' => $this->routes]); $resolver->setRequired(['attribute']); $resolver->setNormalizer('attribute', function (Options $options, $value) { if ($value instanceof AttributeInterface) { return $value; } $attribute = $this->attributeConfigurationHandler->getAttribute($value); if (!$attribute->getType() instanceof VariantAttributeType) { throw new \UnexpectedValueException('Attribute option must be of type VariantAttributeType'); } return $attribute; }); }
/** * @inheritdoc */ public function __construct($code, AttributeConfigurationHandler $attributeConfigurationHandler, FamilyConfigurationHandler $familyConfigurationHandler, ContextManager $contextManager, array $config) { foreach ($config['axles'] as $axle) { $this->axles[$axle] = $attributeConfigurationHandler->getAttribute($axle); } unset($config['axles']); parent::__construct($code, $attributeConfigurationHandler, $familyConfigurationHandler, $contextManager, $config); }
/** * @param string $code * @param AttributeConfigurationHandler $attributeConfigurationHandler * @param FamilyConfigurationHandler $familyConfigurationHandler * @param ContextManager $contextManager * @param array $config * @throws UnexpectedValueException * @throws MissingFamilyException * @throws AccessException * @throws InvalidArgumentException * @throws UnexpectedTypeException */ public function __construct($code, AttributeConfigurationHandler $attributeConfigurationHandler, FamilyConfigurationHandler $familyConfigurationHandler, ContextManager $contextManager, array $config = null) { $this->code = $code; $this->contextManager = $contextManager; if (!empty($config['parent'])) { $this->parent = $familyConfigurationHandler->getFamily($config['parent']); $this->copyFromFamily($this->parent); } unset($config['parent']); foreach ($config['attributes'] as $attribute) { $this->attributes[$attribute] = $attributeConfigurationHandler->getAttribute($attribute); } unset($config['attributes']); if (!empty($config['attributeAsLabel'])) { $labelCode = $config['attributeAsLabel']; if (!$this->hasAttribute($labelCode)) { $message = "Bad configuration for family {$code}: attribute as label '{$labelCode}'"; $message .= " doesn't exists for this family"; throw new UnexpectedValueException($message); } $this->attributeAsLabel = $this->getAttribute($labelCode); } unset($config['attributeAsLabel']); if (!empty($config['attributeAsIdentifier'])) { $labelCode = $config['attributeAsIdentifier']; $commonMessage = "Bad configuration for family {$code}: attribute as identifier '{$labelCode}'"; if (!$this->hasAttribute($labelCode)) { throw new UnexpectedValueException("{$commonMessage} doesn't exists for this family"); } $this->attributeAsIdentifier = $this->getAttribute($labelCode); if (!$this->attributeAsIdentifier->isUnique()) { throw new UnexpectedValueException("{$commonMessage} should be unique"); } if (!$this->attributeAsIdentifier->isRequired()) { throw new UnexpectedValueException("{$commonMessage} should be required"); } if ($this->attributeAsIdentifier->isMultiple()) { throw new UnexpectedValueException("{$commonMessage} should NOT be multiple"); } if (0 !== count($this->attributeAsIdentifier->getContextMask())) { throw new UnexpectedValueException("{$commonMessage} should NOT be contextualized"); } } unset($config['attributeAsIdentifier']); $accessor = PropertyAccess::createPropertyAccessor(); foreach ($config as $key => $value) { $accessor->setValue($this, $key, $value); } }
protected function convertValue($value) { return $this->attributeConfigurationHandler->getAttribute($value); }