PHP Laravel = Walidacja + Packagist service-to/validate-email

PHP Laravel = Walidacja + Packagist service-to/validate-email
CA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
0

Dobry wieczór Panowie. Znalazłem packagist: link
Niestety Laravela dopiero się uczę i nie wiem do końca jak to rozgryźć, ponieważ mam już własną walidację , teoretycznie wiem jak to ma wyglądać ale w praktyce gorzej.

chodzi o fragment kodu, który powinien być (chyba) w metodzie validator (?)

Kopiuj
$validateemail = new Validateemail;
        try {
            if (!$validateemail->test($request->input("email"))) {
                return redirect()->back()->withErrors(["email" => "Invalid Email Address"]);
            }
        }
        catch (\ServiceTo\ValidateEmailException $vee) {
            return redirect()->back()->withErrors(["email" => "Invalid Email Address (" . $vee->getMessage() . ")"]);
        }

Poniżej fragment mojego kodu

Kopiuj
protected function validator(array $data)
    {
        return Validator::make($data, [
            'user' => 'required|string|min:3|max:255|unique:users',
            'email' => 'required|string|min:5|email|max:255|unique:users',
            'password' => 'required|string|min:6||regex:/^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{6,}$/',
            'password_confirmation' => 'required|same:password', 
            'type' => 'required|in:0,1', 
        ]);
    }
 
 
protected function create(array $data)
    {
        $user =  User::create(
            [
            'user' => $data['user'],
            'email' => $data['email'],
            'password' => bcrypt($data['password']),
            'ip' => request()->ip(),
            ]
        );
        return $user;
    }
 
 
    public function register(Request $request)
    {
        $this->validator($request->all())->validate();
        $user = $this->create($request->all());
 
        event(new Registered($user));
        $this->guard()->login($user);
        UserVerification::generate($user);
        UserVerification::send($user, 'Potwierdzenie rejestracji konta.', env('MAIL_FROM_ADDRESS'), env('APP_NAME'));
 
 
        $user = Event::create([
            'user_id' => $user->id,
            'event' => 1, // 1 - Rejestracja konta
            'description' => 'Rejestracja konta',
            'ip' => request()->ip(),
        ]);
 
        return $this->registered($request, $user)
            ?: redirect($this->redirectPath());
    }

Byłbym wdzięczny za pomoc.

jurek1980
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3581
2

Może w oparciu o tą paczkę stwórz sobie po prostu własną regułę walidacyjną. Wtedy zamiast reguły email z samego Laravel użycjesz sobie myOwnEmail.
W dokumentacji masz opisane jak stworzyć regułę. https://laravel.com/docs/8.x/validation#custom-validation-rules (oczywiście wybierz wersję z jakiej korzystasz.
Przy okazji panujesz nad komunikatami walidacyjnymi w zunifikowany sposób.

CA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
0

Czyli reasumując zamiast w walidacji użyć reguły email:

Kopiuj
'email' => 'required|string|min:5|email|max:255|unique:users,email',

używam wtedy czegoś takiego:

Kopiuj
'email' => 'mojaNowaregula',

dobrze rozumiem ?
Swoją drogą nie rozumiem, czemu nie znajduje mi klasy :
Class 'ServiceTo\ValidateEmail' not found"

jurek1980
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3581
0

Jak stworzysz własną regułę, to możesz korzystać z innych.

Kopiuj
'email' => 'required|string|min:5|myOwnEmail|max:255|unique:users,email',

Swoją drogą nie rozumiem, czemu nie znajduje mi klasy :
Class 'ServiceTo\ValidateEmail' not found"

A dodałeś na początku pliku w use?

Kopiuj
<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;
//dodajesz sciekzke do klasy
use ServiceTo\ValidateEmail

class MyOwnEmail implements Rule
{
    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        $validateEmail = new ValidateEmail();
         return $validateEmail->test($value);
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return 'The :attribute must be real email from existing domain.';
    }
}
CA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
0

@jurek1980: coś jest jeszcze źle, nie rozumiem, czemu dokleja "Validate" , zwraca mi błąd:
"Method [validateMyOwnEmail] does not exist."

jurek1980
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3581
0

Przepraszam, wprowadziłem Cię w błąd. Musisz przekazać instancję tej reguły

Kopiuj
$request->validate([
    'name' => ['required', 'string','min:5','max:255', new MyOwnEmail],
]);

Jest w dokumentacji;)

CA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 15
0

@jurek1980:

Hmm ale jak to ugryźć z tą moją funkcją :

Kopiuj
 protected function validator(array $data)
    {
        return Validator::make($data, [
            'user' => 'required|string|min:3|max:255|unique:users',
            'email' => 'required|string|myOwnEmail|min:5|max:255|unique:users,email',
            //'email' => 'required|string|new myOwnEmail|min:5|max:255|unique:users,email',
            'password' => 'required|string|min:6||regex:/^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{6,}$/',  
            'password_confirmation' => 'required|same:password', 
        ]);
    }

Dla testów zrobiłem coś takiego:

Kopiuj
 public function register(Request $request)
    {


        $request->validate([
            'email' => ['required', 'string','min:5','max:255', new MyOwnEmail],
        ]);
  }

Niestety znowu pojawia się bład braku klasy
myOwnEmail.php

Kopiuj
namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;
use ServiceTo\ValidateEmail;

class myOwnEmail implements Rule
{

jest użyta ta klasa ale nie znajduje jej.

jurek1980
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3581
0

Wielkość liter.
Poprawiłem powyżej.
Spróbuj na początek po prostu tak:

Kopiuj
$request->validate([
            'email' => [new MyOwnEmail],
        ]);

Zerknij jeszcze raz do dokumentacji na spokojnie. Wiesz piszę z palca i z pamięci, więc może mi się zdarzyć jakaś literówka, za co przepraszam. Klasy nazywamy z wielkiej normalnie(zgodnie z PSR). Jak poprawisz wszystkie literówki będzie działać.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.