Я запустил игру, используя Symfony 4.x , и решил использовать traits
, чтобы избежать дублирования кода.
namespace App\Traits;
use App\Entity\Brand;
/**
* Trait ToolTrait
* @package App\Traits
*/
trait ToolTrait
{
/**
* @var null|int
*/
private $id;
/**
* @var null|Brand
*/
private $brand;
/**
* @var null|string
*/
private $name;
/**
* @var null|string
*/
private $image;
/**
* @var float
*/
private $moneyPrice = 0.00;
/**
* @var int
*/
private $gemsPrice = 0;
/**
* @var null|float
*/
private $maintenance = 0.00;
/**
* @var boolean
*/
private $limited = false;
/**
* @var int
*/
private $leftSales = 0;
/**
* @var int
*/
private $totalSales = 0;
/**
* @var bool
*/
private $enabled = true;
/**
* @return int|null
*/
public function getId(): ?int
{
return $this->id;
}
/**
* @param int|null $id
*
* @return ToolTrait
*/
public function setId(?int $id): self
{
$this->id = $id;
return $this;
}
/**
* @return Brand|null
*/
public function getBrand(): ?Brand
{
return $this->brand;
}
/**
* @param Brand|null $brand
*
* @return ToolTrait
*/
public function setBrand(?Brand $brand): self
{
$this->brand = $brand;
return $this;
}
/**
* @return null|string
*/
public function getName(): ?string
{
return $this->name;
}
/**
* @param null|string $name
*
* @return ToolTrait
*/
public function setName(?string $name): self
{
$this->name = $name;
return $this;
}
/**
* @return null|string
*/
public function getImage(): ?string
{
return $this->image;
}
/**
* @param null|string $image
*
* @return ToolTrait
*/
public function setImage(?string $image): self
{
$this->image = $image;
return $this;
}
/**
* @return float|null
*/
public function getMoneyPrice(): ?float
{
return $this->moneyPrice;
}
/**
* @param float|null $moneyPrice
*
* @return ToolTrait
*/
public function setMoneyPrice(?float $moneyPrice): self
{
$this->moneyPrice = $moneyPrice;
return $this;
}
/**
* @return int|null
*/
public function getGemsPrice(): ?int
{
return $this->gemsPrice;
}
/**
* @param int|null $gemsPrice
*
* @return ToolTrait
*/
public function setGemsPrice(?int $gemsPrice): self
{
$this->gemsPrice = $gemsPrice;
return $this;
}
/**
* @return float|null
*/
public function getMaintenance(): ?float
{
return $this->maintenance;
}
/**
* @param float|null $maintenance
*
* @return ToolTrait
*/
public function setMaintenance(?float $maintenance): self
{
$this->maintenance = $maintenance;
return $this;
}
/**
* @return bool
*/
public function isLimited(): bool
{
return $this->limited;
}
/**
* @param bool $limited
*
* @return ToolTrait
*/
public function setLimited(bool $limited): self
{
$this->limited = $limited;
return $this;
}
/**
* @return int
*/
public function getLeftSales(): int
{
return $this->leftSales;
}
/**
* @param int $leftSales
*
* @return ToolTrait
*/
public function setLeftSales(int $leftSales): self
{
$this->leftSales = $leftSales;
return $this;
}
/**
* @return int
*/
public function getTotalSales(): int
{
return $this->totalSales;
}
/**
* @param int $totalSales
*
* @return ToolTrait
*/
public function setTotalSales(int $totalSales): self
{
$this->totalSales = $totalSales;
return $this;
}
/**
* @return bool
*/
public function isEnabled(): bool
{
return $this->enabled;
}
/**
* @param bool $enabled
*
* @return ToolTrait
*/
public function setEnabled(bool $enabled): self
{
$this->enabled = $enabled;
return $this;
}
/**
* @return null|string
*/
public function __toString()
{
return $this->name ?? '-';
}
}
Это мой trait
. Я не добавил сюда Doctrine mapping. Для этого я создал один файл для каждого из моих классов и установил там сопоставление ( XML ). Сопоставление хорошо, потому что ошибки нет, и я проверил ее вручную, используя HeidiSQL .
Проблема в том, когда я отправляю форму. Некоторые из моих свойств считаются частью сущности, некоторые нет. Это странно, потому что у меня нет детей, и сущность только реализует эту черту. Есть идеи?
Что действительно странно, так это то, что свойство fileTmp загружается из другой черты, но у него нет сопоставления (используется только для загрузки изображений).
Я должен сказать, что для этих полей у меня есть специальный тип поля, реализованный на основе документации Symfony. Если я уберу это, все будет нормально.
<?php
namespace App\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\OptionsResolver;
/**
* Class HorsePowerType
* @package App\Form\Type
*/
class HorsePowerType extends AbstractType
{
/** {@inheritdoc} */
public function buildView(FormView $view, FormInterface $form, array $options)
{
$view->vars['icon'] = 'HP';
}
/** {@inheritdoc} */
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'error_bubbling' => false
]);
}
/** {@inheritdoc} */
public function getBlockPrefix()
{
return 'horse_power';
}
}
И шаблон:
{% block horse_power_widget %}
{% spaceless %}
<div class="input-group">
{{ block('form_widget_simple') }}
<span class="input-group-addon">{{- icon|raw -}}</span>
</div>
{% endspaceless %}
{% endblock %}
P.S: Единственные дополнительные поля в этой сущности: horsePower, fuelTank, maxSpeed, maxCapacity.