---
title: "Použitie vo vlastnom balíku — Safe Fetch for Laravel | Roundly"
description: "Recepty pre balíky, ktoré načítavajú URL svojich používateľov — pravidlá bez uvoľnení hostiteľa, manažér, obmedzovač, opakovanie a predbežná kontrola."
url: https://roundly-consulting.com/sk/open-source/navody/safe-fetch-for-laravel/vlastne-baliky
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[Safe Fetch for Laravel](https://roundly-consulting.com/sk/open-source/navody/safe-fetch-for-laravel.md)

# Použitie vo vlastnom balíku

Balíky, ktoré posielajú požiadavky na URL adresy zadané ich vlastnými používateľmi — odosielanie webhookov, importy, náhľady odkazov — stavajú na Safe Fetch rovnakým spôsobom.

## Vlastné pravidlá nad pravidlami aplikácie

Začnite od SafeFetch::policy(), aby bloky aplikácie — blokovaní hostitelia a rozsahy, jej vlastní hostitelia — platili ďalej, a zahoďte jej uvoľnenia: meno, ktorému dôveruje ako privátnemu (minio.internal), rozsah otvorený pre lokálny vývoj (127.0.0.1/32) a zoznam povolených hostiteľov pre celú aplikáciu vznikli pre jej vlastné požiadavky, nie pre URL adresy, ktoré zadávajú vaši používatelia:

```php
$policy = SafeFetch::policy()
    ->withoutHostAllowlist()->withoutPrivateHosts()->withoutAllowedRanges()
    ->blockAppHosts()->appHosts($appHosts)
    ->blockHosts($blockedHosts)->blockRanges($blockedRanges)->allowRanges($allowedRanges)
    ->ports($ports)->maxResponseBytes(4096)
    ->redirects(RedirectPolicy::methodPreserving($max, forwardHeaders: ['webhook-id', 'webhook-timestamp', 'webhook-signature']));
$policy = $allowedHosts === [] ? $policy : $policy->allowHosts($allowedHosts);
```

- blockAppHosts() zapne blokovanie hostiteľov aplikácie bez ohľadu na jej konfiguráciu (blockAppHosts(false) ho vypne).
- allowHosts() nahradí zoznam povolených a prázdny zoznam odmietne — rozvetvite kód podľa vlastného nastavenia ako vyššie, namiesto odovzdania zoznamu, ktorý môže byť prázdny.
- RedirectPolicy::methodPreserving($max, forwardHeaders: \[...\]) sleduje len 307/308 a pomenované hlavičky pošle aj na iný origin, kam presmerovanie vedie; každá iná hlavička a všetky prihlasovacie údaje zostanú pri prvom origine.

## Odosielanie cez manažéra, obmedzovač najprv

Injektujte SafeFetchManager (alebo použite fasádu) a volajte guard() — nikdy makro Http::safe(), ktoré by iný balík mohol nahradiť. Obmedzovač pridajte pred ochranu, aby bežal raz na volanie, ešte pred prekladom DNS ($throttle je akýkoľvek middleware Guzzle):

```php
$response = $safeFetch->guard(
    Http::withMiddleware($throttle)->connectTimeout(5)->timeout(10)->withHeaders($headers),
    $policy,
)->withBody($body, 'application/json')->post($url);
```

## Opakovanie končí pri odmietnutí

```php
$response = $safeFetch->guard(Http::retry(3, 100, fn (Throwable $e) => ! $e instanceof SafeFetchException), $policy)
    ->post($url, $payload);
```

## Konečné alebo opakovateľné

```php
try {
    $response = $safeFetch->guard(Http::timeout(10), $policy)->post($url, $payload);
} catch (DestinationRejected $e) {
    $outcome = ['retry' => false, 'reason' => $e->reason()->value, 'rule' => $e->blockedBy()];   // never retry
} catch (DestinationUnavailable $e) {
    $outcome = ['retry' => true, 'reason' => $e->reason()->value];                              // unresolved, out of time
}
```

DestinationRejected je konečné — reason() a blockedBy() si uložte pre prevádzkovateľov, ale rozdiel nikdy neukazujte tomu, kto URL odoslal. Chyba prenosu chránenej požiadavky je vlastná ConnectionException Laravelu, ktorej správa obsahuje URL adresu — nezobrazujte ju.

## Obmedzená odpoveď a odkiaľ prišla

```php
$response = $safeFetch->guard(Http::timeout(10), $policy->maxResponseBytes(4096))->post($url, $payload);

$excerpt = $response->body();                                    // at most 4 096 bytes
$cut = $safeFetch->truncated($response);                         // true when the body was cut
$remoteAddress = $response->handlerStats()['primary_ip'] ?? null; // the vetted address it connected to
```

## Pri ukladaní: všetky pravidlá okrem prekladu

Keď sa URL adresa ukladá, a nie volá (koncový bod, ktorý si používateľ zaregistruje), posúďte ju bez čakania na DNS:

```php
$request->validate(['endpoint' => ['required', 'string', SafeUrl::withoutLookup($policy)]]);
$stored = $safeFetch->precheck($request->input('endpoint'), $policy)->toString();
```

Ochrana posúdi URL adresu v plnom rozsahu pri každej požiadavke; recepty na testovanie balíka nájdete v časti Testovanie.

## Prejavte lásku k open source

Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.

[Ďalšie spôsoby podpory vrátane kryptomien](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

## Chcete to zabudovať do svojho produktu?

Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/safe-fetch-for-laravel.md)
