Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Всем привет!
Пишу сайт недвижимости, нужно работать с множеством разных объектов недвижимости, которые частично отличаются друг от друга.
Решил использовать фабрику при создании объектов, сделать общий интерфейс и разбить на классы. Уперся я в то, что для сохранения в БД, объект должен быть экземпляром 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);
}
Не в сети
Страницы 1