页面使用的几乎所有 PHP 方法都可以返回响应。这包括所有包含在 布局执行生命周期 和 AJAX 处理器定义 中的 CMS 方法。
从CMS页面、布局或组件方法返回一个字符串,将在此处停止处理并覆盖默认行为,因此它将显示“Hello World”字符串,而不是显示页面。
public function onStart()
{
return 'Hello World';
}从 AJAX 处理程序返回字符串会使用默认键 result 将该字符串添加到响应集合中。请求的分部视图仍将包含在响应中。
public function onDoSomething()
{
return 'Hello World';
// ['result' => 'Hello World']
}从 路由定义 返回字符串将与 CMS 方法具有相同的行为,并将该字符串作为响应显示。
Route::get('/', function() {
return 'Hello World';
});为了更健壮的解决方案,返回一个 Response 对象提供了多种构建 HTTP 响应的方法。我们将在本文中进一步探讨这个主题。
$contents = 'Page not found';
$statusCode = 404;
return Response::make($contents, $statusCode);请记住,大多数响应方法是可链式的,允许流畅地构建响应。例如,您可以使用 header 方法在将响应发送回用户之前,向其添加一系列标头:
return Response::make($content)
->header('Content-Type', $type)
->header('X-Header-One', 'Header Value')
->header('X-Header-Two', 'Header Value');一个这方面的实际例子可能是返回一个 XML 响应:
return Response::make($xmlString)->header('Content-Type', 'text/xml');withCookie 方法允许您轻松地将 Cookie 附加到响应中。例如,您可以使用 withCookie 方法来生成一个 Cookie 并将其附加到响应实例中:
return Response::make($content)->withCookie('name', 'value');该 withCookie 方法接受额外的可选参数,让您可以进一步自定义您的 cookie 属性:
->withCookie($name, $value, $minutes, $path, $domain, $secure, $httpOnly)Response 门面可以用于方便地生成其他类型的响应实例。
如果你需要访问 Response 类的方法,但希望将视图作为响应内容返回,你可以使用 Response::view 方法以方便操作:
return Response::view('acme.blog::hello')->header('Content-Type', $type);该 json 方法将自动把 Content-Type 头设置为 application/json,并使用 json_encode PHP 函数将给定数组转换为 JSON:
return Response::json(['name' => 'Steve', 'state' => 'CA']);如果您想创建一个 JSONP 响应,除了 setCallback 之外,您还可以使用 json 方法:
return Response::json(['name' => 'Steve', 'state' => 'CA'])
->setCallback(Input::get('callback'));download 方法可用于生成一个响应,该响应强制用户的浏览器下载位于给定路径(第一个参数)的文件。download 方法可选地接受一个文件名(第二个参数),该文件名将决定下载文件的用户所看到的文件名,以及一个 HTTP 头数组(第三个参数)。
return Response::download($pathToFile);
return Response::download($pathToFile, $name, $headers);
return Response::download($pathToFile)->deleteFileAfterSend(true);Symfony HttpFoundation(负责管理文件下载)要求被下载的文件具有 ASCII 文件名。
:::
在某些情况下,你可能希望将字符串响应转换为可下载响应,而无需将内容写入磁盘。使用 streamDownload 方法解决此问题,该方法接受一个回调函数(第一个参数)、文件名(第二个参数)以及一个可选的头部数组(第三个参数)。
return Response::streamDownload(function() {
echo 'CSV Contents...';
}, 'export.csv');file 方法用于直接在用户浏览器中显示文件, 例如图片或PDF, 而不是启动下载. 此方法接受文件路径 (第一个参数) 和标头数组 (第二个参数).
return Response::file($pathToFile);
return Response::file($pathToFile, $headers);重定向响应通常是 Illuminate\Http/RedirectResponse 类的实例,并包含将用户重定向到另一个 URL 所需的正确标头。生成 RedirectResponse 实例的最简单方法是使用 Redirect 外观上的 to 方法。
return Redirect::to('user/login');重定向到新的 URL 并且将数据闪存到会话通常同时完成。因此,为了方便起见,您可以创建一个 RedirectResponse 实例并将数据闪存到会话通过单个方法链:
return Redirect::to('user/login')->with('message', 'Login Failed');由于
with方法将数据闪存到会话中,你可以使用典型的Session::get方法来检索这些数据。
您可能希望将用户重定向到他们之前的位置,例如,在表单提交后。您可以通过使用 back 方法来实现:
return Redirect::back();
return Redirect::back()->withInput();有时你可能只是想刷新当前页面,你可以使用 refresh 方法来完成:
return Redirect::refresh();如果您想定义一个自定义响应,以便您可以在各种路由和控制器中重复使用,您可以使用 Response::macro 方法:
Response::macro('caps', function($value) {
return Response::make(strtoupper($value));
});macro 函数接受一个名称作为其第一个参数,以及一个闭包作为其第二个参数。当在 Response 类上调用该宏名称时,该宏的闭包将会被执行:
return Response::caps('foo');您可以在 插件注册文件 的 boot 方法中定义宏。或者,插件可以在插件目录中提供一个名为 init.php 的文件,您可以使用该文件来放置宏注册。
视图是存储基于系统的演示逻辑(例如API或端点使用的标记,或与CMS和后端区域共享的标记)的好方法。视图也由邮件服务用于提供默认模板内容。视图通常存储在插件的views目录中。
一个简单的视图可能看起来像这样:
<!-- View stored in plugins/acme/blog/views/greeting.htm -->
<html>
<body>
<h1>Hello, {{ name }}</h1>
</body>
</html>视图也可以使用 PHP 模板进行解析,通过使用 .php 扩展名:
<!-- View stored in plugins/acme/blog/views/greeting.php -->
<html>
<body>
<h1>Hello, <?= $name ?></h1>
</body>
</html>此视图可以使用 View::make 方法返回给浏览器:
return View::make('acme.blog::greeting', ['name' => 'Charlie']);第一个参数是一个“路径提示”,包含插件名称,由两个冒号 ::, 后跟视图文件名。传递给 View::make 的第二个参数是一个应该对视图可用的数据数组。
路径提示区分大小写,且插件名称应始终为小写。
// Using conventional approach
$view = View::make('acme.blog::greeting')->with('name', 'Steve');
// Using magic methods
$view = View::make('acme.blog::greeting')->withName('steve');在上面的示例中,变量 name 将可以从视图中访问,并且将包含 Steve。如上所述,如果您想传递一个数据数组,您可以将其作为传递给 make 方法的第二个参数:
$view = View::make('acme.blog::greeting', $data);也可以在所有视图之间共享一份数据:
View::share('name', 'Steve');有时您可能希望将一个视图传递给另一个视图。例如,给定一个子视图存储在 plugins/acme/blog/views/child/view.php,我们可以像这样将其传递给另一个视图:
$view = View::make('acme.blog::greeting')->nest('child', 'acme.blog::child.view');
$view = View::make('acme.blog::greeting')->nest('child', 'acme.blog::child.view', $data);子视图随后可以从父视图渲染:
<html>
<body>
<h1>Hello!</h1>
{{ child|raw }}
</body>
</html>如果您需要检查视图是否存在,请使用 View::exists 方法:
if (View::exists('acme.blog::mail.customer')) {
//
}