1.
Как вы могли догадаться, бывает так что клиента в платеже нет. Был удален, например.
нельзя удалить связанные сущности просто так, вы можете пометить клиента как удаленный но удалять не рекомендовал, бы дабы не плодить кучу проверок
2.
public function printCustomerFirstname(Payment $payment)
{
if ($payment->getCustomer()) {
echo $payment->getCustomer()->getFirstname();
}
}
echo в методе в 2018 - неприлично
3. Проверка решается выбросом исключения
public function getCustomerFirstname(): string
{
if(!$this->getCustomer()){
throw new \Exceptions\CustomerNotFound;
}
return $this->getCustomer()->getFirstname();
}
try{
$customerName = $payment->getCustomerFirstname();
}
catch( \Exceptions\CustomerNotFound $ex){
$customerName = null;
}