请原谅我不知道我所要求的术语是什么。我不太知道你会怎么称呼它,所以请耐心等待。
在 Laravel 4 或 5 中,有没有办法为雄辩模型设置默认模板?很长一段时间以来,我一直在写这样的台词:(仅以书籍系统为例)
$book = Sentry::getUser()->books()->find(14);
return View::make( "books.show" )->withBook($book);
有什么方法可以让return $book;
扩展到return View::make( "books.show" )->withBook($book);
?
你问的很有道理。然而,它并不符合拉拉维尔的世界观——所以请记住,你有点像自己出击。
当你
return View::make( "books.show" )->withBook($book);
从路由关闭或控制器操作中,Laravel将返回的任何内容视为视图。 这包括常规字符串 - 即,您可以执行类似操作
return '<p>Foo</p>';
Laravel将渲染HTML片段。
如果你尝试使用常规的PHP对象,
$o = SomeObject;
return $o;
你会看到这样的错误
响应内容必须是实现给定的 __toString() "对象"的字符串或对象。
发生此错误是因为Laravel尝试将返回的对象视为字符串,并且PHP没有将对象呈现为字符串的默认方式。
PHP确实有一种方法,让你(程序员)告诉它(PHP)如果某些代码(Laravel)将对象视为字符串,PHP应该如何呈现该对象。如果将 __toString
方法添加到任何对象,则 PHP 将使用此方法为对象呈现字符串。 尝试以下小程序
<?php
class SomeObject
{
public function __toString()
{
return 'I am a rendered SomeObject';
}
}
$object = SomeObject;
// cast the object as a string ("treat" above)
echo (string) $object;
所以 -- 这意味着你可以在任何对象中嵌入渲染视图的逻辑。 假设您的图书类名为 Book
,请尝试以下操作
class Book
{
//...
public function __toString()
{
return View::make( "books.show" )->withBook($this);
}
}
然后在路由关闭/控制器操作中
$book = Sentry::getUser()->books()->find(14);
return $book;
要记住的一件事 - 由于只能有一个__toString
定义,如果你正在扩展实现__toString
的类,你可能会破坏其他人的功能。 为了避免这种情况,请尝试使用某种条件渲染。
希望对您有所帮助!
更新。 根据下面的评论。我不能与接受标头交谈,尽管我的直觉说Laravel不会这样做,因为PHP中没有查看接受标头的文化。 我可能是错的。 至于自己在__toString
中使用它,我也会否认这一点——如果用户在接受 JSON 请求期间使用您的对象,但由于某种原因需要将其呈现为非 JSON 字符串,您的代码会干扰它。 最好为您提供对象呈现上下文,然后呈现对象的人选择它在路由闭包、控制器操作或呈现方法本身的"IoCrewrite"中的呈现方式。