Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 16.11.2016 18:55:05

Передача модели во view

Всем привет.

Копаю такой код контроллера:

$news = NewsModel::find($id);
return view('frontend.public.news', compact('news'));

В самой view обращение идет сразу к {{$news->id}}, {{$news->title}} и так далее. Но, если посмотреть print_r($news); в контроллере, то увидим многоуровневую структуру объектов (см в конце). Вот такие вопросы:

1. Почему не работает print_r($news->attributes);? Ведь attributes - это свойство объекта $news и является массивом (см в конце)
2. Каким образом view понимает, что {{$new->title}} - это именно значение title? Ведь это свойство вложенное и, по идее, до него надо добираться, как {{$new->print_r($news->attributes["title"]);}}, если верить структуре (см в конце)

А вот и то, куда я ссылаюсь. Это то, что выдает print_r($news);

App\Models\NewsModel Object
(
    [primaryKey:protected] => id
    [table:protected] => news
    [timestamps] => 
    [fillable:protected] => Array
        (
            [0] => name
            [1] => text
            [2] => foto
            [3] => date
            [4] => display_photo
        )

    [connection:protected] => 
    [keyType:protected] => int
    [perPage:protected] => 15
    [incrementing] => 1
    [attributes:protected] => Array
        (
            [name] => День семьи, любви и верности 
            [text] => <p>В этот день все жители Республики....</p>
            [foto] => 
            [date] => 2016-07-08 00:00:00
            [id] => 170
            [display_photo] => 
        )

    [original:protected] => Array
        (
            [name] => День семьи, любви и верности 
            [text] => <p>В этот день все жители Республики проходили квест "Собери букет", отгадывая загадки, находили элементы флористического декора для оформления своих праздничных букетов. Вечером, каждый город вручал свои букеты</p>
            [foto] => 
            [date] => 2016-07-08 00:00:00
            [id] => 170
            [display_photo] => 
        )

    [relations:protected] => Array
        (
        )

    [hidden:protected] => Array
        (
        )

    [visible:protected] => Array
        (
        )

    [appends:protected] => Array
        (
        )

    [guarded:protected] => Array
        (
            [0] => *
        )

    [dates:protected] => Array
        (
        )

    [dateFormat:protected] => 
    [casts:protected] => Array
        (
        )

    [touches:protected] => Array
        (
        )

    [observables:protected] => Array
        (
        )

    [with:protected] => Array
        (
        )

    [morphClass:protected] => 
    [exists] => 1
    [wasRecentlyCreated] => 
)

Не в сети

#2 16.11.2016 19:02:37

Re: Передача модели во view

$news->getAttributes()

Почему не работает ->attributes? Потому что attributes:protected

Изменено AlexeyMezenin (16.11.2016 19:04:24)

Не в сети

#3 16.11.2016 19:34:16

Re: Передача модели во view

Но каким образом тогда работает {{$news->title}} в модели? title вообще не объявлена у объекта $news.

Изменено L_E_L_I_K (16.11.2016 19:34:49)

Не в сети

#4 16.11.2016 20:15:06

Re: Передача модели во view

L_E_L_I_K пишет:

Но каким образом тогда работает {{$news->title}} в модели? title вообще не объявлена у объекта $news.

__get()

Не в сети

#5 16.11.2016 20:18:15

Re: Передача модели во view

Он не вызывается ни в контроллере, ни во view. Мы просто обращаемся к {{$news->title}} и он выводится. Геттеров нет. Вообще никаких предобработок нет. Во вью передаем просто

return view('frontend.public.news', compact('news'));

Не в сети

#6 16.11.2016 20:20:59

#7 16.11.2016 20:21:33

Re: Передача модели во view

В NewsModel геттеров может и нет, но он то наследуется от Illuminate\Database\Eloquent\Model,  который имеет геттер, ссылку на который Вам дали выше.

Не в сети

#8 16.11.2016 21:35:47

Re: Передача модели во view

Кажется, более-менее разобрался. Тогда как мне решить мою задачу и изменить свойство title новости {{$news->title}} перед тем, как его отправить во view?

Изменено L_E_L_I_K (16.11.2016 21:35:58)

Не в сети

#9 16.11.2016 21:39:01

Re: Передача модели во view

А, нет. Не разобрался.
если я в контроллере ставлю

$news = NewsModel::orderBy('date','desc')->paginate(20);
echo $news->title

, то он выводит пусто. Этот "неявный" геттер не срабатывает.

Изменено L_E_L_I_K (16.11.2016 21:39:28)

Не в сети

#10 16.11.2016 21:45:24

Re: Передача модели во view

Так так получите коллекцию, а не конкретную модель. Нужно в цикле перебрать их и выводить для каждой title.

Не в сети

Подвал раздела