좋습니다. 댓글 공간이 너무 작아서 보관하려는 내용에 대한 모든 것을 말할 수 없습니다. 시작 게시물에서 언급 한 모든 단계를 리팩토링합시다. 이것은 우리를 당신의 목표로 이끌 것입니다. 그것은 수분 공급에 관한 것입니다.
이 예제는 제품이 포함 된 주문 엔터티가 어떻게 보이는지를 보여주는 작은 예입니다. 순서 엔티티가 제품 엔티티를 추적 한 후에이 예제에 필요한 엔티티.
namespace Application\Entity;
class Order implements \JsonSerializable
{
/**
* ID of the order
* @var integer
*/
protected $orderID;
/**
* Array of \Application\Entity\Product
* @var array
*/
protected $products;
public function getOrderID() : integer
{
return $this->orderID;
}
public function setOrderID(integer $orderID) : Order
{
$this->orderID = $orderID;
return $this;
}
public function getProducts()
{
if ($this->products == null) {
$this->products = [];
}
return $this->products;
}
public function setProducts(array $products) : Order
{
$this->products = $products;
return $this;
}
/**
* @see \JsonSerializable::jsonSerialize()
*/
public function jsonSerialize()
{
return get_object_vars($this);
}
}
다음 엔터티는 제품을 나타냅니다.
class Product implements \JsonSerializable
{
protected $productID;
protected $name;
public function getProductID() : integer
{
return $this->productID;
}
public function setProductID(integer $productID) : Product
{
$this->productID = $productID;
return $this;
}
public function getName() : string
{
return $this->name;
}
public function setName(string $name) : Product
{
$this->name = $name;
return $this;
}
/**
* @see \JsonSerializable::jsonSerialize()
*/
public function jsonSerialize()
{
return get_object_vars($this);
}
}
위 항목에는 몇 가지 가능한 제품이 포함 된 단일 주문을 나타내는 당사 항목이 있습니다. 두 번째 멤버 제품은 Product 엔터티가있는 배열 일 수 있습니다. 이 엔티티는 간단한 순서의 데이터 구조를 나타냅니다.
이 시점에서이 엔테이트를 포함하는 데이터의 개체로 사용하는 양식이 필요합니다. 우리 양식의 가능한 공장은 이렇게 보일 수 있습니다.
namespace Application\Form\Factory;
class OrderFormFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $serviceLocator)
{
$parentLocator = $serviceLocator->getServiceLocator();
$inputFilter = $parentLocator->get('InputFilterManager')->get(OrderInputFiler::class);
$hydrator = new ClassMethods(false);
$entity = new OrderEntity();
return (new OrderForm())
->setInputFilter($inputFilter)
->setHydrator($hydrator)
->setObject($entity);
}
}
이것은 우리 양식의 공장입니다. 우리는 수화기, 입력 필터 및 형식에 대한 엔티티를 설정합니다. 그래서 당신은 뭔가를 구속하지 않아도됩니다. 다음 코드는이 양식으로 데이터를 처리하는 방법을 보여줍니다.
// retrieve an order from database by id
// This returns a order entity as result
$order = $this->getServiceLocator()->get(OrderTableGateway::class)->fetchById($id);
// Extract the order data from object to array assumed the
// retrieved data from data base is an OrderEntity object
// the hydrator will use the get* methods of the entity and returns an array
$data = (new ClassMethods(false))->extract($order);
// fill the form with the extracted data
$form = $this->getServiceLocator()->get('FormElementManager')->get(OrderForm::class);
$form->setData($data);
if ($form->isValid()) {
// returns a validated order entity
$order = $form->getData();
}
아직 양식의 데이터를 가져올 수 없으며 아직 검증되지 않았습니다. 양식 데이터의 유효성을 검사해야만 양식에서 필터링 된/유효성 검사 된 데이터를 가져올 수 있습니다. 많은 데이터를 처리해야 할 때 수화기 및 엔티티가 도움이 될 것입니다.
마지막 오류 메시지는 setData 메소드로 설정하려는 데이터가 null임을 나타냅니다. 유효성을 검사하기 전에 양식에 데이터를 입력해야합니다. 너의 길을 리팩터링하자. 첫 번째 : 주문 ID를 가져옵니다. 두 번째 : ID로 주문 오브젝트를 가져옵니다. 셋째 : 수화기로 주문 오브젝트의 데이터를 추출하십시오. 넷째, 양식의 setData 메소드를 통해 추출 된 데이터 (배열)를 양식에 제공하십시오. 다섯 번째 : 그것을 확인하십시오. 여섯째 : getData 메소드를 통해 양식의 필터링 된 유효성 검사 데이터를 가져옵니다. 주문 개체를 양식에 직접 바인딩 할 수 없습니다. – Marcel