Я немного запутался в том, как работать с View Composers в Laravel, и подумал, что могу попросить совета.

Например, на моем веб-сайте есть планы, в таблице планов у меня есть обычный идентификатор и т. Д., Но у меня также есть 'space_allowed', который представляет мой номер, я представил 'unlimited' как NULL, так что мне не нужно менять какие-либо из моих (количество) функций.

Итак, в моем контроллере у меня что-то вроде этого

$plans = Plan::where('is_active', 1)->get();
return view('pricing', ['plans' => $plans]);

Теперь, когда я нахожусь на виду, я просто @foreach перебираю планы и выкладываю детали.

НО, поскольку я храню «неограниченное» пространство как NULL, представление отражает это.

Итак, я полагаю, что, поскольку я буду ссылаться на это по всему сайту, было бы неплохо проверить, равно ли значение null, и если это так, вместо этого вернуть 'unlimited', а если значение не равно null, просто плюнуть на него как обычно в одном месте.

Отсюда идея для композитора представления.

Итак, я создал ComposerServiceProvider.php, добавил методы загрузки и регистрации, а внутри метода загрузки у меня есть следующее:

View::composer('*', function ($view) {
});

Думаю, я почти у цели.

Но я потерялся в том, как реализовать код, который входит в это закрытие, чтобы проверить, имеет ли storage_allowed значение null.

Любая помощь будет принята с благодарностью.

1
BigJobbies 6 Сен 2016 в 09:02

3 ответа

Лучший ответ

Вы можете сделать это в компоновщике представлений, только скопировав большое количество данных, поэтому просто выполните эту проверку в шаблоне Blade:

@foreach ($plans as $plan)
    ....
    {{ empty($plan->space) ? 'Unlimited' : $plan->space }}
    ....
@endforeach
2
Alexey Mezenin 6 Сен 2016 в 06:08

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

class Plan extends Model {

    public function getSpaceNiceAttribute(){
        return is_null($this->space) ? 'Unlimited' : $this->space;
    }

}

Тогда в своем шаблоне вы можете просто использовать {{ $plan->space_nice }}

Преимущество этого метода заключается в том, что он сохраняет согласованность вывода везде, где вам нужна эта логика, а не реплицирует ее повсюду в ваших шаблонах, и позволяет использовать больше условных выражений (например, если вы хотите отображать «нет» вместо «0», вы можете сделать только в этой функции, и все ваши шаблоны будут это отражать).

2
Hailwood 6 Сен 2016 в 22:39

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

public function compose(View $view)
{
    $page = $view->getData()['page'];
    $data = ['menu' => $this->generateSideBarHTML($page)];
    $view->with($data);
}

Теперь вы можете получить доступ к меню $ из вашего шаблона лезвия. Для вашего примера это будет примерно так:

public function compose(View $view)
{
    $plans = $view->getData()['plans'];
    //Iterate on the plans here...
    $view->with($data);
}
0
bytesarelife 21 Сен 2016 в 12:28