Люмен - правила проверки в модели? - PullRequest
0 голосов
/ 22 декабря 2018

Я создаю REST API и хотел бы добавить некоторые правила проверки к конечным точкам CREATE и UPDATE.Правила валидации для этих двух конечных точек будут абсолютно одинаковыми, поэтому я хотел бы иметь возможность указывать их только в одном месте.Исходя из фона Laravel, я обычно создаю запросы формы или помещаю правила проверки в модель в функцию rules().

Однако я думаю, что Lumen выполняет проверку немного по-другому, и их документация предлагает поместить логику проверкив роутере: https://lumen.laravel.com/docs/master/validation

Однако лично я не думаю, что это лучшее место для него и предпочел бы вместо этого поставить модель.Я попытался использовать функцию rules() в модели, но это, похоже, ничего не делает.

Мои create и update методы выглядят так:

public function create(Request $request)
{
    $product = Product::create($request->all());

    return response()->json($product, 201);
}

public function update($id, Request $request)
{
    $product = Product::findOrFail($id);
    $product->update($request->all());

    return response()->json($product, 200);
}

Isвозможно ли поместить мои правила проверки в мою модель Product и запустить их автоматически?

Вот как я пытался сделать это в своей модели:

namespace App;    

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'price', 'description',
    ];

    /**
     * The attributes excluded from the model's JSON form.
     *
     * @var array
     */
    protected $hidden = [];

    /**
     * Set model validation rules.
     *
     * @return array
     */
    public function validate()
    {
        return [
            'name' => 'required',
            'price' => 'required',
            'description' => 'required',
        ];
    }
}

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

Как вы упомянули и в соответствии с Документация для проверки Lumen (по состоянию на 5.8) :

Запросы формы не поддерживаются Lumen.Если вы хотите использовать запросы формы, вам следует использовать полную платформу Laravel.

Lumen не имеет ничего похожего на автоматическую проверку, предоставляемую запросами форм в Laravel, поэтому вам нужно будет выполнитьпроверка вручную.

Product

class Product extends Model
{
    /**
     * Get model validation rules.
     *
     * @return array
     */
    public static function getValidationRules()
    {
        return [
            'name' => 'required',
            'price' => 'required',
            'description' => 'required',
        ];
    }
}

Вышеуказанные правила проверки вашей модели Product определены как статические методы, правила должны быть одинаковыми для всех ваших Product объектов.Возможно, вы захотите рассмотреть сценарии, в которых поле должно быть unique в вашей базе данных, поэтому в качестве параметра можно указать аргумент.

ProductController

class ProductController extends Controller
{
    public function create(Request $request)
    {
        // Perform your validation
        $validatedData = $request->validate(Product::getValidationRules());

        // The Product is valid
        $product = Product::create($request->all());

        return response()->json($product, 201);
    }

    public function update($id, Request $request)
    {
        $product = Product::findOrFail($id);

        // Perform your validation
        $validatedData = $request->validate(Product::getValidationRules());

        // The Product is valid
        $product->update($request->all());

        return response()->json($product, 200);
    }
}

Если проверка не выполняется с помощьювыше, Lumen будет автоматически перенаправлять пользователя обратно в предыдущее местоположение, и ошибки будут мигать в сеансе (как в Laravel).Очевидно, вы можете изменить этот рабочий процесс, если хотите.

0 голосов
/ 22 декабря 2018

Тот же метод validate должен быть доступен и на уровне контроллера.Поэтому, если вы хотите повторно использовать правила, вы можете сделать что-то вроде этого:

private $product_rules = [
    'name' => 'required',
];

public function create(Request $request)
{
    $this->validate($request, $this->product_rules);
    $product = Product::create($request->all());

    return response()->json($product, 201);
}

public function update($id, Request $request)
{
    $product = Product::findOrFail($id);
    $this->validate($request, $this->product_rules);
    $product->update($request->all());

    return response()->json($product, 200);
}
...