2016-12-15 3 views
2

Я пишу некоторые шаблоны Blade Laravel, и у меня есть модели, которые могут иметь нулевые объекты. Я бы очень хотел просто попробовать и получить свойство объекта, и если есть ошибка, просто верните null.Laravel Blade шаблон как вернуть null вместо ErrorException при попытке получить свойство не-объекта

Таким образом, вместо того, чтобы написать это:

@if ($model->child_object_that_may_be_null) 
    {{ $model->child_object_that_may_be_null->interesting_property }} 
@endif 

Я мог бы просто написать это:

{{ $model->child_object_that_may_be_null->interesting_property }} 

и если дочерний объект имеет нулевое значение, то результат имеет значение нуль.

Я хочу делать это только с помощью своих шаблонов клинков, а не везде в приложении (например, я бы хотел получить ошибку в контроллерах).

Есть ли простой способ достичь этого? Я также действительно не хочу, чтобы каждый раз пытаться/улавливать исключение в шаблонах клинков.

В принципе, я пытаюсь сделать шаблоны клинков проще/короче, когда мне неважно, что у меня есть null, если он равен нулю, то его несуществующее свойство должно быть равно null также для рендеринга часть.

+1

Вы можете использовать тернар, это то, что я обычно делаю, и включить его все в одном '{{}}' vs, используя блок @ @ if – Pitchinnate

+0

@Pitchinnate, да, это немного короче, но я все еще нужно написать условие. Я ленив и не хочу вообще проверять :-) –

+1

В PHP 7 используйте '??' оператор; '{{$ model-> свойство ?? 'default'}} ' – Kyslik

ответ

4

Вы можете использовать array_get как:

{{ array_get($model, 'child_object_that_may_be_null.interesting_property') }} 

array_get функция возвращает значение из глубоко вложенного массива, используя «точечную» нотацию.

Примечания - Это может работать только с моделью Laravel в объекты

+1

Отлично, именно то, что я искал! –

1

Вы можете проверить обнуляемые значения в объекте и инициализировать их StdClass.

$properties = get_object_vars($model); 
foreach ($properties as $k => $v) { 
    if ($v === null) $model->$k = new stdClass; 
} 
1

Я все время укусаюсь этим. Я начал добавлять аксессоры displayAttribute на свои объекты, когда я знаю, что у них будет такой вид отображения данных. Особенно полезно, когда речь идет о датах или нескольких уровнях отношений.

Так что, если у меня есть модель обслуживания, связанная с контрактом, и у этого контракта есть start_date, я хочу отобразить, я добавлю getDisplayContractStartDateAttribute в мою модель обслуживания и сделаю там чек. Таким образом, я также могу выбрать отображение сообщения, если нет контракта. Как так:

public function getDisplayContractStartDateAttribute(){ 
    if ($this->contract && $this->contract->starts_at){ 
     return $this->contract->starts_at->format('m/d/Y @ g:i a'); 
    } else { 
     return 'Start date or contract missing'; 
    } 
} 

Так что теперь где-нибудь в моих шаблонах Клинка, я могу получить доступ $service->displayContractStartDate без страха бросить эту ужасную ошибку.

Если вы беспокоитесь о том, чтобы слишком сильно расширить свои модели с помощью этих методов, не связанных с базой данных, рассмотрите возможность использования Trait, чтобы содержать все наши методы displayAttribute для данной модели.

Или, если вас беспокоит разделение проблем, вы можете использовать декоратор и получить доступ к нему как $service->decorator->contractStartDate(), но я лично считаю, что это слишком запутанно.

+0

Мне это нравится! Мне также пришлось обернуть формат ->, как вы показали (поскольку это очень распространенная вещь, чтобы показывать даты вещей). Я склонялся к подходу «жирной модели», поэтому я думаю, что могу следовать этому шаблону за атрибуты, которые, как я знаю, я хочу отображать на клинке. Если он был назван 'getFormattedContractStartDate', то я думаю, что он все еще достаточно общий, чтобы быть в модели (в основном модель возвращает строковый атрибут). Благодаря! –