Laravel 4 / 5:使`return Model`自动使用HTML视图
Posted
技术标签:
【中文标题】Laravel 4 / 5:使`return Model`自动使用HTML视图【英文标题】:Laravel 4 / 5: Make `return Model` automatically use HTML view 【发布时间】:2015-03-14 16:37:48 【问题描述】:请原谅我不知道我所要求的术语是什么。我不太清楚你会怎么称呼它,所以请耐心等待。
在 Laravel 4 或 5 中,有没有办法为 Eloquent 模型设置默认模板?很长一段时间,我一直在写这样的行:(仅以书本系统为例)
$book = Sentry::getUser()->books()->find(14);
return View::make( "books.show" )->withBook($book);
有什么方法可以让return $book;
扩展为return View::make( "books.show" )->withBook($book);
?
【问题讨论】:
假设这是可能的。但是 laravel 将如何知道您是返回一个变量还是返回整个模板?您需要调整大量核心文件才能使其正常工作。 【参考方案1】:你问的有道理。然而,它并不真正符合 Laravel 的世界观——所以请记住,你有点靠自己。
当你
return View::make( "books.show" )->withBook($book);
从路由闭包或控制器动作中,Laravel 将返回的 anything 视为视图。这包括常规字符串——也就是说,你可以做类似的事情
return '<p>Foo</p>';
Laravel 会渲染 html 片段。
如果您尝试使用常规 php 对象,
$o = SomeObject;
return $o;
你会看到类似这样的错误
响应内容必须是实现__toString()的字符串或对象,“object”给定。
出现这个错误是因为 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
的类,您可能会破坏其他人的功能。为避免这种情况,请尝试使用某种条件渲染。
希望有帮助!
更新。根据下面的 cmets。我无法对 Accepts 标头说话,尽管我的直觉认为 Laravel 不会这样做,因为 PHP 中没有查看 Accepts 标头的文化。我可能是错的。至于在__toString
中自己使用它,我也不会这样做——如果用户在接受 JSON 请求期间使用您的对象,但由于某种原因需要将其呈现为非 JSON 字符串,您的代码会干扰接着就,随即。最好给你对象渲染上下文,然后渲染你的对象的人选择它在路由关闭、控制器操作或渲染方法本身的“IoCrewrite”中的渲染方式。
【讨论】:
这很酷。出于某种原因,我认为 Laravel 会查看Accepts
标头并自动确定要返回的内容,无论是 JSON 还是视图对象。看到你有很多经验,你认为只有在正确的Accepts
标头存在的情况下,覆盖__toString()
方法是否安全?
@Goldentoa11 更新了问题,增加了一些想法。祝你好运!以上是关于Laravel 4 / 5:使`return Model`自动使用HTML视图的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5.4 - 如何在 javascript 加载之前使 @section 屈服