Преобразуйте массив объектов в массив DTO

#php #symfony

Вопрос:

В настоящее время я работаю над проектом HMS (Система управления гостиницей). В настоящее время я застрял в реализации функциональности на основе DTO в Symfony 5. Ниже приведено мое HotelMapper.php файл, в котором я хотел бы создать метод, который преобразует массив отелей в массив DTO, чтобы позже я мог передать их в контроллер отеля, и для этого я хотел бы использовать объекты из dtoToHotel() функции. Я уже создал DTO (сеттеры и геттеры).

 
namespace AppTransformer;

use AppDTOHotelDTO;
use AppEntityHotelEntity;

class HotelMapper
{
    public $hotel;
    public function dtoToHotel(HotelDTO $hotelDTO, Hotel $hotel) : HotelEntity
    {
        $hotel->setId($hotelDTO->getId());
        $hotel->setName($hotelDTO->getName());
        $hotel->setLocation($hotelDTO->getLocation());
        $hotel->setEmployees($hotelDTO->getEmployees());
        $hotel->setAvailability($hotelDTO->getAvailability());
        $hotel->setFacility($hotelDTO->getFacility());
        $hotel->setPhoto($hotelDTO->getPhoto());
        $hotel->setDescription($hotelDTO->getDescription());
        $hotel->setEarnings($hotelDTO->getEarnings());
    }

    public function hotelToDto(HotelEntity $hotel)
    {
        return HotelDTO(
          $hotel->getId(),
          $hotel->getName(),
          $hotel->getLocation(),
          $hotel->getEmployees(),
          $hotel->getAvailability(),
          $hotel->getFacility(),
          $hotel->getPhoto(),
          $hotel->getDescription(),
          $hotel->getEarnings()
        );
    }
    
    public function transformHotelsArrayToDTO()
    {
        /* Code here */
    }
} 
 

Код ниже-это мой контроллер HotelController, в котором я хотел бы обновить следующую строку $hotels = $this->hotelRepository->findAll() внутри showAllHotels() функции, передав здесь DTO. Любая помощь будет очень признательна!

 class HotelController extends AbstractController
{
    /**
     * @var HotelRepository
     */
    public $hotelRepository;

    public function __construct(HotelRepository $hotelRepository)
    {
        $this->hotelRepository = $hotelRepository;
    }

    /**
     * @Route (path="/", methods={"GET"})
     */
    public function index(): Response
    {
        return $this->render('index/index.html.twig');
    }

    /**
     * @Route (path="/hotel-management", methods={"GET"})
     */
    // It does populate the table with the hotels from the DB
    public function showAllHotels(): Response
    {
        $hotels = $this->hotelRepository->findAll();

        return $this->render('hotel-management/hotel-management.html.twig', array('hotels' => $hotels));
    } 
} 
 

Ответ №1:

Вставьте трансформатор HotelMapper в свой контроллер, а затем передайте результат findAll этой функции:

 public function transformHotelsArrayToDTO(array $items): array
{
    if (empty($items) or is_null($items)) {
        return [];
    }

    return array_map([$this, 'hotelToDto'], $items);
}