2014-09-25 2 views
0

Я смотрю на документы Laravel, и я вижу этот фрагмент:PHP/Laravel magic, как это работает?

class UserController extends BaseController { 

    /** 
    * The layout that should be used for responses. 
    */ 
    protected $layout = 'layouts.master'; 

    /** 
    * Show the user profile. 
    */ 
    public function showProfile() 
    { 
     $this->layout->content = View::make('user.profile'); 
    } 

} 

мы можем ясно видеть, что $ this-> раскладка = «layouts.master». Тем не менее, они определяют ребенка объекта макета (который, как я понимаю, это только база PHP строка, и не имеет поле, называемое содержание, через ...

$this->layout->content = View::make('user.profile');

  1. Как может строку определило поле, называемое содержанием

  2. , когда я подкласс BaseController и попытаться присвоить значение $ this-> layout-> содержание, почему я получаю следующее сообщение об ошибке: «попытка присвоить свойство не-объект "?

+0

Этот фрагмент не будет работать сам по себе. Либо другой класс изменяет '$ layout' (через метод setter), либо фрагмент просто ошибочен. Ссылка на документы, где вы это нашли? – 0b10011

+2

http://laravel.com/docs/master/templates - это документы, на которые он ссылается. – mschuett

ответ

6

Почему бы не посмотреть на BaseController? Похоже, они меняют $this->layout.

https://github.com/laravel/laravel/blob/master/app/controllers/BaseController.php

<?php 

class BaseController extends Controller { 

    /** 
    * Setup the layout used by the controller. 
    * 
    * @return void 
    */ 
    protected function setupLayout() 
    { 
     if (! is_null($this->layout)) 
     { 
      $this->layout = View::make($this->layout); 
     } 
    } 

} 

Мой совет, если вы используете PHP рамки, не бойтесь, чтобы проверить его источник, когда вы не понимаете, почему это работает. Существует, как правило, гораздо меньше «магии», чем вы думаете ...

IMO, это, похоже, плохой дизайн, чтобы инициализировать переменную как строку, а затем изменить ее как некоторый объект. Вид просто злоупотребляет свободным набором текста.

+1

+1 для обоих "* проверьте его источник *" и "* плохой дизайн *". – DCoder

+0

Я бы не зашел так далеко, как плохой дизайн. Это очень запутанно на первый взгляд, но это очень простое решение. Вы можете просто изменить защищенный $ layout = 'layouts.master'; для защищенного $ view = 'layouts.master'; и проверка - это не значение null в setupLayout. Плохой дизайн для меня был бы, если бы им было очень сложно это изменить. – mschuett

+2

@mschuett, да, вы можете изменить его, и это, вероятно, будет хорошим дизайном (по крайней мере, лучше). Но так оно и есть, это опубликованная структура и была спроектирована и задокументирована в замешательстве. Но мы просто спорим об определении «дизайн», я думаю, мы согласны с тем, что он должен быть другим. – Matt