Как передать параметры в Laravel Rule? - PullRequest
0 голосов
/ 04 мая 2018

Я бы хотел переместить этот код в приложение \ Rule:

//Currently in class AppServiceProvider extends ServiceProvider

Validator::extend('empty_if', function ($attribute, $value, $parameters, $validator) {
   return ($value != '' && request($parameters[0]) != '') ? false : true;
});

Так что должно быть так:

//in: App\Rules\EmptyIf

public function passes($attribute, $value, $parameters)
{
   return ($value != '' && request($parameters[0]) != '') ? false : true;
}

Но моя проблема в том, что я не могу передать $ параметры с

Validator::extend('empty_if', 'App\Rules\EmptyIf@passes');

Как бы вы передали параметры в Laravel Rule?

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

При использовании класса правила с обязательным $parameters вы получите ошибку:

PHP Fatal error:
Declaration of App\Rules\AgeAt::passes($attribute, $value, $parameters)
must be compatible with Illuminate\Contracts\Validation\Rule::passes($attribute, $value)

Вы можете просто сделать это $parameters необязательным, и вы получите параметры, переданные в Laravel 5.5+ автоматически:

public function passes($attribute, $value, $parameters = [])
{
    //do something here
}
0 голосов
/ 24 мая 2019

Вы можете сделать это, передав параметры в конструктор для вашего Rule:

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;
use Illuminate\Http\Request;

class EmptyIf implements Rule
{
    public $otherParameter;

    public function passes($attribute, $value)
    {
        if (Request::get($this->otherParameter) != '') {
            return ($value == '');
        }

        return true;
    }

    public function message()
    {
        return 'The :attribute cannot be empty if ' . $this->otherParameter . ' is set';
    }
}

А у поставщика услуг:

<?php

namespace App\Providers;

use App\Rules\EmptyIf;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap services.
     */
    public function boot(): void
    {
        Validator::extend('empty_if', function($attribute, $value, $parameters, $validator) {
            $rule = new EmptyIf($parameters[0]);

            return $rule->passes();
        });
    }
}

Так что теперь вы можете использовать строковую форму в вашем валидаторе:

'sometimes|nullable|empty_if:about_image|max:200|url'
0 голосов
/ 04 мая 2018

Если я правильно понимаю, что вам нужно, вам не нужно расширять валидатор.

У вас, кажется, есть класс:

class EmptyIf extends Rule {
      public function passes($attribute, $value, $parameters) { }
}

Тогда вы можете просто использовать это как:

$this->validate($data, [ "entry" => [ new EmptyIf() ] ]);

Вы можете сделать и то и другое, используя:

Validator::extend('empty_if', function ($attribute, $value, $parameters) {
    return (new EmptyIf())->passes($atribute, $value, $parameters);
 });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...