- var_dump: documentation ( source)
- array_shift: documentation ( source)
- array_filter: documentation ( source)
<?php
class User {
public readonly int $id;
public readonly string $email;
public function __construct(int $id, string $email) {
$this->id = $id;
$this->email = $email;
}
}
interface IUserStorage {
public function addUser(User $user): void;
public function findById(int $userId): ?User;
public function findFirstByEmail(string $email): ?User;
}
class RuntimeUserStorage implements IUserStorage {
private array $users;
public function __construct(array $users = []) {
$this->users = $users;
}
public function addUser(User $user): void {
$this->users[$user->id] = $user;
}
public function findById(int $userId): ?User {
return $this->users[$userId] ?? null;
}
public function findFirstByEmail(string $email): ?User {
$usersWithEmail = array_filter($this->users, static fn(User $user) => $user->email === $email);
return array_shift($usersWithEmail);
}
}
interface IFindEmail {
public function __invoke(string $email): ?string;
}
class FindEmailFromUsers implements IFindEmail {
private IUserStorage $users;
public function __construct(IUserStorage $users) {
$this->users = $users;
}
public function __invoke(string $email): ?string {
return $this->users->findFirstByEmail($email)?->email;
}
}
class IsEmailValid {
private IFindEmail $findEmail;
public function __construct(IFindEmail $findEmail) {
$this->findEmail = $findEmail;
}
public function __invoke(string $email): bool {
return $this->isEmailUnique($email)
&& $this->isEmailValid($email)
&& $this->isEmailTooShort($email);
}
private function isEmailUnique(string $email): bool {
$foundEmail = ($this->findEmail)($email);
if(null === $foundEmail) {
return true;
}
return $foundEmail !== $email;
}
private function isEmailValid(string $email): bool {return true;}
private function isEmailTooShort(string $email): bool {return true;}
}
$user = new User(1, 'vasya@gmail.com');
$emailStorage = new RuntimeUserStorage();
$emailStorage->adduser($user);
$isEmailValid = new IsEmailValid(new FindEmailFromUsers($emailStorage));
var_dump($isEmailValid($user->email));
var_dump($isEmailValid('petya@mail.ru'));