#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);
}