Laravel模板引用$this时莫名输出对象内容的问题
这种每次引用$this就自动输出对象的情况,90%是你的Template模型类里的魔术方法写崩了,或者render()方法里有隐性触发对象输出的代码,不用输出缓冲也能搞定,按下面的步骤查:
先查
Template类的__toString()方法
Laravel模型默认的__toString()是返回JSON字符串,但如果你重写了这个方法,比如加了var_dump($this)或者echo $this,那只要$this被放到字符串上下文(比如拼接、echo)就会触发输出。比如你可能写了:public function __toString() { var_dump($this); // 就是这句搞的鬼 return $this->body; }把输出语句删掉就行,改成正常返回字符串。
再查
__call()、__get()这类魔术方法
如果someEmptyFunc()的定义有问题(比如拼写错、权限不对),会触发__call(),要是你在__call()里写了输出$this的代码,调用方法时就会直接输出对象。比如:public function __call($method, $args) { echo $this; // 这里是罪魁祸首 // 其他逻辑 }删掉多余的输出语句。
检查
render()方法的代码细节
看看有没有在调用$this->someEmptyFunc()前后,不小心把$this和字符串拼接了,比如$html = "<div>" . $this . "</div>",这会触发__toString();或者有没有误写了echo $this、print_r($this)这类语句,直接删掉就行。最后查自定义Traits
要是你的Template类用了自己写的Traits,看看Traits里的方法有没有在访问属性/方法时输出对象的逻辑,把输出语句去掉。
比如正常的render()方法应该是这样的:
public function render() { $this->someEmptyFunc(); // 空方法,不输出任何内容 return "<div>你的HTML内容</div>"; }
内容的提问来源于stack exchange,提问作者xtay2

