Ефективно перевіряйте URL-адреси за допомогою методу Str::isUrl у Laravel

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 29 травня, 2025
Чи знаєте ви, як просто перевірити дійсність URL-адрес за допомогою Laravel? Досліджте, як метод Str::isUrl спрощує валідацію URL, надаючи можливість зазначати протоколи для підвищення безпеки та гнучкості

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 з гнучкістю через обмеження протоколів, що підвищує вимоги до безпеки