Laravel спрощує валідацію URL завдяки методу Str::isUrl, який надає розробникам простий інструмент для перевірки допустимості URL з можливістю обмеження протоколів для підвищення безпеки та гнучкості
Метод isUrl забезпечує базову валідацію URL з можливістю зазначати прийнятні протоколи:
use Illuminate\Support\Str;
// Основна валідація URL
$isUrl = Str::isUrl('http://example.com'); // true
$isUrl = Str::isUrl('laravel'); // false
// З обмеженням протоколів
$isUrl = Str::isUrl('http://example.com', ['http', 'https']);
Цей метод особливо корисний у системах управління контентом, де потрібна валідація URL:
class ResourceValidator
{
public function validateExternalLinks(array $links)
{
return collect($links)->filter(function ($url, $type) {
return match ($type) {
'documentation' => Str::isUrl($url, ['https']),
'repository' => Str::isUrl($url, ['https']),
'demo' => Str::isUrl($url, ['http', 'https']),
default => Str::isUrl($url)
};
});
}
public function validateSecureResources(array $urls)
{
return collect($urls)
->filter(fn($url) => Str::isUrl($url, ['https']))
->values();
}
public function sanitizeBookmarks(array $bookmarks)
{
return array_filter($bookmarks, function ($bookmark) {
// Дозволяємо лише http/https URL
if (!Str::isUrl($bookmark, ['http', 'https'])) {
return false;
}
// Додаткові перевірки тут
return true;
});
}
}
// Використання
$validator = new ResourceValidator();
$externalLinks = [
'documentation' => 'https://docs.example.com',
'demo' => 'http://demo.example.com',
'invalid' => 'not-a-url'
];
$validLinks = $validator->validateExternalLinks($externalLinks);
Метод також відмінно підходить для валідації форм, де користувачі подають різні типи URL:
class ProfileController extends Controller
{
public function validateSocialMedia(Request $request)
{
$socialUrls = $request->input('social_urls', []);
$validatedUrls = [];
foreach ($socialUrls as $platform => $url) {
if (empty($url)) continue;
$isValid = match ($platform) {
'linkedin' => Str::isUrl($url, ['https']) && str_contains($url, 'linkedin.com'),
'twitter' => Str::isUrl($url, ['https']) && str_contains($url, 'twitter.com'),
'github' => Str::isUrl($url, ['https']) && str_contains($url, 'github.com'),
'portfolio' => Str::isUrl($url, ['http', 'https']),
default => false
};
if ($isValid) {
$validatedUrls[$platform] = $url;
}
}
return $validatedUrls;
}
public function validateCompanyWebsites(array $websites)
{
return array_filter($websites, function ($website) {
return Str::isUrl($website, ['https']) &&
!str_contains($website, 'localhost') &&
!str_contains($website, '127.0.0.1');
});
}
}
Для API інтеграцій, які вимагають перевірки кінцевих точок:
class WebhookService
{
public function registerWebhook(string $url, array $events)
{
// Перевіряємо, що URL вебхука безпечний
if (!Str::isUrl($url, ['https'])) {
throw new InvalidWebhookException('Webhook URLs must use HTTPS protocol');
}
// Додаткова перевірка для вебхуків
if (!$this->isReachableEndpoint($url)) {
throw new InvalidWebhookException('Webhook endpoint is not reachable');
}
return $this->createWebhookSubscription($url, $events);
}
public function validateIntegrationUrls(array $integrations)
{
$validated = [];
foreach ($integrations as $service => $config) {
if (isset($config['callback_url']) &&
Str::isUrl($config['callback_url'], ['https'])) {
$validated[$service] = $config;
}
}
return $validated;
}
}
Метод isUrl полегшує валідацію URL, забезпечуючи послідовний та надійний підхід для перевірки формату URL з гнучкістю через обмеження протоколів, що підвищує вимоги до безпеки