Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 09.05.2018 16:10:40

Фабрика, создание и сохранение объектов в БД

Всем привет!
Пишу сайт недвижимости, нужно работать с множеством разных объектов недвижимости, которые частично отличаются друг от друга.
Решил использовать фабрику при создании объектов, сделать общий интерфейс и разбить на классы. Уперся я в то, что для сохранения в БД,  объект должен быть экземпляром EstateObject

...
class EstateObject extends Model
{
    protected $table = 'objects';
   
    public function complex()
    {
        return $this->belongsTo('App\Complex', 'complex_id');
    }
...

Но при создании нового объекта, например FlatObject, не могу уйти дальше. Как я понял, нужно как-то объединить модели в коллекцию, чтобы юзать общую базу `objects`. Но технически ничего не выходит. Подскажите, куда копать и вообще верно ли я мыслю? ))
p.s.: читал у какого Британца про Recast моделей, но до конца не въехал (

<?php

namespace App\Http\Controllers\Interfaces;

interface EstateObjectInterface
{
    public function setObjectType(string $objectType);
    public function setDealType(string $dealType);
    public function setName(string $objectType, int $roomsCount);
    public function setPrice(int $price);
}
<?php

namespace App\Http\Controllers\Admin\Objects;

use App\Http\Controllers\Interfaces\EstateObjectInterface;

class ResidentialFactory extends EstateObjectFactoryMethod
{
    protected function createObject(string $type): EstateObjectInterface
    {

        switch ($type) {
            case parent::FLAT:
                return new FlatObject();
            case parent::ROOM:
                return new RoomObject();
            default:
                throw new \InvalidArgumentException("$type is not a valid object");
        }
    }
}
<?php

namespace App\Http\Controllers\Admin\Objects;

use App\EstateObject;
use App\Http\Controllers\Interfaces\EstateObjectInterface;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

abstract class EstateObjectFactoryMethod extends Controller
{
    const FLAT  = 'квартира';
    const ROOM  = 'комната';

    abstract protected function createObject(string $type): EstateObjectInterface;

    public function create(Request $request): EstateObjectInterface
    {
        $object = $this->createObject($request['object_type']);

        $object->setObjectType($request['object_type']);
        $object->setDealType($request['deal_type']);
        $object->setName($request['object_type'], $request['rooms_count']);
        $object->setPrice($request['price']);

        $this->saveInDB($object); //вот здесь хочется сохранить объект в БД

        return $object;
    }

Вот так я планировал создать-сохранить, а затем вернуть сохраненный объект фронту

<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Admin\Objects\ResidentialFactory;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class ObjectController extends Controller
{
    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $factory = new ResidentialFactory();
        $object = $factory->create($request);

        return response()->json($object, 200, [], JSON_UNESCAPED_UNICODE);
    }
}

Вот часть одного из видов объекта

<?php

namespace App\Http\Controllers\Admin\Objects;

use App\EstateObject;
use App\Http\Controllers\Interfaces\EstateObjectInterface;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class FlatObject implements EstateObjectInterface
{
    private $objectType;
    private $dealType;
    private $name;
    private $price;
    
    public function setObjectType(string $objectType)
    {
        $this->objectType = $objectType;
    }

    public function setDealType(string $dealType)
    {
        $this->dealType = $dealType;
    }

    public function setName(string $objectType, int $roomsCount = null)
    {
        $this->name = $this->getNameByParams($objectType, $roomsCount);
    }

Не в сети

Подвал раздела