{"id":1541,"date":"2015-03-30T19:09:20","date_gmt":"2015-03-30T11:09:20","guid":{"rendered":"http:\/\/blog.turn.tw\/?p=1541"},"modified":"2015-04-19T00:26:00","modified_gmt":"2015-04-18T16:26:00","slug":"%e6%a1%86%e6%9e%b6%e4%b8%8d%e6%87%89%e8%a9%b2%e6%9c%89%e3%80%8cmodels%e3%80%8d%e8%b3%87%e6%96%99%e5%a4%be","status":"publish","type":"post","link":"https:\/\/blog.turn.tw\/?p=1541","title":{"rendered":"\u6846\u67b6\u4e0d\u61c9\u8a72\u6709\u300cmodels\u300d\u8cc7\u6599\u593e"},"content":{"rendered":"<p>\u5404\u5927back-end framework\u5e7e\u4e4e\u90fd\u63a1\u7528\u4e86\u300cMVC\u300d\u67b6\u69cb\u3002<\/p>\n<p>\u5b83\u5011\u81f3\u5c11\u6703\u6709\u300cviews\u300d\u3001\u300c controllers\u300d\u3001\u300c models\u300d\u4e09\u500b\u8cc7\u6599\u593e\u3002<\/p>\n<p>\u300cviews\u300d\u8ddf\u300ccontrollers\u300d\u6c92\u592a\u5927\u554f\u984c\uff0c\u4f46\u662f\u300cmodels\u300d\u8cc7\u6599\u593e\u6839\u672c\u4e0d\u8a72\u5b58\u5728\u3002<\/p>\n<p>\u6211\u8981\u5c0d\u9019\u4e9b\u6846\u67b6\u63d0\u51fa\u56b4\u53b2\u6307\u63a7\uff1a<\/p>\n<p><strong>\u300cmodels\u300d\u8cc7\u6599\u593e\u7684\u5b58\u5728\u662f\u4e00\u7a2e\u932f\u8aa4\u7684\u67b6\u69cb\u8a2d\u8a08\u3002\u5b83\u4e0d\u4f46\u963b\u7919\u65b0\u624b\u5b78\u7fd2\uff0c\u9084\u6703\u50b7\u5bb3scalability\u3002<br \/>\n<\/strong><\/p>\n<p>\u4efb\u4f55back-end framework\u90fd\u4e0d\u61c9\u8a72\u6709\u300cmodels\u300d\u8cc7\u6599\u593e\u3002<\/p>\n<p>\u6211\u6703\u5728\u9019\u7bc7\u6587\u7ae0\u89e3\u91cb\u7406\u7531\uff0c\u4e26\u4e14\u63d0\u51fa\u6539\u5584\u67b6\u69cb\u8a2d\u8a08\u7684\u5e7e\u500b\u65b9\u5411\u3002<\/p>\n<h1>\u54ea\u4e9b\u6846\u67b6\u6709\u300cmodels\u300d\u8cc7\u6599\u593e\uff1f<\/h1>\n<p>\u5149\u662f\u6211\u63a5\u89f8\u904e\u7684Ruby\u3001PHP\u6846\u67b6\uff0c\u5c31\u81f3\u5c11\u6709\uff1a<\/p>\n<ul>\n<li>Rails(Ruby)<\/li>\n<li>CodeIgniter(PHP)<\/li>\n<li>Yii(PHP)<\/li>\n<li>&#8230;<\/li>\n<\/ul>\n<p>\u9664\u6b64\u4e4b\u5916\uff0c\u50cf\u662fJava, Python\u9084\u662f\u4ec0\u9ebc\u8a9e\u8a00\uff0c<\/p>\n<p>\u4e00\u5b9a\u4e5f\u6709\u6846\u67b6\u505a\u9019\u7a2e\u4e8b\uff1a\u653e\u4e00\u500b\u300cmodels\u300d\u8cc7\u6599\u593e\u5728\u90a3\u908a\u3002<\/p>\n<p>\u9019\u771f\u662f\u5927\u932f\u7279\u932f\u3002<\/p>\n<p>\u4f60\u5230\u5e95\u8981\u653e\u4ec0\u9ebc\u6771\u897f\u5230\u300cmodels\u300d\u8cc7\u6599\u593e\u88e1\u9762\uff1f\u4f60\u89ba\u5f97Model\u662f\u4ec0\u9ebc\uff1f<\/p>\n<h1>Model\u662f\u4ec0\u9ebc\uff1f<\/h1>\n<p>\u6487\u958b\u6211\u4e4b\u524d\u63d0\u5230\u7684<a href=\"https:\/\/blog.turn.tw\/?p=1539\">MVC\u6b63\u540d\u722d\u8b70<\/a>\u4e0d\u8ac7\uff0c\u5149\u662fMVC\u7684M\u8a72\u5982\u4f55\u89e3\u91cb\u5c31\u5df2\u7d93\u662f\u500b\u5927\u54c9\u554f\u3002<\/p>\n<p>\u770b\u770b\u9019\u5247\u51fa\u8272\u7684Stack Overflow\u554f\u7b54\uff1a<\/p>\n<p><a href=\"http:\/\/stackoverflow.com\/questions\/5863870\/how-should-a-model-be-structured-in-mvc\">How should a model be structured in MVC?<br \/>\n<\/a><\/p>\n<p><strong>Model\u662flayer\u3001\u5b83\u5305\u7f85\u842c\u8c61\u3001\u5b83\u6db5\u84cb\u4f60\u5168\u90e8\u7684business logic\u3002<\/strong><\/p>\n<p>\u773e\u8aaa\u7d1b\u7d1c\u4e2d\uff0c\u9019\u662f\u6211\u5011\u552f\u4e00\u80fd\u6709\u7684\u5171\u8b58\u3002<\/p>\n<p>Model\u96e3\u4ee5\u5b9a\u7fa9\u3001\u6c92\u6709\u7d55\u5c0d\u6b63\u78ba\u7684\u67b6\u69cb\u8a2d\u8a08\u3002\u807d\u8d77\u4f86\u771f\u4ee4\u4eba\u6d29\u6c23\uff0c\u5c0d\u5427\uff1f<\/p>\n<p>\u4e0d\uff01\u9019\u6a23\u5f88\u597d\uff01\u9019\u6a23\u624d\u5c0d\uff01\u8edf\u9ad4\u67b6\u69cb\u672c\u4f86\u5c31\u662f\u5927\u54c9\u554f\uff0c\u6709\u7121\u9650\u7a2e\u53ef\u80fd\u7684\u65b9\u6cd5\uff0c<\/p>\n<p>\u9019\u4e5f\u662f\u6211\u5011\u6240\u6709\u4eba\u61c9\u8a72\u8981\u4e00\u8d77\u8a0e\u8ad6\u548c\u5617\u8a66\u7684\u5730\u65b9\u3002<\/p>\n<p>\u800c\u300cmodels\u300d\u8cc7\u6599\u593e\u537b\u56b4\u91cd\u59a8\u7919\u6211\u5011\u8a0e\u8ad6\u3001\u963b\u6b62\u6211\u5011\u601d\u8003\uff0c<\/p>\n<p>\u5b83\u4e0d\u4f46\u963b\u7919\u65b0\u624b\u5b78\u7fd2\uff0c\u9084\u6703\u50b7\u5bb3scalability\u3002<\/p>\n<h1>\u300cmodels\u300d\u8cc7\u6599\u593e\u5982\u4f55\u963b\u7919\u65b0\u624b\u5b78\u7fd2\uff1f<\/h1>\n<p>\u8aaa\u660e\u9019\u6bb5\u4e4b\u524d\uff0c\u6211\u5148\u5b9a\u7fa9\u4e00\u500b\u540d\u8a5e\uff1a\u300centity\u300d\u3002<\/p>\n<p>\u6211\u5c07entity\u5b9a\u7fa9\u6210\u300c\u4ee3\u8868\u73fe\u5be6\u751f\u6d3b\u4e2d\u7684\u4e00\u7a2e\u4e8b\u7269\u300d\u3002<\/p>\n<p>\u4ee5\u5e38\u898b\u7684Active Record pattern\u4f86\u8aaa\uff0c<\/p>\n<pre>\r\n\/\/ user.rb\r\n\/\/ Rails\r\nclass User < ActiveRecord::Base\r\n<\/pre>\n<pre>\r\n\/\/ user.php\r\n\/\/ Laravel\r\nclass User extends Eloquent\r\n<\/pre>\n<pre>\r\n\/\/ post.php\r\n\/\/ Yii\r\nclass Post extends CActiveRecord\r\n<\/pre>\n<p>\u985e\u4f3c\u9019\u6a23\u7684\u6771\u897f\uff0c\u4f60\u4e00\u5b9a\u770b\u904e\u3002<\/p>\n<p>user.rb\u3001user.php\u3001post.php\uff0c\u9019\u4e9b\u5c31\u662f\u6211\u6240\u8b02\u7684\u300centity\u300d\u3002<\/p>\n<p>\u4e5f\u5c31\u662f\u9019\u4e9b\u300centity\u300d\uff0c\u8b93\u65b0\u624b\u5bb9\u6613\u8aa4\u4ee5\u70ba\u300centity\u300d\u5c31\u662fMVC\u88e1\u9762\u7684M\u3002<\/p>\n<p>\u932f\uff01M\u662flayer\uff0centity\u53ea\u662fM\u88e1\u9762\u7684\u7d44\u6210\u5143\u7d20\u4e4b\u4e00\u800c\u5df2\u3002<\/p>\n<p>\u300cmodels\u300d\u8cc7\u6599\u593e\u7684\u5b58\u5728\u672c\u8eab\uff0c\u6703\u8b93\u65b0\u624b\u4ee5\u70ba\u300c\u5f04\u5e7e\u500bentity\u985e\u5225\u4e1f\u9032\u53bb\u5c31\u641e\u5b9a\u67b6\u69cb\u4e86\u300d\u3002<\/p>\n<p>\u7136\u5f8centity\u7684\u884c\u70ba\u3001\u5c0dentity\u505a\u51fa\u7684\u884c\u70ba\u3001\u95dc\u4e4e\u5169\u500b\u4ee5\u4e0aentity\u7684\u884c\u70ba\uff0c\u7ba1\u4ed6\u4ec0\u9ebclogic\uff0c<\/p>\n<p>\u7ba1\u4ed6\u4ec0\u9ebc\u884c\u70ba\uff0c\u5168\u90e8\u60f3\u8fa6\u6cd5\u585e\u9032entity\u985e\u5225\u3002<\/p>\n<p>\u4e0b\u5834\u901a\u5e38\u5c31\u662f\uff1a\u90a3\u4e9bentity\u985e\u5225\u6700\u5f8c\u8b8a\u5f97\u8d85\u80a5\u80d6\u3001\u96e3\u4ee5\u7406\u89e3\u3001\u52d5\u8f12\u9054\u5230\u4e0a\u5343\u884c\u7a0b\u5f0f\u78bc\u3002<\/p>\n<p>\u6211\u7a31\u4e4b\u70ba\u300c\u80d6\u80d6entity\u300d\u3002<\/p>\n<p>\u300cmodels\u300d\u8cc7\u6599\u593e\u5e36\u7d66\u65b0\u624b\u300cmodel == entity\u300d\u932f\u89ba\uff01<\/p>\n<p>\u300cmodels\u300d\u8cc7\u6599\u593e\u8a98\u60d1\u65b0\u624b\u53bb\u505a\u51fa\u4e00\u5806\u80d6\u80d6entity\uff01<\/p>\n<h1>\u300cmodels\u300d\u8cc7\u6599\u593e\u5982\u4f55\u50b7\u5bb3scalability\uff1f<\/h1>\n<p>\u770b\u770bRails\u793e\u7fa4\u9019\u7bc7\u51fa\u540d\u7684\u6587\u7ae0\uff1a<\/p>\n<p><a href=\"http:\/\/blog.codeclimate.com\/blog\/2012\/10\/17\/7-ways-to-decompose-fat-activerecord-models\/\">7 Patterns to Refactor Fat ActiveRecord Models<\/a><\/p>\n<p>\u5e79\u5f97\u597d\uff01\u5b83\u9ede\u51fa\u300c\u80d6\u80d6entity\u300d\u7684\u554f\u984c\uff0c\u4e26\u7d66\u51fa7\u500bpatterns\u53bb\u5354\u52a9\u4f60\u8a2d\u8a08\u8edf\u9ad4\u67b6\u69cb\u3002<\/p>\n<p>\u62bd\u51fa\u884c\u70ba\u908f\u8f2f\u8b8a\u6210Service Objects\u3001\u62bd\u51fa\u8868\u55ae\u9a57\u8b49\u908f\u8f2f\u8b8a\u6210Form Objects\u3001\u62bd\u51fa\u8cc7\u6599\u5eab\u67e5\u8a62\u908f\u8f2f\u8b8a\u6210Query Objects\u3001\u62bd\u51fa\u5448\u73fe\u908f\u8f2f\u8b8a\u6210View Objects...\u807d\u8d77\u4f86\u771f\u68d2\uff0c\u4e5f\u78ba\u5be6\u5f88\u6709\u5e6b\u52a9\uff0c\u4e0d\u662f\u55ce\uff1f<\/p>\n<p>\u554f\u984c\u4f86\u4e86\uff1a\u62bd\u51fa\u4f86\u7684\u9019\u4e9b\u985e\u5225\uff0c\u5230\u5e95\u8981\u653e\u54ea\u88e1\uff1f<\/p>\n<p>\u6211\u5011\u770b\u770b\u6587\u7ae0\u4e0b\u9762comments\u63d0\u5230\u7684\u7bc4\u4f8b\uff1a<a href=\"https:\/\/github.com\/gitlabhq\/gitlabhq\/tree\/master\/app\/services\">GItLab<\/a><\/p>\n<p>\u5b83\u7684\u6a94\u6848\u7d50\u69cb\u5982\u4e0b\uff1a<\/p>\n<pre>\r\n\/lib\r\n    \/gitlab\r\n    \/tasks\r\n    \/...\r\n\/app\r\n    \/assets\t\r\n    \/controllers\t\r\n    \/finders\t\r\n    \/helpers\t\r\n    \/mailers\t\r\n    \/models\t\r\n    \/services\t\r\n    \/uploaders\t\r\n    \/views\t\r\n    \/workers\r\n<\/pre>\n<p>\u65b0\u7684\u554f\u984c\u4f86\u4e86\uff1a\u90a3\u500b\u300cmodels\u300d\u8cc7\u6599\u593e\u5230\u5e95\u4ee3\u8868\u4ec0\u9ebc\uff1f\u5b83\u662f\u6211\u5011\u5305\u7f85\u842c\u8c61\u7684\u5049\u5927Model layer\u55ce\uff1f\u90a3finders\u3001services\u3001uploaders\u70ba\u4ec0\u9ebc\u8ddfmodels\u5728\u540c\u4e00\u5c64\uff0c\u800c\u4e0d\u662f\u5728models\u88e1\u9762\uff1flib\/\u5e95\u4e0b\u7684gitlab\/\u53c8\u662f\u600e\u9ebc\u56de\u4e8b\uff1f\u96e3\u9053GitLab\u7684\u5546\u696d\u908f\u8f2f\u4e5f\u51fa\u73fe\u5728lib\uff1f<\/p>\n<p>\u9019\u5c31\u662f\u6211\u60f3\u8aaa\u7684\uff1a\u300cmodels\u300d\u8cc7\u6599\u593e\u7684\u5b58\u5728\u5f9e\u4e00\u958b\u59cb\u5c31\u6c61\u67d3\u4e86\u67b6\u69cb\u8a2d\u8a08\u3002<\/p>\n<p>\u5b83\u5f15\u8a98\u4eba\u5011\u628aentity\u5168\u4e1f\u9032\u53bb\u3002\u7d50\u679c\u9664\u4e86entity\u4ee5\u5916\u7684\u6771\u897f\uff0c\u50cf\u662f\u524d\u9762\u7684Service Objects\u3001 Form Objects\u3001Query Objects\u3001View Objects\uff0c\u9084\u6709\u5f8c\u9762\u7684finders\u3001services\u3001uploaders\u3001gitlab\u5168\u90fd\u4e0d\u77e5\u9053\u653e\u54ea\u4e86\u3002\u53ea\u597d\u96a8\u4fbf\u4e82\u653e\u3002<\/p>\n<p>GItLab\u539f\u59cb\u78bc\u4e2d\u7684models\u6709\u4ee3\u8868MVC\u7684M\u55ce\uff1f\u600e\u9ebc\u4e0d\u6539\u540d\u53ebentities\uff1f<\/p>\n<p>\u5c31\u7b97\u6539\u4e86\u53c8\u5982\u4f55\uff1fModel layer\u5230\u5e95\u5728\u54ea\u88e1\uff1f\u56db\u5206\u4e94\u88c2\u3001\u7d50\u69cb\u9b06\u6563\u3002<\/p>\n<p>\u4e00\u5718\u6df7\u4e82\u7684\u8a2d\u8a08\u3001\u96e3\u4ee5\u7406\u89e3\u7684\u547d\u540d\u3001\u8207MVC\u7684M\u4e0d\u76f8\u5bb9\u7684\u6a94\u6848\u7d50\u69cb\u3002<\/p>\n<p>\u6240\u4ee5\u6211\u8aaa\uff0c\u300cmodels\u300d\u8cc7\u6599\u593e\u50b7\u5bb3scalability\uff01<\/p>\n<h1>\u90a3\u8a72\u600e\u9ebc\u8fa6\uff1f<\/h1>\n<p>\u8981\u89e3\u6c7a\u9019\u500b\u554f\u984c\uff0c\u9996\u5148\u5f97\u8981\u4e86\u89e3MVC\u662f\u4e09\u500b\u6975\u5ea6\u4e0d\u5c0d\u7a31\u7684\u5b58\u5728\u3002<\/p>\n<p>V: \u8ca0\u8cac\u5448\u73feUI<br \/>\nC: \u8ca0\u8cac\u63a5\u53d7request\u3001\u8acbM\u8655\u7406\u3001\u56de\u50b3response<br \/>\nM: \u8ca0\u8cac\u5168\u90e8\u7684business logic<\/p>\n<p>M\u5e7e\u4e4e\u662f\u4f60\u7684\u6574\u500bapplication\u3002<\/p>\n<p>\u4f60\u53ef\u4ee5\u5728\u6846\u67b6\u5e95\u4e0b\uff0c\u627e\u5730\u65b9\u5efa\u4e00\u500b\u7a7a\u8cc7\u6599\u593e\uff0c\u7528\u516c\u53f8\u540d\u7a31\u6216\u662f\u5c08\u6848\u540d\u7a31\u66ff\u5b83\u547d\u540d\uff0c<\/p>\n<p>\u7136\u5f8c\u958b\u59cb\u7169\u60f1\u8edf\u9ad4\u67b6\u69cb\u9019\u4ef6\u4e8b\u3002<\/p>\n<p>\u597d\u597d\u7169\u60f1entity\u8981\u653e\u5728\u54ea\u88e1\u3001Service Objects\u3001 Form Objects\u3001Query Objects\u3001View Objects\u3001finders\u3001services\u3001uploaders\u9019\u4e9b\u8981\u653e\u54ea\u88e1\uff0c\u5f7c\u6b64\u53c8\u8981\u600e\u9ebc\u5206\u9580\u5225\u985e\u3002<\/p>\n<p>MVC\u4e0d\u662f\u842c\u9748\u4e39\uff0c\u53ea\u662f\u8edf\u9ad4\u67b6\u69cb\u7684\u5165\u9580\u78da\u3002<\/p>\n<p>\u67b6\u69cb\u8a2d\u8a08\u672c\u4f86\u5c31\u662f\u9019\u9ebc\u96e3\uff0cOOP\u672c\u4f86\u5c31\u662f\u9019\u9ebc\u96e3\u3002<\/p>\n<p>\u606d\u559c\u4f60\uff0c\u81f3\u5c11\u4f60\u8de8\u51fa\u7b2c\u4e00\u6b65\u4e86\uff1a<\/p>\n<p>\u4f60\u4e0d\u518d\u628a\u4e00\u5806\u80d6\u80d6entity\u4e1f\u9032\u300cmodels\u300d\u8cc7\u6599\u593e\uff0c\u7136\u5f8c\u89ba\u5f97\u8a2d\u8a08\u5b8c\u8edf\u9ad4\u67b6\u69cb\u4e86\u3002<\/p>\n<hr \/>\n<h1>Q&A<\/h1>\n<p><strong><em>Q1: \u300cmodels\u300d\u8cc7\u6599\u593e\u6beb\u7121\u512a\u9ede\u55ce\uff1f<br \/>\n<\/em><\/strong><\/p>\n<p>\u300cmodels\u300d\u8cc7\u6599\u593e\u9084\u662f\u6709\u5c11\u6578\u512a\u9ede\u3002<br \/>\n\u5b83\u662f\u4e00\u7a2equick and dirty\u4f5c\u6cd5\uff0c\u9f13\u52f5\u4f60\u773c\u4e2d\u53ea\u770b\u898bentity\uff0c\u7136\u5f8c\u628a\u6240\u6709business logic\u5168\u585e\u9032\u88e1\u9762\u3002<br \/>\n\u63db\u53e5\u8a71\u8aaa\uff0c\u5b83\u5728\u5c0f\u578b\u7684\u5c08\u6848\u53ef\u4ee5\u5e6b\u4f60\u7bc0\u7701\u6642\u9593\u3002\u4f46\u5b83\u7684\u512a\u9ede\u4e5f\u50c5\u6b64\u800c\u5df2\u3002<\/p>\n<p><strong><em>Q2: \u4f60\u7684\u7d50\u8ad6\u597d\u7a7a\u6cdb\uff0c\u4ec0\u9ebc\u5efa\u4e00\u500b\u516c\u53f8\u540d\u7a31\u7a7a\u8cc7\u6599\u593e\u554a\u3002\u62dc\u8a17\u7d66\u9ede\u65b9\u5411\uff1f<br \/>\n<\/em><\/strong><\/p>\n<p>\u6c92\u554f\u984c\uff0c\u6211\u7d66\u4f60\u5169\u500b\u67b6\u69cb\u8a2d\u8a08\u7684\u53c3\u8003\u65b9\u5411\u3002<\/p>\n<p>\u7b2c\u4e00\u500b\u4f86\u81ea\u9019\u7bc7\u6587\u7ae0\uff1a<\/p>\n<p><a href=\"http:\/\/blog.firsthand.ca\/2011\/10\/rails-is-not-your-application.html\">Rails is Not Your Application<\/a><\/p>\n<p>\u5f15\u7528\u4f5c\u8005\u7684\u8a71\uff0c\u6838\u5fc3\u7cbe\u795e\u5982\u4e0b\uff1a<\/p>\n<blockquote><p>\nRails\u4e0d\u662f\u4f60\u7684application\u3002\u5b83\u53ef\u4ee5\u662f\u4f60\u7684views\u9084\u6709\u8cc7\u6599\u4f86\u6e90\uff0c\u4f46\u4e0d\u662f\u4f60\u7684application\u3002\u628a\u4f60\u7684application\u653e\u5728Gem\u88e1\u9762\u6216\u662flib\/\u8cc7\u6599\u593e\u5e95\u4e0b\u3002\n<\/p><\/blockquote>\n<p>\u6211\u4e0d\u89ba\u5f97\u9019\u6a23\u6709\u5f88\u512a\u96c5\uff0c\u4f46\u81f3\u5c11\u9ede\u51fa\u4e00\u500b\u53ef\u80fd\u65b9\u5411\uff0c\u4e26\u4e14\u81f3\u5c11\u4e0d\u518d\u6709models\u8cc7\u6599\u593e\u3002<\/p>\n<p>\u6211\u7b2c\u4e8c\u500b\u8981\u7d66\u4f60\u7684\uff0c\u662f<a href=\"http:\/\/laravel.io\/\">Laravel\u5b98\u65b9\u8ad6\u58c7<\/a>\u7684<a href=\"https:\/\/github.com\/LaravelIO\/laravel.io\/tree\/master\/app\/Lio\">\u539f\u59cb\u78bc<\/a>\u3002<\/p>\n<p>\u9019\u500bLaravel.io\u5c08\u6848\u7c21\u7a31\u70baLio\uff0c\u7d50\u69cb\u5982\u4e0b\uff1a<\/p>\n<pre>\r\n\/app\r\n    \/controllers\r\n    \/views\r\n    \/Lio\r\n        \/Core\r\n            \/...\r\n        \/Accounts\r\n            \/User.php\r\n            \/UserPresenter.php\r\n            \/UserRepository.php\r\n            \/UserCreator.php\r\n            \/....\r\n        \/Articles\r\n            \/Article.php\r\n            \/ArticlePresenter.php\r\n            \/ArticleRepository.php\r\n            \/ArticleCreator.php\r\n            \/....\r\n        \/Comments\r\n        \/...\r\n<\/pre>\n<p>\u5149\u770b\u6a94\u6848\u7d50\u69cb\u5c31\u5f88\u512a\u96c5\u3002\u4e5f\u6b63\u662f\u6211\u524d\u9762\u6240\u8aaa\u7684\uff1a\u5efa\u4e00\u500b\u7a7a\u8cc7\u6599\u593e\uff0c\u7528\u516c\u53f8\u540d\u7a31\u6216\u662f\u5c08\u6848\u540d\u7a31\u66ff\u5b83\u547d\u540d\uff0c\u7136\u5f8c\u958b\u59cb\u7169\u60f1\u67b6\u69cb\u8a2d\u8a08\u9019\u4ef6\u4e8b\u3002<\/p>\n<p>\u60f3\u60f3\u770b<a href=\"https:\/\/github.com\/LaravelIO\/laravel.io\/tree\/master\/app\/Lio\">Laravel\u5b98\u65b9\u8ad6\u58c7\u7684\u539f\u59cb\u78bc<\/a>\u70ba\u4ec0\u9ebc\u9577\u9019\u6a23\u5427\u3002<\/p>\n<p><strong><em>Q3: \u8b1b\u5f97\u597d\u50cf\u591a\u6709\u9053\u7406\uff01\u6211\u89ba\u5f97\u4f60\u53ea\u662f\u5728\u9b3c\u626f\uff01\u6846\u67b6\u7684\u88fd\u4f5c\u5718\u968a\u90fd\u662f\u696d\u754c\u5927\u795e\uff0c\u65e2\u7136\u4ed6\u5011\u6c7a\u5b9a\u8981\u6709\u300cmodels\u300d\u8cc7\u6599\u593e\uff0c\u5fc5\u5b9a\u6709\u5b83\u7684\u6b63\u7576\u6027\uff01<br \/>\n<\/em><\/strong><br \/>\n\u4e0d\uff0c\u4f60\u932f\u4e86\u3002\u90a3\u4e9b\u696d\u754c\u5927\u795e\u53ea\u662f\u80cc\u8ca0\u4e86\u884c\u92b7\u6846\u67b6\u7684\u58d3\u529b\u3002<\/p>\n<p>\u4ed6\u5011\u70ba\u4e86\u6eff\u8db3\u7528\u6236\u7684\u932f\u8aa4\u671f\u5f85\u800c\u59d4\u5c48\u5730\u653e\u4e86\u500b\u300cmodels\u300d\u8cc7\u6599\u593e\u5728\u90a3\u3002<\/p>\n<p>\u4f46\u9084\u662f\u6709\u9ad8\u5c1a\u7684\u4eba\u5b58\u5728\u3002PHP\u6700\u88ab\u63a8\u5d07\u7684\u6846\u67b6Laravel\u5c31\u6c92\u6709\u300cmodels\u300d\u8cc7\u6599\u593e\u3002<\/p>\n<p>\u5411Laravel\u7684Taylor Otwell\u81f4\u656c\u5427\uff01<\/p>\n<p>\u4ed6\u4e0d\u9858\u6210\u70ba\u6b98\u5bb3\u65b0\u624b\u7684\u5e6b\u51f6\uff0c\u786c\u662f\u628a\u300cmodels\u300d\u62ff\u6389\u4e86\uff0c<\/p>\n<p>\u5f37\u8feb\u4f60\u53bb\u601d\u8003\uff1a\u300c\u8edf\u9ad4\u67b6\u69cb\u5230\u5e95\u8a72\u9577\u600e\u6a23\u300d\u3002<\/p>\n<p>\u4f60\u8981\u81ea\u5df1\u5728Laravel\u88e1\u9762\u505a\u4e00\u500b\u300cmodels\u300d\u8cc7\u6599\u593e\uff0c\u7136\u5f8c\u628a\u90a3\u4e9bentity class\u5168\u4e1f\u9032\u53bb\u55ce\uff1f<\/p>\n<p>\u90a3\u4f60\u662f\u81ea\u9858\u628aentity\u7576\u6210\u6574\u500bModel\uff0c\u771f\u907a\u61be\uff0c<\/p>\n<p>\u4f46\u5225\u8aaa\u662fLaravel\u9f13\u52f5\u4f60\u9019\u9ebc\u505a\u3002Laravel\u76e1\u529b\u4e86\u3002<\/p>\n<p><strong><em>Q4: \u5c11\u81ea\u4ee5\u70ba\u4e86\u89e3Taylor Otwell\u4e86\uff01\u4f60\u6191\u4ec0\u9ebc\u4ee3\u66ff\u4ed6\u767c\u8a00\uff01<\/em><\/strong><\/p>\n<p>Reddit\u4e0a\u6709\u4e00\u5247 <a href=\"http:\/\/www.reddit.com\/r\/PHP\/comments\/1eld2t\/why_would_anyone_choose_laravel_over_symfony_or\/\">Why would anyone choose Laravel over Symfony or Silex?<\/a><\/p>\n<p>Taylor Otwell\u672c\u4eba\u89aa\u81ea\u505a\u51fa\u56de\u7b54\u3002\u4e0b\u6587\u64f7\u53d6\u81ea\u7b2c\u56db\u6bb5\uff1a<\/p>\n<blockquote><p>\n\u6211\u500b\u4eba\u5728\u958b\u767cLaravel 4\u7684\u65e9\u671f\u968e\u6bb5\u5c31\u60f3\u628a\u300cmodels\u300d\u8cc7\u6599\u593e\u6574\u500b\u79fb\u9664\u4e86\u3002\u56e0\u70ba\u6211\u4e0d\u89ba\u5f97\u5b83\u6709\u7528\uff0c\u4e5f\u4e0d\u89ba\u5f97\u5b83\u80fd\u5354\u52a9\u4f60\u8a2d\u8a08\u8edf\u9ad4\u67b6\u69cb\u3002\u800c\u4e14\u5b83\u9084\u6703\u5f15\u8a98\u4eba\u5011\u6389\u5165\u300cmodel == database\u300d\u7684\u9677\u9631\u88e1\u3002\u6240\u4ee5\uff0c\u6211\u5e0c\u671b\u4f60\u4e0d\u8981\u89ba\u5f97\u6211\u5c0d\u67b6\u69cb\u8a2d\u8a08\u5f88\u7121\u77e5\u3002\u6211\u82b1\u4e86\u9ede\u6642\u9593\u624d\u60f3\u6e05\u695a\u6211\u5230\u5e95\u60f3\u5728PHP\u4e16\u754c\u6253\u9020\u4ec0\u9ebc\u3002\n<\/p><\/blockquote>\n<p>Laravel\u5be6\u4f5cActive Record Pattern\uff0c\u8cc7\u6599\u8868\u6620\u5c0d\u5230entity class\u3002\u4ed6\u6307\u7684\u300cmodel == database\u300d\u9677\u9631\u5c31\u662f\u6211\u8aaa\u7684\u300cmodel == entity\u300d\u932f\u89ba\u3002\u6211\u4e26\u6c92\u6709\u4ee3\u66ff\u4ed6\u767c\u8a00\u3002<\/p>\n<p><strong><em>Q5: \u6211\u9084\u662f\u89ba\u5f97\uff0c\u4f60\u6c92\u6709\u8cc7\u683c\u6279\u8a55\u90a3\u9ebc\u591a\u6846\u67b6\u3002\u300cmodels\u300d\u8cc7\u6599\u593e\u5c31\u662f\u6709\u67d0\u7a2e\u6b63\u7576\u6027\u3002\u9664\u4e86Taylor Otwell\uff0c\u6211\u770b\u4e5f\u6c92\u6709\u5176\u4ed6\u6b0a\u5a01\u652f\u6301\u4f60\u7684\u8aaa\u6cd5\uff01<\/em><\/strong><\/p>\n<p>\u524d\u9762\u63d0\u5230\u7684\u51fa\u8272Stack Overflow\u554f\u7b54\uff1a<\/p>\n<p><a href=\"http:\/\/stackoverflow.com\/questions\/5863870\/how-should-a-model-be-structured-in-mvc\">How should a model be structured in MVC?<br \/>\n<\/a><\/p>\n<p>\u4f5c\u8005\u662ftere\u0161ko\u3002<\/p>\n<p>Stack Overflow\u4e0a\u95dc\u65bcMVC\u7684\u5e7e\u500b\u6700\u9ad8\u5206\u8a0e\u8ad6\uff0c<a href=\"http:\/\/stackoverflow.com\/users\/727208\/tere%C5%A1ko\">\u5168\u90fd\u662f\u7531tere\u0161ko\u89e3\u7b54<\/a>\u3002<\/p>\n<p>\u4e0b\u6587\u64f7\u53d6\u81ea\u90a3\u7bc7\u51fa\u8272\u554f\u7b54\u7684\u6bb5\u843d\u300cWhat a model is NOT\u300d\uff1a<\/p>\n<blockquote><p>\nmodel\u4e0d\u662f\u4e00\u500bclass\uff0c\u4e5f\u4e0d\u662f\u4efb\u4f55\u4e00\u500b\u55ae\u4e00\u7269\u4ef6\u3002\u9019\u662f\u4e00\u500b\u8d85\u7d1a\u5e38\u898b\u932f\u8aa4\uff0c\u56e0\u70ba\u5927\u90e8\u5206\u7684\u6846\u67b6\u90fd\u5728\u52a9\u9577\u9019\u7a2e\u8aa4\u89e3\u3002\n<\/p><\/blockquote>\n<p>\u4ed6\u9078\u64c7\u9019\u6a23\u5e36\u904e\u3002\u6211\u9078\u64c7\u6b63\u9762\u6307\u63a7\u3002<\/p>\n<p>\u7136\u5f8c\u6211\u5efa\u8b70\u4f60\u8a0e\u8ad6\u4e8b\u60c5\u7684\u6642\u5019\uff0c\u4e0d\u8981\u592a\u5728\u4e4e\u6b0a\u5a01\u9084\u662f\u524d\u8f29\u600e\u9ebc\u8b1b\u3002\u4e0d\u5982\u5c08\u6ce8\u65bc\u8a0e\u8ad6\u4e8b\u60c5\u672c\u8eab\u3002<\/p>\n<p><strong><em>Q6: \u597d\u554a\uff01\u90a3\u4f86\u554a\uff01\u7167\u4f60\u7684\u8aaa\u6cd5\uff0c\u300cmodels\u300d\u8cc7\u6599\u593e\u5e95\u4e0b\u591a\u653e\u500b\u300centities\u300d\u8cc7\u6599\u593e\u4e0d\u5c31\u641e\u5b9a\u4e00\u5207\u554f\u984c\u4e86\uff1f\u4f60\u679c\u7136\u662f\u4e0d\u5207\u5be6\u969b\u7684\u7406\u60f3\u4e3b\u7fa9\u8005\uff01\u6700\u597d\u662f\u6709\u6846\u67b6\u5e79\u9019\u9ebc\u56c9\u5506\u7684\u4e8b\u60c5\uff01<\/em><\/strong><\/p>\n<p>\u6709\uff01\u5b83\u5c31\u662fCake(PHP)\u6846\u67b6\uff01<\/p>\n<p>\u770b\u770bCake\u5728Model\u5e95\u4e0b\u653e\u4e86\u4ec0\u9ebc\uff1a<\/p>\n<pre>\r\n\/View\r\n\/Controller\r\n\/Model\r\n    \/Behavior\r\n    \/Entity\r\n    \/Table\r\n<\/pre>\n<p>\u770b\u5230\u4e86\u55ce\uff1f<\/p>\n<p>Cake\u6015\u4f60\u628aentity\u7576\u6210\u6574\u500bmodel\uff0c\u76f4\u63a5\u64fa\u597d\u5e7e\u500b\u8cc7\u6599\u593e\uff0c\u903c\u4f60\u53bb\u601d\u8003entity\u8ddfmodel\u662f\u4ec0\u9ebc\u3002<\/p>\n<p>\u66ff\u9019\u4e9b\u7528\u5fc3\u826f\u82e6\u7684\u6846\u67b6\u6b61\u547c\u5427\uff01<\/p>\n<p><strong><em>Q7: \u5c08\u6ce8\u65bc\u8a0e\u8ad6\u4e8b\u60c5\u672c\u8eab\u662f\u4e0d\u662f\uff01\u90a3Cake\u7684\u300cmodels\u300d\u8cc7\u6599\u593e\u5c31\u6c92\u554f\u984c\u554a\uff01\u4f60\u9084\u8aaa\u4efb\u4f55\u6846\u67b6\u90fd\u4e0d\u80fd\u6709\uff01<\/em><\/strong><\/p>\n<p>\u4f60\u770b\u932f\u4e86\uff0cCake\u6c92\u6709\u300cmodels\u300d\u8cc7\u6599\u593e\uff0c\u4e5f\u6c92\u6709\u300cModels\u300d\u8cc7\u6599\u593e\u3002\u5b83\u53ea\u6709\u300cModel\u300d\u8cc7\u6599\u593e\u3002<\/p>\n<p>\u8cc7\u6599\u593e\u3001package\u3001\u8cc7\u6599\u5eabtable\u547d\u540d\uff0c\u90fd\u6709\u4e00\u500b\u95dc\u65bc\u55ae\u6578\/\u8907\u6578\u7684\u539f\u5247\u53ef\u4ee5\u53c3\u8003\uff1a\u7570\u8cea\u6027\u8207\u540c\u8cea\u6027\u3002<\/p>\n<p>\u4f60\u7684\u300cmodels\u300d\u8cc7\u6599\u593e\u5e95\u4e0b\u4e0d\u518d\u662f\u540c\u5c6centity\u7684class\u4e86\uff0c\u800c\u662f\u5206\u70babehavior\u3001entity\u3001\u4ee5\u53ca\u5176\u4ed6\u4f60\u8a2d\u8a08\u7684\u5206\u985e\uff0c\u4e5f\u5c31\u662f\u7570\u8cea\uff0c\u6240\u4ee5\u61c9\u8a72\u7528\u55ae\u6578\u547d\u540d\u3002<\/p>\n<p>\u53c3\u8003\u9019\u500b\u9023\u7d50\uff1a<\/p>\n<p><a href=\"http:\/\/programmers.stackexchange.com\/questions\/75919\/should-package-names-be-singular-or-plural\">Should package names be singular or plural?<\/a><\/p>\n<p>\u7c21\u55ae\u5730\u8aaa\uff0c\u65e2\u7136model\u4ee3\u8868\u7684\u662flayer\u800c\u975e\u591a\u500bentity\uff0c\u8cc7\u6599\u593e\u547d\u540d\u4e0a\u5c31\u61c9\u8a72\u7528\u55ae\u6578\u800c\u975e\u8907\u6578\u3002<\/p>\n<p>\u597d\u5427\uff0c\u6211\u9019\u6a23\u8aaa\u6709\u9ede\u592a\u56b4\u82db\u4e86\u3002<\/p>\n<p>\u5982\u679c\u4f60\u77e5\u9053\u81ea\u5df1\u5728\u5e79\u561b\u7684\u8a71\uff0c\u5c31\u7e7c\u7e8c\u7528\u4f60\u7684\u300cmodels\u300d\u8cc7\u6599\u593e\u5427\uff0c\u6211\u52c9\u5f37\u53ef\u4ee5\u63a5\u53d7\u3002<\/p>\n<p><strong><em>Q8: \u7b49\u7b49\uff0c\u4e0d\u5c0d\u52c1...\u4f60\u6574\u7bc7\u6587\u7ae0\u6d41\u9732\u4e00\u80a1\u6c23\u606f...\u6211\u89ba\u5f97\u4f60\u4e0d\u4f46\u53cd\u5c0d\u300cmodels\u300d\uff0c\u4f60\u5e7e\u4e4e\u5728\u5426\u5b9aMVC\u7684\u50f9\u503c\uff1f\u4f60\u600e\u9ebc\u53ef\u4ee5\u89ba\u5f97\u5049\u5927\u7684MVC\u6c92\u6709\u50f9\u503c\uff1f<\/em><\/strong><\/p>\n<p>\u6211\u524d\u9762\u63d0\u904e\uff0cTaylor Otwell\u5728Laravel 4\u79fb\u9664\u4e86\u300cmodels\u300d\u8cc7\u6599\u593e\uff0c\u903c\u8feb\u5927\u5bb6\u53bb\u601d\u8003\u300c\u8edf\u9ad4\u67b6\u69cb\u300d\u5230\u5e95\u61c9\u8a72\u662f\u4ec0\u9ebc\u3002<\/p>\n<p>\u6211\u544a\u8a34\u4f60\u7b2c\u4e8c\u4ef6\u4e8b\u3002<\/p>\n<p>\u4f60\u53bb\u901b<a href=\"http:\/\/laravel.com\/\">Laravel\u5b98\u7db2<\/a>\uff0c\u7ffb\u904d\u5b98\u7db2\u4f60\u90fd\u627e\u4e0d\u5230\u300cMVC\u300d\u4e09\u500b\u5b57\u3002<\/p>\n<p>MVC\u540d\u6c23\u591a\u9ebc\u97ff\u4eae\uff01\u54ea\u500bframework\u4e0d\u60f3\u6253\u8457MVC\u7576\u4f5c\u8ce3\u9ede\uff1f\u4f46Laravel\u62d2\u7d55\u9019\u9ebc\u505a\u3002<\/p>\n<p>\u6211\u518d\u544a\u8a34\u4f60\u7b2c\u4e09\u4ef6\u4e8b\u3002<\/p>\n<p>2015\u5e74\u6700\u65b0\u51fa\u7210\u7684Laravel 5\uff0c\u5b83\u7684views\u5728resources\/\u5e95\u4e0b\uff0ccontrollers\u5728app\/Http\/\u5e95\u4e0b\u3002\u4e00\u6a23\u6c92\u6709models\u3002<\/p>\n<p>\u6240\u4ee5\u4f60\u795e\u8056\u7684MVC\u5728Laravel 5\u5e95\u4e0b\u9577\u9019\u6a23\uff1a<\/p>\n<pre>\r\n\/resources\r\n    \/views\r\n    \/lang\r\n    \/assets\r\n\/app\r\n    \/Commands\t\r\n    \/Console\t\r\n    \/Events\t\r\n    \/Exceptions\t\r\n    \/Handlers\t\r\n    \/Http\t\r\n    \/Providers\t\r\n    \/Services\t\r\n    \/Https\r\n        \/Controllers\r\n        \/Middleware\t\r\n        \/Requests\r\n<\/pre>\n<p>\u4f60\u63a8\u5d07\u7684V\u8ddfC\u4e0d\u518d\u4f54\u64da\u6a94\u6848\u7d50\u69cb\u7684\u6838\u5fc3\u4f4d\u7f6e\u4e86\u3002\u4f60\u6700\u611b\u7684MVC\u73fe\u5728\u770b\u8d77\u4f86\u662f\u5982\u6b64\u6e3a\u5c0f\uff0c<\/p>\n<p>\u5c0f\u5230\u6c92\u6709\u8a0e\u8ad6\u50f9\u503c\uff0c\u5c0f\u5230\u6beb\u7121\u610f\u7fa9\u53ef\u8a00\u3002<\/p>\n<p>\u300cMVC\u662f\u4e09\u500b\u6975\u5ea6\u4e0d\u5c0d\u7a31\u7684\u5b58\u5728\u300d\uff0c\u9019\u662f\u500b\u592a\u904e\u5ba2\u6c23\u7684\u8aaa\u6cd5\u3002<\/p>\n<p>MVC\u9019\u500b\u89c0\u5ff5\u5df2\u7d93\u7121\u6cd5\u5354\u52a9\u6211\u5011\u8a0e\u8ad6\u548c\u601d\u8003\u4e86\u3002\u653e\u4e0b\u5b83\uff0c\u5f80\u524d\u8d70\u5427\u3002<\/p>\n<p>\u6211\u4f86\u81eaLaravel\u793e\u7fa4\u3002\u6211\u5011\u4e0d\u8072\u7a31\u81ea\u5df1\u64c1\u6234MVC\u3002<\/p>\n<p>\u4f86\u628a\u6642\u9593\u82b1\u5728\u771f\u6b63\u503c\u5f97\u8a0e\u8ad6\u7684\u6982\u5ff5\u4e0a\u5427\uff1a\u4f60\u6b63\u5728\u7528\u7684\u6846\u67b6\uff0c\u67b6\u69cb\u5408\u7406\u55ce\uff1f\u6846\u67b6\u6709\u6c92\u6709\u64cb\u4f4f\u4f60\u7684\u8def\uff1f\u4f60\u5728\u6846\u67b6\u4e4b\u4e0b\u8a2d\u8a08\u51fa\u7684\u5c08\u6848\u67b6\u69cb\u6f02\u4eae\u55ce\uff1f\u5927\u4e2d\u5c0f\u578b\u5c08\u6848\u901a\u7528\u7684\u67b6\u69cb\u5b58\u5728\u55ce\uff1f\u5982\u4f55\u5206\u8fa8\u4f7f\u7528\u6642\u6a5f\uff1f\u600e\u9ebc\u505a\u6703\u6700\u5f48\u6027\uff1f\u8a72\u600e\u9ebc\u63cf\u8ff0\u67d0\u500b\u6846\u67b6\u624d\u4e0d\u6703\u5c0d\u65b0\u624b\u63e0\u82d7\u52a9\u9577\uff1f<\/p>\n<p>\u653e\u4e0b\u4f60\u51e1\u4e8b\u90fd\u8981\u5957\u9032MVC\u7684\u57f7\u8457\uff0c\u8acb\u76f4\u63a5\u601d\u8003\u300c\u8edf\u9ad4\u67b6\u69cb\u300d\u7684\u672c\u8cea\u3002<\/p>\n<p>\u554a\uff0c\u6211\u770b\u5230MVC\u7c89\u7d72\u5c0dLaravel 5\u7684\u5206\u6790\u4e86\uff1a<\/p>\n<p>\u300c<br \/>\nMVC\u4f9d\u7136\u767c\u63ee\u91cd\u8981\u7684\u8a0e\u8ad6\u50f9\u503c\uff01\u6211\u770b\u5230Controllers\u8cc7\u6599\u593e\u4e86\uff01\u6211\u770b\u5230views\u8cc7\u6599\u593e\u4e86\uff01<br \/>\n\u5269\u4e0b\u7684\u5341\u5e7e\u500b\u8cc7\u6599\u593e\u5168\u90e8\u7d71\u7a31\u70baModel\uff01\u679c\u7136\u662f\u8c50\u5bcc\u53c8\u539a\u91cd\u7684layer\uff01<br \/>\n\u6211\u5011\u4f86\u8a0e\u8ad6Model\u662f\u4ec0\u9ebc\u5427\uff01MVC\u842c\u6b72\uff01<br \/>\n\u300d<\/p>\n<p>\u670b\u53cb\uff0c\u795d\u798f\u4f60\u80fd\u5f97\u51fa\u6709\u610f\u7fa9\u7684\u7d50\u8ad6\u3002<\/p>\n<hr \/>\n<h3>\u5c0f\u6731\u91dd\u5c0d\u672c\u6587\u7684\u5ef6\u4f38\u8a0e\u8ad6\uff082015-4-19\u88dc\u5145\uff09<\/h3>\n<p><a href=\"http:\/\/www.dotblogs.com.tw\/regionbbs\/archive\/2015\/04\/06\/150963.aspx\">[\u7d93\u9a57\u8ac7] \u7121\u62db\u52dd\u6709\u62db<\/a><\/p>\n<p>(Photo via <a href=\"https:\/\/www.flickr.com\/photos\/alyssafilmmaker\/\">Alyssa L. Miller<\/a>, CC licensed.)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5404\u5927back-end framework\u5e7e\u4e4e\u90fd\u63a1\u7528\u4e86\u300cMVC\u300d\u67b6\u69cb\u3002 \u5b83\u5011\u81f3\u5c11\u6703\u6709\u300cviews\u300d\u3001\u300c cont &hellip; <a href=\"https:\/\/blog.turn.tw\/?p=1541\" class=\"more-link\">\u7e7c\u7e8c\u95b1\u8b80 <span class=\"screen-reader-text\">\u6846\u67b6\u4e0d\u61c9\u8a72\u6709\u300cmodels\u300d\u8cc7\u6599\u593e<\/span> <span class=\"meta-nav\">&rarr;<\/span> <\/a><\/p>\n","protected":false},"author":1,"featured_media":1909,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_mi_skip_tracking":false},"categories":[2,4],"tags":[8,7,6,36,25],"_links":{"self":[{"href":"https:\/\/blog.turn.tw\/index.php?rest_route=\/wp\/v2\/posts\/1541"}],"collection":[{"href":"https:\/\/blog.turn.tw\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.turn.tw\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.turn.tw\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.turn.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1541"}],"version-history":[{"count":170,"href":"https:\/\/blog.turn.tw\/index.php?rest_route=\/wp\/v2\/posts\/1541\/revisions"}],"predecessor-version":[{"id":2224,"href":"https:\/\/blog.turn.tw\/index.php?rest_route=\/wp\/v2\/posts\/1541\/revisions\/2224"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.turn.tw\/index.php?rest_route=\/wp\/v2\/media\/1909"}],"wp:attachment":[{"href":"https:\/\/blog.turn.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1541"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.turn.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1541"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.turn.tw\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1541"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}