44a1b21421
- app/Rules/SignalIdentifier/DomainIdentifier.php — regex
^[a-z0-9-]+(\.[a-z0-9-]+)+$ (нижний регистр, без протокола/пути).
- app/Rules/SignalIdentifier/PhoneIdentifier.php — regex ^7\d{10}$
(11 цифр, начинается с 7).
- app/Rules/SignalIdentifier/SmsSenderRule.php — 1-30 символов
[A-Za-z0-9_-]; отвергает 11-значные номера (поставщик блокирует
физический телефон в роли отправителя — alert "Важно!" в форме
создания SMS-проекта).
- tests/Feature/Rules/SignalValidatorsTest.php — 24 теста с datasets:
• Domain: 4 valid + 6 invalid (case, no-TLD, spaces, protocol, path, double-dot)
• Phone: 3 valid + 6 invalid (8-prefix, length, plus, spaces, letters)
• SmsSender: alpha+numeric short, 11-digit blocked, length>30 blocked,
empty (с required), special chars blocked
Quirk: Laravel skips non-implicit rules для пустых строк. Тест empty
использует связку 'required' + правило (как в реальном FormRequest).
Pest: 499 / 497 passed / 2 skipped (473 + 24 новых = 497).
Larastan: 0 errors. Pint passed.
Spec: §3.1
Plan: Task 12
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
25 lines
764 B
PHP
25 lines
764 B
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Rules\SignalIdentifier;
|
|
|
|
use Closure;
|
|
use Illuminate\Contracts\Validation\ValidationRule;
|
|
|
|
/**
|
|
* Валидатор signal_identifier для signal_type=call.
|
|
*
|
|
* Требует 11-значный номер, начинающийся с 7 (российский формат, без +/пробелов).
|
|
* Spec: docs/superpowers/specs/2026-05-10-supplier-integration-design.md §3.1
|
|
*/
|
|
class PhoneIdentifier implements ValidationRule
|
|
{
|
|
public function validate(string $attribute, mixed $value, Closure $fail): void
|
|
{
|
|
if (! is_string($value) || ! preg_match('/^7\d{10}$/', $value)) {
|
|
$fail('Phone number must be 11 digits and start with 7 (no spaces, no plus sign).');
|
|
}
|
|
}
|
|
}
|