I have a failed() which check if field is in array. In class ValidationAttributes failed() should return array with every field which invalid. Now show me errorFatal error: Uncaught Error: Call to a member function failed() on array in I don't have idea how to change, that function check if field is valid or invalid.
class Validation
{
private function __construct(private array $fieldsAndMessages)
{
}
public static function failure(string $fieldName, string $message): Validation
{
return new self([$fieldName => $message]);
}
public static function success(): Validation
{
return new self([]);
}
public function failed(string $fieldName): bool
{
return \array_key_exists($fieldName, $this->fieldsAndMessages);
}
public function message(string $fieldName): string
{
if (\array_key_exists($fieldName, $this->fieldsAndMessages)) {
return $this->fieldsAndMessages[$fieldName];
}
throw new Exception("Field validation wasn't failed");
}
}
class ValidationAttributes
{
public function __construct(private Validation|array $validation, private array $attributes)
{
}
public function failed(string $field): bool
{
if (!\in_array($field, $this->attributes)) {
throw new ViewAttributeException("Validation attribute '$field' isn't defined");
}
return $this->validation->failed($field);
}
public function message(string $field): array
{
if (!\in_array($field, $this->attributes)) {
throw new ViewAttributeException("Validation attribute '$field' isn't defined");
}
return $this->validation->message($field);
}
}
<? if ($this->validation->failed("photo")): ?>
<span class="error">
<?= htmlSpecialChars($this->validation->message("photo")); ?>
</span>
<? endif; ?>
$errors = [];
if ($request->settingsSubmit()) {
if ($request->wantsSubmitPhoto()) {
$extensionPhoto = new PhotoExtension($request->photo());
if (!in_array($extensionPhoto->getExtension(), ['jpg', 'png', 'jpeg'])) {
$errors[] = Validation::failure('photo', 'Invalid extension');
}
}
if ($request->wantsSubmitAvatar()) {
$extensionAvatar = new AvatarExtension($request->avatar());
if (!in_array($extensionAvatar->getExtension(), ['jpg', 'png', 'jpeg'])) {
$errors[] = Validation::failure('avatar', 'Invalid extension');
}
return new SettingsView($userId, $errors);
}
return new SettingsView($userId, Validation::success());
}
<!-- begin snippet: js hide: false console: true babel: false -->
class SettingsView extends View
{
public ValidationAttributes $validation;
public function __construct(int $userId, Validation| array $validation)
{
parent::__construct('src/mess/view/pages/settings.php', [
'profile' => new Profile($userId),
]);
$this->validation = new ValidationAttributes($validation, [
'photo',
'avatar',
'lastName',
'work',
'school',
'relationship',
'phoneNumber',
'place'
]);
}
}