Шаблоны Laravel и репозитория / шлюза.Я потерял заполняемое свойство для будущего помощника? - PullRequest
0 голосов
/ 13 февраля 2019

Я следую этому ответу по его шаблону:

Как создать первое веб-приложение REST API в Laravel

В конце мое приложение работает с этимиметоды:

LanController

/**
     *
     * Store the data in database
     *
     * @param Request $request
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|void
     */
    public function store(Request $request)
    {

        $status = $this->lan_gateway->create($request->all());
        /**
         * Status is true if insert in database is OK
         * or an array of errors
         */
        if ($status===true) {
            return redirect(route('lan'))
                ->with('success',trans('common.operation_completed_successfully'));
            // validation ok
        } else {
            return redirect(route('lan-create'))
                ->withInput()
                ->withErrors($status);
            // validation fails
        }
    }

LanGateway

/**
     * Validate input and create the record into database
     *
     * @param array $data the values to insert
     * @return array $validator errors on fails
     * @return bool $status true on success
     */
    public function create(array $data)
    {
        $validator = Validator::make($data, [
            'ip_address' => 'required|string'
        ]);

        if ($validator->fails()) {
            return $validator->errors()->all();
        } else {
            $status = $this->lan_interface->createRecord($data);
            return $status;
        }

    }

И этот интерфейс реализован в репозитории create method

<?php
/**
 * Repository for LAN object.
 * PRG paradigma, instead of "User"-like class Model
 *
 * @see https://stackoverflow.com/questions/23115291/how-to-make-a-rest-api-first-web-application-in-laravel
 */

namespace App\Repositories;
use App\Interfaces\LanInterface;
use Illuminate\Database\Eloquent\Model;


class LanRepository extends Model implements LanInterface
{

    /**
     * The name of table on database
     * @var string The table name on database
     */
    protected $table = "lans";

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

    public function getAllRecords()
    {
        $lan = $this->all();
        return $lan;
    }

    /**
     *
     * Insert record inside database.
     *
     * @param array $data
     * @return bool true on success, false on failure
     */
    public function createRecord(array $data)
    {
        foreach ($data as $key => $value) {
            if (in_array($key,$this->fillable)) {
                $this->$key = $value;
            }
        }
        $status = $this->save();
        return $status;
    }

Вы можете видеть, что я "потерял" вспомогательные методы, которые можно заполнить, в конце я использую только как "needle / haystack".

Возможна ли другая реализация для моегоcreateRecord метод использования, насколько это возможно, методов / помощников по умолчанию Laravel или я в самом правильном направлении?

Большое спасибо

1 Ответ

0 голосов
/ 14 февраля 2019

Как видно из документации , свойство $ fillable применяется только при использовании операторов массового присваивания.

Теперь, если условная проверка if (in_array($key,$this->fillable)) { предназначена только для проверки, сохранен ли только некоторый разрешенный набор столбцов из API, вы можете создать другое свойство, скажем, protected $allowedToInsert = ['column1', 'column2],..;, а затем обновить условное выражение:

* 1008.*

Таким образом, вы можете использовать fillable так, как это предполагается. Подход, который вы используете, может быть самым простым, но вы можете улучшить обзор вещей.См. этот для справки

...