Как проверить данные запроса, pu sh другой массив после проверки и создать объект в хорошем виде в Laravel 6 - PullRequest
0 голосов
/ 16 января 2020

Я хотел бы проверить данные, затем создать слагов после проверки и создать объект хорошим способом.

Это не решение, которое я исключаю:

public function store()
{
 data = request()->validate([
   'name_en' => 'required',
   'name_de' => 'required'
 ]);
 $data['slug_en'] = Str::slug(request()->name_en);
 $data['slug_de'] = Str::slug(request()->name_de);

 Post::create( $data );   
}

I ' хотел бы добиться того же:

public function store()
{
Post::create( request()->validate([
  'name_en' => 'required',
  'name_de' => 'required'
]) );

//where to place slugs creation?

}

Ответы [ 2 ]

1 голос
/ 16 января 2020

Хороший способ сделать это в Laravel - с помощью Запросы формы . Вы можете создать класс для вашего запроса, который расширяет класс FormRequest (давайте предположим, что вы называете его StorePost для этого примера).

В этом классе вы можете использовать метод rules для установки правил проверки Примерно так:

public function rules()
{
    return [
        'name_en' => 'required',
        'name_de' => 'required',
    ];
}

Чтобы добавить ключи slug_, вы можете использовать метод prepareForValidation . Этот метод можно использовать для добавления данных в запрос с помощью метода merge, например:

protected function prepareForValidation()
{
    $this->merge([
        'slug_en' => Str::slug($this->name_en),
        'slug_de' => Str::slug($this->name_de)
    ]);
}

Поскольку это происходит до проверки, вы даже можете добавить проверку к своим ключам slug_ в rules() method.

Таким образом, чтобы фактически использовать этот класс, вы можете просто напечатать имя класса в вашем методе контроллера, используя Laravel magi c. Ваш действительно аккуратный контроллер теперь может выглядеть следующим образом:

public function store(StorePost $request)
{
    Post::create($request->all()); // or specify the keys you want inside the `all()` method
    // ...
}

И это так просто! Проверка запроса формы на самом деле произойдет до того, как будет запущен метод контроллера, поэтому вы можете быть уверены, что проверенные данные будут правильными.

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

0 голосов
/ 16 января 2020

Laravel имеет класс с именем TransformsRequest ;

Он может автоматически фильтровать и обрабатывать все поля в вашем запросе.

Я думаю, вы можете создать middleware как SlugStrings.php и extension TransformsRequest .

Так что значение ключа каждого запроса будет преобразовано в slug.

  1. создать app/Http/Middleware/SlugStrings.php файл:
namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\TransformsRequest;
use Illuminate\Support\Str;

class SlugStrings extends TransformsRequest
{
    /**
     * The names of the attributes that should be slug.
     *
     * @var array
     */
    protected $only = [
        'name_en',
        'name_de',
    ];

   /**
     * Transform the given value.
     *
     * @param  string  $key
     * @param  mixed  $value
     * @return mixed
     */
    protected function transform($key, $value)
    {
        if (in_array($key, $this->only, true)) {
            return is_string($value) ? Str::slug($value) : $value;
        } else {
            return $value;
        }
    }
}

Добавьте это промежуточное ПО к app/Http/Kernel.php:
    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        ...
        // Add it here:
        \App\Http\Middleware\SlugStrings::class,
        ...
    ];

Теперь вы ничего не можете сделать с полями name_en и name_de, просто создайте их из запроса:

public function store()
{
Post::create( request()->validate([
  'name_en' => 'required',
  'name_de' => 'required'
]) );
}

Это довольно легко.

Так что в следующий раз у вас есть другое поле, и вы хотите убить его. Просто добавьте его в атрибут $only.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...