Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Всем привет.
Копаю такой код контроллера:
$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] =>
)
Не в сети
$news->getAttributes()
Почему не работает ->attributes? Потому что attributes:protected
Изменено AlexeyMezenin (16.11.2016 19:04:24)
Не в сети
Но каким образом тогда работает {{$news->title}} в модели? title вообще не объявлена у объекта $news.
Изменено L_E_L_I_K (16.11.2016 19:34:49)
Не в сети
Но каким образом тогда работает {{$news->title}} в модели? title вообще не объявлена у объекта $news.
Не в сети
Он не вызывается ни в контроллере, ни во view. Мы просто обращаемся к {{$news->title}} и он выводится. Геттеров нет. Вообще никаких предобработок нет. Во вью передаем просто
return view('frontend.public.news', compact('news'));
Не в сети
Не в сети
В NewsModel геттеров может и нет, но он то наследуется от Illuminate\Database\Eloquent\Model, который имеет геттер, ссылку на который Вам дали выше.
Не в сети
Кажется, более-менее разобрался. Тогда как мне решить мою задачу и изменить свойство title новости {{$news->title}} перед тем, как его отправить во view?
Изменено L_E_L_I_K (16.11.2016 21:35:58)
Не в сети
А, нет. Не разобрался.
если я в контроллере ставлю
$news = NewsModel::orderBy('date','desc')->paginate(20);
echo $news->title
, то он выводит пусто. Этот "неявный" геттер не срабатывает.
Изменено L_E_L_I_K (16.11.2016 21:39:28)
Не в сети
Так так получите коллекцию, а не конкретную модель. Нужно в цикле перебрать их и выводить для каждой title.
Не в сети
Страницы 1