Validacja porównanie dwóch pól, polityka

0

Hej,

mam dwie numeryczne wartości, które śle postem. Chciałbym aby nie przeszło validacji gdy obie wartości są różne.

Załóżmy że mamy jakąś prostą politykę

    public function canUserAccessLocation(User $user, Location $location)
    {
        $userLocations = $user->customer->locations;

        if ($user->hasAnyRole([User::ROLE_ADMINISTRATOR, User::ROLE_SALESMANAGER])) {
            return true;
        }

        return $userLocations->contains('id', $location->id);
    }

czy mogę jej uzyć na widoku czyli np. @can('canUserAccessLocation', Auth::User, $location)

0

Polityka służy do sprawdzania dostępu (np. czy aktualnie zalogowany użytkownik może usunąć stronę o id 123).

Logikę związaną z walidacją formularza powinieneś trzymać w FormRequest-cie.

0

rozumiem, przekombinowałem.
jak zwalidować

        $request->validate([
            'quantity' => 'required|numeric',
            'herd_age' => 'required|numeric',
            'duration' => 'required|numeric',
        ]);

chciałbym aby quantity i pole quantity_left były walidowane razem tzn jeśli te dwa pola są równe walidacja przechodzi OK

0

nie precyzyjnie to określiłem.
Mam pozycje dokumentu. Wsród innych pól jest pole ilość, ilość_pozostala.

Na podstawie pozycji mogę dodać nową pozycję do innego dokumentu, zachowując id źródła.

Chciałbym nie pozwolić edytować ilości zródła kiedy jest powiązanie z inną pozycją. Oprócz związku, oczywiście, mogę na skróty stwierdzić, że jakieś powiązanie jest gdy ilość <> ilość_pozostała.

Jednak używają :same nie mogę zupdejtować ilości ( nawet pozycji niepowiązanej ) bo gdy przesyłam nową ilość zawsze będzie różna od ilości_pozostałej.

0

Niestety nie potrafię nic z Twojego opisu zrozumieć :/

0

no dobrze, trochę bliżej
mam dwie encje: dokument i pozycje.
m.in: pozycje -> pole ilosc, pole ilosc_pozostała.

Dodawanie dokumentu nazwijmy to TYPU_1 jest proste. Dodaję nagłówek dokumentu i dalej pozycje.

Mam też bardziej złożony typ dokumentu TYP_2, którego pozycje powstawają poprzez przeciąganie pozycji z dokumentów innego typu. Gdy zrobię taki zabieg ilość pozostała na pozycji dokumentu TYP_1 ulega zmianie.
Nie chce pozwolić na edycję pozycji na dokumencie TYPU_1 jeśli jest powiązanie z pozycją na dokumencie TYPU_2. Mogę skrócić i na ten moment pominąć sprawdzanie związku opierając tą decyzję na warunku " edytuj jeśli ilość === ilość_pozostała ".
Jeśli te wartości są różne oznacza to, że mam gdzieś dokumentu TYP_2 którego pozycja powstała na bazie dokumentu TYPU_1

'quantity' => 'required|numeric|same:quantity_left',

nie da rady z wiadomych względów.
W sumie mógłbym do formularza edycji dodać ukryte pole z wartością obecną i zapakować to do reguły walidacyjnej.

0

Ach, chyba rozumiem - w takim wypadku niestety tak łatwo tego nie uda się wykonać.
Wydaje mi się, że najprostszym wyjściem w tym wypadku byłoby, gdybyś nadpisał metodę validate() - plus-minus w taki sposób:

<?php

/* ... */

class DocumentModifyRequest extends FormRequest {

    public function validate(): void {
        parent::validate();

        $documentModel = $this->get('document');
        $newItems = $this->get('items');
        
        foreach ($documentModel->items as $oldItem) {
            if (/* ... */) {
                throw new ValidationException('Whoa, nie możesz zmodyfikować tego pola!');
            }
        }
    }
    
}

(napisane na kolanie, ale prezentuje ogólną ideę)

1 użytkowników online, w tym zalogowanych: 0, gości: 1