Как преобразовать заголовок изображения в слаг и сохранить его в базе данных? Laravel - PullRequest
1 голос
/ 06 марта 2020

Пользователь может загрузить image, и я хочу перехватить предоставленное $request название изображения и преобразовать его в slug и сохранить его в Database

UploadScreenShotController@upload:

public function upload(Request $request)
{
    if (!auth()->check()) return $this->with('error', 'Session has ended. Please refresh the page and try again.');

    $request->validate([
        'image' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
    ]);

    $image = $request->image;
    $filename = $image->getClientOriginalName();

    $request->image->move(public_path('images/tcpa/screenshots'), $filename);

    return back()
        ->with('success', 'You have successfully uploaded an image.')
        ->with('image', $filename);
}

Моя форма:

        {!! Form::open(['method' => 'POST', 'files' => 'true', 'route' => ['admin.sms.tcpa-upload-screenshot']])!!}
            {!! Form::file('image') !!}
            {!! Form::submit('Upload File') !!}
        {!! Form::close() !!}

Этот function получает имя image, но не преобразует его в slug и не сохраняет в Database.

Как преобразовать заголовок image в slug и сохранить его в Database?

Ответы [ 3 ]

1 голос
/ 06 марта 2020

Вы можете использовать пакет Sluggable для создания слагов в вашем проекте. Этот пакет предоставляет черту, которая генерирует уникальный слаг при сохранении любой модели Eloquent.

Установка Вы можете установить пакет с помощью composer:

`composer require spatie/laravel-sluggable`

Вот пример того, как реализовать черта:

 namespace App;
 use Spatie\Sluggable\HasSlug;
 use Spatie\Sluggable\SlugOptions;
 use Illuminate\Database\Eloquent\Model;

 class YourEloquentModel extends Model
 {
   use HasSlug;
    /**
     * Get the options for generating the slug.
    */
     public function getSlugOptions() : SlugOptions
      {
         return SlugOptions::create()
              ->generateSlugsFrom('name')
              ->saveSlugsTo('slug');
      }
 }

И также не забудьте добавить поле slug в таблицу базы данных. Используйте Laravel Migration для редактирования вашей текущей таблицы.

Пример ::

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateYourEloquentModelTable extends Migration
{
 /**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::create('your_eloquent_models', function (Blueprint $table) {
        $table->increments('id');
        $table->string('slug'); // Field name same as your `saveSlugsTo`
        $table->string('name');
        $table->timestamps();
    });
}

}

И затем, если вы хотите использовать этот слаг в качестве имени маршрута, не забудьте использовать Laravel неявная привязка модели маршрута в файле вашей модели:

/**
 * Get the route key for the model.
 *
 * @return string
 */
public function getRouteKeyName()
{
    return 'slug';
}

Я думаю, это поможет вам

1 голос
/ 06 марта 2020

Если вы можете сделать это, используя метод boot в вашей модели.

<?php

namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;

class YourEloquentModel extends Model
{
    protected static function boot()
    {
        parent::boot();

        self::creating(function ($model) {
            $model->slug = Str::slug($model->name, '-');
        });
    }
}

Остальные вещи, за которыми вы можете следовать, как @ NIVED KRISHNA показали его ответ; Как: миграция, привязка модели маршрута.

1 голос
/ 06 марта 2020

положить 'enctype'=>'multipart/form-data'

  {!! Form::open(['method' => 'POST', 'files' => 'true','enctype'=>'multipart/form-data', 'route' => ['admin.sms.tcpa-upload-screenshot']])!!}
...