IndexController.php 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. <?php
  2. namespace ImiApp\ApiServer\Controller;
  3. use ImiApp\Model\World;
  4. use ImiApp\Model\Fortune;
  5. use Imi\Controller\HttpController;
  6. use Imi\Db\Db;
  7. use Imi\RequestContext;
  8. use Imi\Server\View\Annotation\View;
  9. use Imi\Server\Route\Annotation\Action;
  10. use Imi\Server\Route\Annotation\Controller;
  11. use Imi\Util\Stream\MemoryStream;
  12. /**
  13. * @Controller("/")
  14. */
  15. class IndexController extends HttpController
  16. {
  17. /**
  18. * @Action
  19. *
  20. * @return void
  21. */
  22. public function json()
  23. {
  24. return ['message' => 'Hello, World!'];
  25. }
  26. /**
  27. * @Action
  28. * @View(renderType="html")
  29. *
  30. * @return void
  31. */
  32. public function plaintext()
  33. {
  34. return RequestContext::get('response')->withHeader('Content-Type', 'text/plain; charset=utf-8')->write('Hello, World!');
  35. }
  36. /**
  37. * @Action
  38. *
  39. * @return void
  40. */
  41. public function dbModel()
  42. {
  43. return World::find(mt_rand(1, 10000));
  44. }
  45. /**
  46. * @Action
  47. *
  48. * @return void
  49. */
  50. public function dbQueryBuilder()
  51. {
  52. return Db::query()->from('World')->field('id', 'randomNumber')->where('id', '=', mt_rand(1, 10000))->select()->get();
  53. }
  54. /**
  55. * @Action
  56. *
  57. * @return void
  58. */
  59. public function dbRaw()
  60. {
  61. $db = Db::getInstance();
  62. $stmt = $db->prepare('SELECT id, randomNumber FROM World WHERE id = ?');
  63. $stmt->execute([mt_rand(1, 10000)]);
  64. return $stmt->fetch();
  65. }
  66. /**
  67. * @Action
  68. *
  69. * @return void
  70. */
  71. public function queryModel($queries)
  72. {
  73. if($queries > 1)
  74. {
  75. $queryCount = min($queries, 500);
  76. }
  77. else
  78. {
  79. $queryCount = 1;
  80. }
  81. $list = [];
  82. while ($queryCount--)
  83. {
  84. $list[] = World::find(mt_rand(1, 10000));
  85. }
  86. return $list;
  87. }
  88. /**
  89. * @Action
  90. *
  91. * @return void
  92. */
  93. public function queryQueryBuilder($queries)
  94. {
  95. if($queries > 1)
  96. {
  97. $queryCount = min($queries, 500);
  98. }
  99. else
  100. {
  101. $queryCount = 1;
  102. }
  103. $list = [];
  104. while ($queryCount--)
  105. {
  106. $list[] = Db::query()->from('World')->field('id', 'randomNumber')->where('id', '=', mt_rand(1, 10000))->select()->get();
  107. }
  108. return $list;
  109. }
  110. /**
  111. * @Action
  112. *
  113. * @return void
  114. */
  115. public function queryRaw($queries)
  116. {
  117. if($queries > 1)
  118. {
  119. $queryCount = min($queries, 500);
  120. }
  121. else
  122. {
  123. $queryCount = 1;
  124. }
  125. $list = [];
  126. $db = Db::getInstance();
  127. $stmt = $db->prepare('SELECT id, randomNumber FROM World WHERE id = ?');
  128. while ($queryCount--)
  129. {
  130. $stmt->execute([mt_rand(1, 10000)]);
  131. $list[] = $stmt->fetch();
  132. }
  133. return $list;
  134. }
  135. /**
  136. * @Action
  137. * @View(renderType="html")
  138. *
  139. * @return void
  140. */
  141. public function fortunes()
  142. {
  143. RequestContext::use(function(&$context){
  144. $context['response'] = $context['response']->withHeader('Content-Type', 'text/html; charset=UTF-8');
  145. });
  146. $list = Fortune::select();
  147. $rows = [];
  148. foreach($list as $item)
  149. {
  150. $rows[$item->id] = $item->message;
  151. }
  152. $rows[0] = 'Additional fortune added at request time.';
  153. asort($rows);
  154. return [
  155. 'rows' => $rows,
  156. ];
  157. }
  158. /**
  159. * @Action
  160. * @View(renderType="html")
  161. *
  162. * @return void
  163. */
  164. public function fortunesRaw()
  165. {
  166. $rows = [];
  167. foreach(Db::getInstance()->query('SELECT id, message FROM Fortune')->fetchAll() as $item)
  168. {
  169. $rows[$item['id']] = $item['message'];
  170. }
  171. $rows[0] = 'Additional fortune added at request time.';
  172. asort($rows);
  173. $html = '';
  174. foreach ($rows as $id => $message)
  175. {
  176. $message = \htmlspecialchars($message, ENT_QUOTES, 'UTF-8');
  177. $html .= "<tr><td>{$id}</td><td>{$message}</td></tr>";
  178. }
  179. return RequestContext::get('response')->withHeader('Content-Type', 'text/html; charset=UTF-8')
  180. ->withBody(new MemoryStream("<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>{$html}</table></body></html>"));
  181. }
  182. /**
  183. * @Action
  184. *
  185. * @return void
  186. */
  187. public function updateModel($queries)
  188. {
  189. if($queries > 1)
  190. {
  191. $queryCount = min($queries, 500);
  192. }
  193. else
  194. {
  195. $queryCount = 1;
  196. }
  197. $list = [];
  198. while ($queryCount--)
  199. {
  200. $list[] = $row = World::find(mt_rand(1, 10000));
  201. $row->randomNumber = mt_rand(1, 10000);
  202. $row->update();
  203. }
  204. return $list;
  205. }
  206. /**
  207. * @Action
  208. *
  209. * @return void
  210. */
  211. public function updateQueryBuilder($queries)
  212. {
  213. if($queries > 1)
  214. {
  215. $queryCount = min($queries, 500);
  216. }
  217. else
  218. {
  219. $queryCount = 1;
  220. }
  221. $list = [];
  222. while ($queryCount--)
  223. {
  224. $id = mt_rand(1, 10000);
  225. $row = Db::query()->from('World')->field('id', 'randomNumber')->where('id', '=', $id)->select()->get();
  226. $row['randomNumber'] = mt_rand(1, 10000);
  227. Db::query()->from('World')->where('id', '=', $row['id'])->update([
  228. 'randomNumber' => $row['randomNumber'],
  229. ]);
  230. $list[] = $row;
  231. }
  232. return $list;
  233. }
  234. /**
  235. * @Action
  236. *
  237. * @return void
  238. */
  239. public function updateRaw($queries)
  240. {
  241. if($queries > 1)
  242. {
  243. $queryCount = min($queries, 500);
  244. }
  245. else
  246. {
  247. $queryCount = 1;
  248. }
  249. $list = [];
  250. $db = Db::getInstance();
  251. $stmtSelect = $db->prepare('SELECT id, randomNumber FROM World WHERE id = ?');
  252. $stmtUpdate = $db->prepare('UPDATE World SET randomNumber = :randomNumber WHERE id = :id');
  253. while ($queryCount--)
  254. {
  255. $id = mt_rand(1, 10000);
  256. $stmtSelect->execute([$id]);
  257. $row = $stmtSelect->fetch();
  258. $row['randomNumber'] = mt_rand(1, 10000);
  259. $stmtUpdate->execute([
  260. 'id' => $row['id'],
  261. 'randomNumber' => $row['randomNumber'],
  262. ]);
  263. $list[] = $row;
  264. }
  265. return $list;
  266. }
  267. }