视图和响应

基础响应

可以从页面使用的几乎PHP方法返回响应。 这包括布局执行生命周期AJAX处理程序定义中包含的所有CMS方法。

从CMS方法返回字符串

从CMS页面返回字符串,布局或组件方法将暂停此过程并覆盖默认行为,因此它将显示“Hello World”字符串而不是显示页面。

  1. public function onStart()
  2. {
  3. return 'Hello World';
  4. }

从AJAX处理程序返回字符串

从AJAX处理程序返回一个字符串将使用默认键result将该字符串添加到响应集合中。 请求的部分内容仍将包含在回复中。

  1. public function onDoSomething()
  2. {
  3. return 'Hello World';
  4. // ['result' => 'Hello World']
  5. }

从路由返回字符串

路由定义 返回字符串将与CMS方法相同,并将字符串显示为响应。

  1. Route::get('/', function() {
  2. return 'Hello World';
  3. });

创建自定义响应

对于更强大的解决方案,返回一个Response对象,提供构建HTTP响应的各种方法。 我们将在本文中进一步探讨此主题。

  1. $contents = 'Page not found';
  2. $statusCode = 404;
  3. return Response::make($contents, $statusCode);

将标题附加到响应

请记住,大多数响应方法都是可链接的,可以流畅地构建响应。 例如,您可以使用header方法向响应添加一系列标头,然后再将其发送回用户:

  1. return Response::make($content)
  2. ->header('Content-Type', $type)
  3. ->header('X-Header-One', 'Header Value')
  4. ->header('X-Header-Two', 'Header Value');

一个实际的例子可能是返回XML响应:

  1. return Response::make($xmlString)->header('Content-Type', 'text/xml');

将cookie附加到响应中

withCookie方法允许您轻松地将cookie附加到响应中。 例如,您可以使用withCookie方法生成cookie并将其附加到响应实例:

  1. return Response::make($content)->withCookie('name', 'value');

withCookie方法接受其他可选参数,允许您进一步自定义cookie的属性:

  1. ->withCookie($name, $value, $minutes, $path, $domain, $secure, $httpOnly)

其他响应类型

Responsefacade可用于方便地生成其他类型的响应实例。

视图响应

如果您需要访问Response类方法,但想要返回view作为响应内容,为方便起见,您可以使用Response::view方法:

  1. return Response::view('acme.blog::hello')->header('Content-Type', $type);

JSON响应

json方法会自动将Content-Type头设置为application/json,并使用json_encode PHP函数将给定的数组转换为JSON:

  1. return Response::json(['name' => 'Steve', 'state' => 'CA']);

如果您想创建一个JSONP响应,除了setCallback之外,您可以使用json方法:

  1. return Response::json(['name' => 'Steve', 'state' => 'CA'])
  2. ->setCallback(Input::get('callback'));

文件下载

download方法可用于生成强制用户浏览器在给定路径下载文件的响应。 download方法接受文件名作为方法的第二个参数,这将确定下载文件的用户看到的文件名。 最后,您可以将HTTP标头数组作为方法的第三个参数传递:

  1. return Response::download($pathToFile);
  2. return Response::download($pathToFile, $name, $headers);
  3. return Response::download($pathToFile)->deleteFileAfterSend(true);

注意: 管理文件下载的Symfony HttpFoundation要求下载的文件具有ASCII文件名。

重定向

重定向响应通常是Illuminate\Http\RedirectResponse类的实例,并包含将用户重定向到另一个URL所需的正确标头。 生成RedirectResponse实例的最简单方法是在Redirect外观上使用to方法。

  1. return Redirect::to('user/login');

返回带有Flash数据的重定向

重定向到新URL和向会话flash数据通常是同时完成的。 因此,为方便起见,您可以在单个方法链中创建一个RedirectResponse实例并将数据闪存到会话中:

  1. return Redirect::to('user/login')->with('message', 'Login Failed');

注意: 由于with方法将数据\到会话,您可以使用典型的Session::get方法检索数据。

重定向到以前的URL

您可能希望将用户重定向到之前的位置,例如,在表单提交后。 您可以使用back方法执行此操作:

  1. return Redirect::back();
  2. return Redirect::back()->withInput();

重定向到当前页面

有时您只想刷新当前页面,可以使用refresh方法执行此操作:

  1. return Redirect::refresh();

响应宏

如果您想定义一个可以在各种路由和控制器中重用的自定义响应,可以使用Response::macro方法:

  1. Response::macro('caps', function($value) {
  2. return Response::make(strtoupper($value));
  3. });

macro函数接受一个名字作为它的第一个参数,一个Closure作为它的第二个参数。 当调用Response类上的宏名时,将执行宏的Closure:

  1. return Response::caps('foo');

您可以在[插件注册文件]的boot方法中定义您的宏(plugin-registration.md#registration-methods)。 或者,插件可以在插件目录中提供名为init.php的文件,您可以使用该文件来放置宏注册。

视图

视图是存储基于系统的表示逻辑的好方法,例如API或端点使用的标记,或与CMS和后端区域共享的标记。 邮件服务 也使用视图来提供默认模板内容。 视图通常存储在插件的views目录中。

一个简单的视图可能看起来像这样:

  1. <!-- View stored in plugins/acme/blog/views/greeting.htm -->
  2. <html>
  3. <body>
  4. <h1>Hello, {{ name }}</h1>
  5. </body>
  6. </html>

也可以使用PHP模板通过使用.php扩展来解析视图:

  1. <!-- View stored in plugins/acme/blog/views/greeting.php -->
  2. <html>
  3. <body>
  4. <h1>Hello, <?php echo $name; ?></h1>
  5. </body>
  6. </html>

可以使用View::make方法将此视图返回给浏览器:

  1. return View::make('acme.blog::greeting', ['name' => 'Charlie']);

第一个参数是一个“路径提示”,它包含插件名称,由两个冒号::分隔,后跟视图文件名。 传递给View::make的第二个参数是应该可供视图使用的数据数组。

注意: 路径提示区分大小写,插件名称应始终为小写。

将数据传递给视图

  1. // 使用传统方法
  2. $view = View::make('acme.blog::greeting')->with('name', 'Steve');
  3. // 使用魔术方法
  4. $view = View::make('acme.blog::greeting')->withName('steve');

在上面的例子中,变量name可以从视图中访问,并且包含Steve。 如上所述,如果要传递数据数组,可以将第二个参数作为make方法:

  1. $view = View::make('acme.blog::greeting', $data);

还可以跨所有视图共享一段数据:

  1. View::share('name', 'Steve');

将子视图传递给视图

有时您可能希望将视图传递到另一个视图。 例如,给定存储在plugins/acme/blog/views/child/view.php的子视图,我们可以将它传递给另一个视图,如下所示:

  1. $view = View::make('acme.blog::greeting')->nest('child', 'acme.blog::child.view');
  2. $view = View::make('acme.blog::greeting')->nest('child', 'acme.blog::child.view', $data);

然后可以从父视图呈现子视图:

  1. <html>
  2. <body>
  3. <h1>Hello!</h1>
  4. {{ child|raw }}
  5. </body>
  6. </html>

确定视图是否存在

如果需要检查视图是否存在,请使用View::exists方法:

  1. if (View::exists('acme.blog::mail.customer')) {
  2. //
  3. }