控制器

新建控制器文件 app\controller\Foo.php

  1. <?php
  2. namespace app\controller;
  3. use support\Request;
  4. class Foo
  5. {
  6. public function index(Request $request)
  7. {
  8. return response('hello index');
  9. }
  10. public function hello(Request $request)
  11. {
  12. return response('hello webman');
  13. }
  14. }

当访问 http://127.0.0.1:8787/foo 时,页面返回 hello index

当访问 http://127.0.0.1:8787/foo/hello 时,页面返回 hello webman

当然你可以通过路由配置来更改路由规则,参见路由

说明

  • 框架会自动向控制器传递support\Request 对象,通过它可以获取用户输入数据(get post header cookie等数据),参见请求
  • 控制器里可以返回数字、字符串或者support\Response 对象,但是不能返回其它类型的数据。
  • support\Response 对象可以通过response() json() xml() jsonp() redirect()等助手函数创建。

控制器后缀

webman支持设置控制器后缀,这可以避免控制器和模型命名会冲突。例如在config/app.php中设置controller_suffixController时Foo控制器文件及内容类似如下(key controller_suffix不存在时请自行创建)。

控制器文件 app\controller\FooController.php

  1. <?php
  2. namespace app\controller;
  3. use support\Request;
  4. class FooController
  5. {
  6. public function index(Request $request)
  7. {
  8. return response('hello index');
  9. }
  10. public function hello(Request $request)
  11. {
  12. return response('hello webman');
  13. }
  14. }

注意 此特性需要webman>=1.3

控制器生命周期

webman控制器一旦初始化便常驻内存,后面的请求会复用它。

当然我们可以选择不复用控制器,这时候我们需要给config/app.php增加一个'controller_reuse' => false的配置。

不复用控制器时,每个请求都会重新初始化一个新的控制器实例,开发可以在控制器__construct()构造函数中做一些请求处理前的初始化工作。

注意 controller_reuse 配置需要 webman-framework >= 1.4.0 当 webman-framework < 1.4.0时,可以选择安装 action-hook插件,使用beforeAction()钩子做请求处理前初始化工作。

提示 在控制器__construct()构造函数中return数据不会有任何效果,例如

  1. <?php
  2. namespace app\controller;
  3. use support\Request;
  4. class FooController
  5. {
  6. public function __construct()
  7. {
  8. // 构造函数中return数据没有任何效果,浏览器不会收到此响应
  9. return response('hello');
  10. }
  11. }

注意 复用控制器时,控制器中的成员变量也同样会被保存在内容中,因此需要避免以下使用形式,例如 ```php <?php namespace app\controller;

use support\Request;

class FooController { protected $model;

  1. public function update(Request $request, $id)
  2. {
  3. $model = $this->getModel($id);
  4. $model->update();
  5. return response('ok');
  6. }
  7. public function delete(Request $request, $id)
  8. {
  9. $model = $this->getModel($id);
  10. $model->delete();
  11. return response('ok');
  12. }
  13. protected function getModel($id)
  14. {
  15. // 该方法将在第一次请求 update?id=1 后会保留下 model
  16. // 如果再次请求 delete?id=2 时,会删除 1 的数据
  17. if (!$this->model) {
  18. $this->model = Model::find($id);
  19. }
  20. return $this->model;
  21. }

}

  1. ## 资源型控制器
  2. 资源型路由规则,参见[路由]($resource-doc-zh-cn-route.md)。
  3. ```php
  4. <?php
  5. namespace app\controller;
  6. use support\Request;
  7. class Foo
  8. {
  9. /**
  10. * 首页/列表页只支持get访问 /foo
  11. * @param Request $request
  12. * @return \support\Response
  13. */
  14. public function index(Request $request)
  15. {
  16. return response('hello index');
  17. }
  18. /**
  19. * 新增只支持get访问 /foo/create
  20. * @param Request $request
  21. * @return \support\Response
  22. */
  23. public function create(Request $request)
  24. {
  25. return response('hello webman');
  26. }
  27. /**
  28. * 新增提交只支持post提交 /foo
  29. * @param Request $request
  30. * @return \support\Response
  31. */
  32. public function store(Request $request)
  33. {
  34. $params = $request->all();
  35. return response('hello webman');
  36. }
  37. /**
  38. * 获取详情只支持get访问 /foo/{id}
  39. * @param Request $request
  40. * @return \support\Response
  41. */
  42. public function show(Request $request,$id)
  43. {
  44. return response('hello webman');
  45. }
  46. /**
  47. * 编辑获取数据只支持get访问 /foo/{id}/edit
  48. * @param Request $request
  49. * @return \support\Response
  50. */
  51. public function edit(Request $request,$id)
  52. {
  53. return response('hello webman');
  54. }
  55. /**
  56. * 编辑提交只支持PUT提交 /foo/{id}
  57. * @param Request $request
  58. * @return \support\Response
  59. */
  60. public function update(Request $request,$id)
  61. {
  62. $params = $request->all();
  63. return response('hello webman');
  64. }
  65. /**
  66. * 删除只支持DELETE /foo/{id}
  67. * @param Request $request
  68. * @return \support\Response
  69. */
  70. public function destroy(Request $request,$id)
  71. {
  72. //获取id数组
  73. $ids = is_array($id) ? $id : (is_string($id) ? explode(',', $id) : func_get_args());
  74. return response('hello webman');
  75. }
  76. /**
  77. * 恢复软删除只支持PUT /foo/{id}/recovery
  78. * @param Request $request
  79. * @return \support\Response
  80. */
  81. public function recovery(Request $request,$id)
  82. {
  83. //获取id数组
  84. $ids = is_array($id) ? $id : (is_string($id) ? explode(',', $id) : func_get_args());
  85. $params = $request->all();
  86. return response('hello webman');
  87. }
  88. }