рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореИрдВ рд╕рд┐рдореНрдлрдиреА (рдПрдХ рд╡рд░реНрд╖ рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЙрди рд╕рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЬрд┐рдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдореМрдХрд╛ рдерд╛ - рдЗрдХрд╛рдЗрдпрд╛рдВ рд╣рдореЗрд╢рд╛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рдереАрдВ рдХрд┐ рдЙрдирдореЗрдВ рдХреЗрд╡рд▓ рдирд┐рдЬреА рдХреНрд╖реЗрддреНрд░ рдФрд░ рдирдВрдЧреЗ рдмрд╕рдиреЗ рд╡рд╛рд▓реЗ / рдЙрдирдХреЗ рд▓рд┐рдП рдЧреЗрдЯрд░реНрд╕ рдереЗред
рд▓реЗрдЦ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЙрджрд╛рд╣рд░рдг рджреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЦрддрд░рдирд╛рдХ рдХреНрдпреЛрдВ рд╣реИ, рдЕрд░реНрдерд╛рддреН: рдпрд╣ рд╣рдорд╛рд░реЗ рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИ, рдмрдЧ рдХреЗ рд╕рд╛рде рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЛ рдЙрдХрд╕рд╛рддрд╛ рд╣реИ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИред
рд▓реЗрдЦ рд╡рд┐рднрд┐рдиреНрди рдмрд┐рд▓реНрдбрд░реЛрдВ рдореЗрдВ рдмрд╕рдиреЗ рдХреЗ рд╡рд┐рд╖рдп рдХреЛ рдЫреЛрдбрд╝ рджреЗрдЧрд╛ рдФрд░ рдмрд╕рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХрд╛ рд╡рд┐рд╖рдп (рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рд╣рдо рдЕрдиреБрдореЛрджрди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ)ред рдбреАрдбреАрдбреА, рд░рд┐рдЪ рдореЙрдбрд▓ рдЬреИрд╕реЗ рдЬрдЯрд┐рд▓ рд╡рд┐рд╖рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдпреБрдЧреНрдорди / рд╕рд╛рдордВрдЬрд╕реНрдп рдФрд░ рдЕрдиреНрдп рд╕реНрдорд╛рд░реНрдЯ рд╢рдмреНрджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ - рдмрд╕ рдЗрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВред рдмрд┐рд▓реНрд▓реА рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред
рдХреЛрдб рдкрд░ рдЬрд╛рдПрдВред рдЖрдЗрдП рдПрдХ рджреВрд╕рд░реЗ рдЯрд╛рдЗрдкрд┐рдВрде рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреЗрдВ рдФрд░ рдЯрд╛рдЗрдк рд░рд┐рдЯрд░реНрди рдЗрдВрдбрд┐рдХреЗрд╢рди рдФрд░ рд╕реЛрдЪреЗрдВ рдХрд┐ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдХреИрд╕реЗ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛рд╡рд╛рджреА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ:
$userName = $user->name;
$user->name = $newUserName;
:
$userName = $user->getName();
$user->setName($newUserName);
, , .
C . тАФ , .
? , , . , , , .
┬л┬╗ , :
class Order
{
private const STATUS_OPEN = 'open';
private const STATUS_DELIVERED = 'delivered';
private ProductCollection $products;
private string $deliveryStatus;
private ?DateTime $deliveryDate = null;
public function deliver()
{
if ($this->isDelivered()) {
throw new OrderDomainException('Order already delivered.');
}
$this->deliveryDate = new DateTime();
$this->deliveryStatus = self::STATUS_DELIVERED;
}
private function isDelivered(): bool
{
return $this->deliveryStatus === self::STATUS_DELIVERED;
}
//
}
┬л ┬╗ - ? ? тАФ ? . тАФ , , . (cohesion).
:
class Order
{
private const STATUS_OPEN = 'open';
private const STATUS_DELIVERED = 'delivered';
private ProductCollection $products;
private string $deliveryStatus;
private ?DateTime $deliveryDate = null;
public function getDeliveryStatus(): string
{
return $this->deliveryStatus;
}
public function setDeliveryStatus(string $deliveryStatus): void
{
$this->deliveryStatus = $deliveryStatus;
}
public function getDeliveryDate(): ?DateTime
{
return $this->deliveryDate;
}
public function setDeliveryDate(?DateTime $deliveryDate): void
{
$this->deliveryDate = $deliveryDate;
}
public function getProducts(): ProductCollection
{
return $this->products;
}
public function setProducts(ProductCollection $products): void
{
$this->products = $products;
}
}
? ( ). тАФ , , , , ? , ? . тАФ , тАФ . . . , тАФ ?
,
. тАФ , .
тАФ , , , , , .
. :
/**
* @ORM\Entity
*/
class Project
{
/**
* @var Id
* @ORM\GeneratedValue()
* @ORM\Id
*/
private $id;
/**
* @var string
* @ORM\Column(type="string")
*/
private $name;
/**
* @var string
* @ORM\Column(type="string", nullable=false)
*/
private $status;
/**
* @var int
* @ORM\Column(type="integer", nullable=true)
*/
private $sort;
/**
* @var User
* @ORM\Column(type="user_type", nullable=false)
*/
private $user;
/**
* @var Department
* @ORM\OneToMany(targetEntity="Department")
*/
private $department;
/**
* @var string
* @ORM\Column(type="string", nullable=true)
*/
private $membership;
public function getId(): Id
{
return $this->id;
}
public function getName(): string
{
return $this->name;
}
public function setName(string $name): Project
{
$this->name = $name;
return $this;
}
public function getStatus(): string
{
return $this->status;
}
public function setStatus(string $status): Project
{
$this->status = $status;
return $this;
}
public function getSort(): int
{
return $this->sort;
}
public function setSort(int $sort): Project
{
$this->sort = $sort;
return $this;
}
public function getUser(): User
{
return $this->user;
}
public function setUser(User $user): Project
{
$this->user = $user;
return $this;
}
public function getDepartment(): Department
{
return $this->department;
}
public function setDepartment(Department $department): Project
{
$this->department = $department;
return $this;
}
public function getMembership(): string
{
return $this->membership;
}
public function setMembership(string $membership): Project
{
$this->membership = $membership;
return $this;
}
}
not nullable тАФ ( false). , тАФ not nullable , ? :)
, тАФ ( ). .
, Doctrine ( ) , Reflection API. Marco Pivetta , :
ocramius.imtqy.com/blog/doctrine-orm-optimization-hydration. .
,
, ( DTO, ..)., , - ┬л┬╗ . , , .
-. ID, тАФ :
$order = $this->orderRepository->find($orderId);
if ($order === null) {
throw new OrderException('Order not found.');
}
if ($order->getStatus() === Order::STATUS_ACTIVE
&& $order->getDeliveryDate() <= $date
) {
$this->orderDeliveryService->handle($order);
}
тАФ , :
$order = $this->orderRepository->find($orderId);
$cityFreeLimit = $this->cityOrderService->getCityFreeLimit($cityName);
if ($order->getCity() === $cityName
&& $order->getTotalPrice() > $cityFreeLimit
) {
$delivery = 0;
$this->orderDeliveryService->deliveryOrder($order, $delivery);
return;
}
//
, - .
, - . , , , . , , , . ┬л┬╗ ┬л┬╗.
/ , , , , ┬л ┬╗ , тАФ , , .
тАФ Symfony (DAO), /. тАФ - ( , ).
, тАФ :)
. тАФ .