{"id":3250,"date":"2016-07-09T17:03:43","date_gmt":"2016-07-09T09:03:43","guid":{"rendered":"http:\/\/blog.turn.tw\/?p=3250"},"modified":"2016-07-09T17:51:38","modified_gmt":"2016-07-09T09:51:38","slug":"%e5%9c%a8-laravel-%e4%b8%8b%e5%af%ab%e6%b8%ac%e8%a9%a6%e7%9a%843%e5%80%8b%e7%b0%a1%e5%96%ae%e6%96%b9%e6%b3%95","status":"publish","type":"post","link":"https:\/\/blog.turn.tw\/?p=3250","title":{"rendered":"\u958b\u767c\u7db2\u7ad9\u6642\uff0c\u5beb\u6e2c\u8a66\u76843\u500b\u7c21\u55ae\u65b9\u6cd5"},"content":{"rendered":"<p>\u8a31\u591a\u60f3\u8981\u5b78\u5beb\u6e2c\u8a66\u7684\u670b\u53cb\uff0c\u5e38\u5e38\u4e0d\u77e5\u9053\u600e\u9ebc\u958b\u59cb\u3002<\/p>\n<p>\u5176\u5be6\u5beb\u6e2c\u8a66\u6bd4\u5927\u591a\u6578\u4eba\u4ee5\u70ba\u7684\u9084\u8981\u7c21\u55ae\u3002<\/p>\n<p>\u5c31\u7b97\u662f\u5c0f\u578b\u7684\u7db2\u7ad9\u3001\u7c21\u55ae\u7684\u8cfc\u7269\u7db2\u7ad9\uff0c\u4e5f\u53ef\u4ee5\u5229\u7528\u8edf\u9ad4\u6e2c\u8a66\u52a0\u5f37\u8edf\u9ad4\u54c1\u8cea\u3002<\/p>\n<p>\u4eca\u5929\u8ddf\u5927\u5bb6\u5206\u4eab3\u500b\u7c21\u55ae\u7684\u5c0e\u5165\u6e2c\u8a66\u958b\u767c\u65b9\u6cd5\u3002<\/p>\n<p><em>\uff08\u672c\u6587\u4f7f\u7528 Laravel + PHPUnit \u793a\u7bc4\uff0c\u4f46\u76f8\u95dc\u6982\u5ff5\u901a\u7528\u5728\u4efb\u4f55\u8a9e\u8a00\/\u5de5\u5177\u4e0a\u3002\uff09<\/em><\/p>\n<h1>\u7b2c\u4e00\u62db\u3001controller\u8f49\u79fb\u5230entity<\/h1>\n<p>\u958b\u767c\u7db2\u7ad9\u6642\uff0c\u5927\u90e8\u4efd\u5546\u696d\u908f\u8f2f\u90fd\u5728\u5c0dentity\uff08\u4f8b\uff1a\u7522\u54c1\u3001\u8a02\u55ae\u3001\u4f7f\u7528\u8005&#8230;etc\uff09\u64cd\u4f5c\u3002<\/p>\n<p>\u76f8\u95dc\u7684code\u901a\u5e38\u6703\u6563\u5728controller\u88e1\u9762\u3002<\/p>\n<p>\u8209\u4f8b\u4f86\u8aaa\uff0c\u5047\u8a2d\u6211\u5011\u5728\u5beb\u4e00\u500b\u8cfc\u7269\u7db2\u7ad9\uff0c\u90a3\u9ebc\u628a\u7522\u54c1\u52a0\u9032\u8a02\u55ae\u3001\u66f4\u65b0\u8a02\u55ae\u91d1\u984d\u7684code\u6703\u50cf\u9019\u6a23\uff1a<\/p>\n<pre>\r\n\/\/ ShoppingController.php\r\n\r\n$product = Product::find(Input::get('product_id'));\r\n\r\n$order->subtotal += $product->price\r\n<\/pre>\n<p>\u5beb\u6e2c\u8a66\u7684\u76ee\u7684\u662f\u70ba\u4e86\u589e\u52a0\u958b\u767c\u8005\u7684\u4fe1\u5fc3\u3002<\/p>\n<p>\u50cf\u4e0a\u9762\u9019\u6a23\u7684code\uff0c\u6709\u4e9b\u4eba\u6703\u89ba\u5f97\u6253\u958b\u700f\u89bd\u5668\u6309\u500b\u5e7e\u6b21\uff0c\u770b\u770b\u6700\u5f8c\u8a02\u55ae\u91d1\u984d\u662f\u5426\u6b63\u78ba\u5c31\u597d\u3002<\/p>\n<p>\u53cd\u8986\u6309\u500b\u5e7e\u6b21\uff0c\u5c31\u7b97\u4e0d\u5beb\u6e2c\u8a66\uff0c\u4e5f\u5c0d\u7a0b\u5f0f\u54c1\u8cea\u5f88\u6709\u628a\u63e1\u3001\u76f8\u4fe1\u5b83\u6c92\u6709bug\u3002<\/p>\n<p>\u4f46\u5982\u679c\u7a0b\u5f0f\u518d\u8907\u96dc\u4e00\u9ede\u5462\uff1f\u4f8b\u5982\u589e\u52a0\u4e0d\u540c\u904b\u8cbb\u7684\u908f\u8f2f\uff1a<\/p>\n<pre>\r\n\/\/ ShoppingController.php\r\n\r\n\/\/ \u6eff\u5343\u5143\u514d\u904b\u8cbb\r\nif ($order->subtotal > 1000) {\r\n    $order->shipping_fee = 0;\r\n} else {\r\n    $order->shipping_fee = 100;\r\n}\r\n<\/pre>\n<p>\u6709\u4e9b\u4eba\u4f9d\u7136\u89ba\u5f97\u9019\u4e0d\u8907\u96dc\uff0c\u5728\u700f\u89bd\u5668\u4e0a\u591a\u64cd\u4f5c\u5e7e\u6b21\uff0c\u7136\u5f8c\u770b\u770b\u91d1\u984d\u3001\u904b\u8cbb\u662f\u5426\u90fd\u6b63\u78ba\u5373\u53ef\u3002<\/p>\n<p>\u4f46\u5982\u679c\u4f60\u50cf\u6211\u4e00\u6a23\uff0c\u63a1\u53d6\u6bd4\u8f03\u56b4\u8b39\u7684\u7acb\u5834\uff0c\u9810\u8a2d\u81ea\u5df1\u5beb\u7684\u6240\u6709code\u90fd\u6709bug\uff0c\u90a3\u9ebc\u53ef\u4ee5\u5148\u628acode\u5f9econtroller\u642c\u5230entity\uff1a<\/p>\n<pre>\r\n\/\/ Order.php\r\n\r\nclass Order extends Eloquent \r\n{\r\n    public function addProdut($product)\r\n    {\r\n        $this->subtotal += $product->price\r\n\r\n        if ($this->subtotal > 1000) {\r\n            $this->shipping_fee = 0;\r\n        } else {\r\n            $this->shipping_fee = 100;\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>\u7136\u5f8c\u53ef\u4ee5\u9019\u6a23\u5beb\u6e2c\u8a66\uff1a<\/p>\n<pre>\r\n\/\/OrderTest.php\r\n\r\nclass OrderTest extends TestCase \r\n{\r\n\r\n    public function test_addProdut_with_shipping_fee() \r\n    { \r\n        $product = new Product();\r\n\r\n        $product->price = 800;\r\n\r\n        $order = new Order();\r\n\r\n        $order->addProduct($product);\r\n\r\n        $this->assertEquals(100, $order->shipping_fee); \r\n    }\r\n\r\n    public function test_addProdut_without_shipping_fee() \r\n    { \r\n        $product = new Product();\r\n\r\n        $product->price = 1500;\r\n\r\n        $order = new Order();\r\n\r\n        $order->addProduct($product);\r\n\r\n        $this->assertEquals(0, $order->shipping_fee); \r\n    }\r\n\r\n}\r\n<\/pre>\n<p>\u50cf\u9019\u6a23\u7684\u6e2c\u8a66\u5beb\u597d\u4e4b\u5f8c\uff0c\u5c31\u4e0d\u7528\u6bcf\u6b21\u6539\u52d5\u4e00\u9ede\u5546\u696d\u908f\u8f2f\uff0c\u5c31\u6253\u958b\u700f\u89bd\u5668\u91cd\u8907\u505a\u4e00\u5806\u4eba\u5de5\u6e2c\u8a66\u4e86\u3002<\/p>\n<p>\u5982\u679c\u904b\u8cbb\u7684\u7b97\u6cd5\u66f4\u8907\u96dc\uff0c\u6839\u64da\u8a02\u55ae\u91d1\u984d\u800c\u67094\u30015\u7a2e\u904b\u8cbb\u91d1\u984d\u7684\u8a71\uff0c<\/p>\n<p>\u5149\u662f\u8981\u6e2c\u8a66\u904b\u8cbb\u908f\u8f2f\uff0c\u5c31\u8981\u4eba\u5de5\u53bb\u64cd\u4f5c\u4e0b\u55ae\u6d41\u7a0b\u597d\u5e7e\u6b21\u3002<\/p>\n<p>\u9019\u7a2e\u6642\u5019\uff0c\u5beb\u6e2c\u8a66\u65b9\u4fbf\u591a\u4e86\u3002<\/p>\n<p>\u9019\u7a2e\u958b\u767c\u6d41\u7a0b\uff0c\u6211\u7a31\u70ba\u300ccontroller\u8f49\u79fb\u5230entity\u300d\u3002<\/p>\n<p>\u4e00\u958b\u59cb\u908f\u8f2f\u55ae\u7d14\u7684\u6642\u5019\uff0c\u76f4\u63a5\u5beb\u5728controller\u5373\u53ef\u3002<\/p>\n<p>\u8907\u96dc\u8d77\u4f86\u5f8c\uff0c\u518d\u628acode\u8f49\u79fb\u9032entity\uff0c\u7136\u5f8c\u88dc\u5beb\u6e2c\u8a66\u5373\u53ef\u3002<\/p>\n<h1>\u7b2c\u4e8c\u62db\u3001\u8f49\u79fb\u5230service<\/h1>\n<p>\u63a5\u7e8c\u4e0a\u9762\u7684\u4f8b\u5b50\uff0c\u4f86\u770b\u770b\u66f4\u8907\u96dc\u7684\u4f8b\u5b50\u3002<\/p>\n<p>\u73fe\u5728\u7522\u54c1\u8ce3\u6389\u7684\u6642\u5019\uff0c\u7522\u54c1\u672c\u8eab\u7684\u5eab\u5b58\u6578\u91cf\u8981\u6e1b\u4e00\u3002<\/p>\n<p>\u4ee5\u539f\u672c\u7684\u5beb\u6cd5\u4f86\u8aaa\uff0c\u9700\u8981\u5728entity\u52a0\u4e0a\u9019\u4e00\u884c\uff1a<\/p>\n<pre>\r\n\/\/ Order.php\r\n\r\n$product->amount -= 1;\r\n<\/pre>\n<p>\u7136\u5f8c\u5728\u6e2c\u8a66\u5167\u591a\u52a0\u5e7e\u884c\uff1a<\/p>\n<pre>\r\n\/\/OrderTest.php\r\n\r\n$originalAmount = $product->amount;\r\n\r\n$order->addProduct($product);\r\n\r\n$this->assertEquals($originalAmount - 1, $product->amount); \r\n<\/pre>\n<p>\u770b\u8d77\u4f86\u6c92\u591a\u5927\u554f\u984c\u3002\u908f\u8f2f\u653e\u5728Order\u5167\u9084\u7b97\u5408\u7406\uff0c\u8a72\u6e2c\u7684\u4e5f\u90fd\u6e2c\u5230\u4e86\u3002<\/p>\n<p>\u4f46\u5982\u679c\u908f\u8f2f\u518d\u8907\u96dc\u4e00\u9ede\u5462\uff1f<\/p>\n<p>\u5047\u8a2d\u6709\u4eba\u6c23\u6307\u6578\u7684\u529f\u80fd\uff0c\u5728\u8ce3\u51fa\u53bb\u7684\u540c\u6642\uff0c\u5546\u54c1\u7684\u4eba\u6c23\u6307\u6578\u8981\u52a0\u4e0a10\u5206\uff1a<\/p>\n<pre>\r\n$product->trending_score += 10\r\n<\/pre>\n<p>\u9019\u884ccode\u9084\u662f\u653e\u5728Order\u985e\u5225\u5167\u55ce\uff1f<\/p>\n<p>\u70ba\u4ec0\u9ebc\u4e00\u5b9a\u662f$order->addProduct($product)\uff0c\u800c\u4e0d\u80fd\u662f$product->addToOrder($order)\u5462\uff1f<\/p>\n<p>\u96a8\u8457Product\u76f8\u95dc\u908f\u8f2f\u8b8a\u591a\uff0c\u5546\u54c1\u52a0\u5165\u8a02\u55ae\u7684\u529f\u80fd\u4e0d\u518d\u5b8c\u5168\u50cf\u662f\u8a02\u55ae\u7684\u4e8b\uff0c\u4e5f\u5f88\u50cf\u662fProduct\u7684\u4e8b\u3002<\/p>\n<p>\u50cf\u9019\u7a2e\u4e0d\u77e5\u9053\u8981\u653e\u5728Order\u5167\u9084\u662fProduct\u5167\u7684\u6642\u5019\uff0c\u53ef\u4ee5\u7368\u7acb\u51fa\u4f86\u6210Service\u985e\u5225\uff1a<\/p>\n<pre>\r\nclass AddProductToOrder\r\n{\r\n    public function handle($product, $order)\r\n    {\r\n        \/\/blah\r\n    }\r\n}\r\n<\/pre>\n<p>\u6e2c\u8a66\u7684\u6642\u5019\uff0c\u6539\u5beb\u6210\u9019\u6a23\u5373\u53ef\uff1a<\/p>\n<pre>\r\nclass AddProductToOrderTest extends TestCase \r\n{\r\n\r\n    public function test_handle_with_shipping_fee() \r\n    { \r\n        $product = new Product();\r\n\r\n        $product->price = 800;\r\n\r\n        $order = new Order();\r\n\r\n        $service = new AddProductToOrder();\r\n\r\n        $service->handle($product, $order);\r\n\r\n        $this->assertEquals(100, $order->shipping_fee); \r\n    }\r\n\r\n    public function test_handle_product_amount()\r\n    {\r\n        \/\/ blah\r\n    }\r\n\r\n    public function test_handle_product_trending_score()\r\n    {\r\n        \/\/ blah\r\n    }\r\n\r\n}\r\n<\/pre>\n<p>\u8ddf\u7b2c\u4e00\u62db\u4e00\u6a23\uff0c\u53ef\u4ee5\u5728\u7a0b\u5f0f\u8b8a\u5927\u4e4b\u5f8c\u3001\u6709\u5fc5\u8981\u7684\u6642\u5019\u624d\u7368\u7acb\u6210service\u985e\u5225\u4e26\u88dc\u5beb\u6e2c\u8a66\u3002<\/p>\n<p>\u8f49\u79fb\u7684\u6210\u672c\u662f\u5f88\u4f4e\u7684\uff0c\u5e7e\u4e4e\u53ea\u662f\u628acode\u5f9e\u9019\u908a\u526a\u4e0b\u8cbc\u4e0a\u5230\u90a3\u908a\u800c\u5df2\u3002<\/p>\n<h1>\u7b2c\u4e09\u62db\u3001\u8f49\u79fb\u5230\u5c08\u9580\u7684POPO <\/h1>\n<p>POPO\uff08Plain Old PHP Object\uff09\u662f\u6307\u55ae\u7d14\u7684\u5168\u624b\u5beb\u985e\u5225\uff0c\u4e0d\u53bb\u7e7c\u627fEloquent\u4e4b\u985e\u7684\u83ef\u9e97\u985e\u5225\u3002<\/p>\n<p>\u96d6\u7136\u662f\u6700\u57fa\u672c\u7684OOP\u7528\u6cd5\uff0c\u537b\u5e38\u5e38\u88ab\u4eba\u5011\u6240\u5ffd\u7565\u3002<\/p>\n<p>\u73fe\u5728\u5047\u8a2d\u8a02\u55ae\u9032\u4e00\u6b65\u8b8a\u8907\u96dc\uff0c\u904b\u8cbb\u7684\u908f\u8f2f\u6703\u6839\u64da\u6d88\u8cbb\u8005\u7684\u6240\u5728\u5730\u5340\u800c\u6709\u4e0d\u540c\uff1a<\/p>\n<pre>\r\nclass AddProductToOrder\r\n{\r\n    public function handle($product, $order, $country)\r\n    {\r\n        \/\/ blah\r\n\r\n        if ($country == 'taiwan') {\r\n            if ($order->subtotal > 1000) {\r\n                \/\/ set shipping fee\r\n            } else {\r\n                \/\/ set shipping fee\r\n            }\r\n        } else if ($country == 'korea') {\r\n            \/\/ set shipping fee\r\n        }\r\n        \/\/blah blah\r\n    }\r\n}\r\n<\/pre>\n<p>\u518d\u52a0\u4e0a\u91d1\u984d\u7684\u8b8a\u5316\uff0c\u5149\u662f\u904b\u8cbb\u672c\u8eab\u7684\u8a08\u7b97\u5c31\u5f88\u8907\u96dc\u3001\u9700\u8981\u5beb\u5f88\u591a\u6e2c\u8a66\u624d\u5b89\u5fc3\u3002<\/p>\n<p>\u8207\u5176\u5728entity\u6216service\u5167\u8a08\u7b97\uff0c\u4e0d\u5982\u5f04\u4e00\u53f0\u904b\u8cbb\u8a08\u7b97\u6a5f\u51fa\u4f86\uff0c\u6703\u66f4\u5206\u5de5\u660e\u78ba\uff1a<\/p>\n<pre>\r\nclass ShippingFeeCalculator\r\n{\r\n    public function calculate($productPrice, $customerCountry)\r\n    {\r\n        \/\/ blah\r\n    }\r\n}\r\n<\/pre>\n<p>\u63a5\u8457\u5c31\u80fd\u66ff\u8a08\u7b97\u6a5f\u5beb\u8a31\u591a\u6e2c\u8a66\uff0c\u6e2c\u5230\u5b89\u5fc3\u70ba\u6b62\uff1a<\/p>\n<pre>\r\nclass ShippingFeeCalculatorTest extends TestCase\r\n{\r\n\r\n    public function test_calculate_taiwan_100_dollar_order()\r\n    {\r\n        $calculator = new ShippingFeeCalculator();\r\n\r\n        $result = $calculator->calculate(100, 'taiwan');\r\n\r\n        $this->assertEquals($someNumber, $result);\r\n    }\r\n\r\n    public function test_calculate_taiwan_600_dollar_order()\r\n    {\r\n        \/\/ blah\r\n    }\r\n\r\n    public function test_calculate_korea_100_dollar_order()\r\n    {\r\n        \/\/ blah\r\n    }\r\n\r\n}\r\n<\/pre>\n<p>\u672c\u4f86\u7684service\u5c31\u53ef\u4ee5\u6539\u5beb\u6210\uff0c\u5403\u8a08\u7b97\u6a5f\u7576\u4f5c\u53c3\u6578\uff1a<\/p>\n<pre>\r\nclass AddProductToOrder\r\n{    \r\n    public function handle($product, $order, $country, $calculator)\r\n    {\r\n        $shippingFee = $calculator->calculate($product->price, $country);\r\n\r\n        \/\/ blah\r\n    }\r\n}\r\n<\/pre>\n<p>POPO\u5e38\u5e38\u88ab\u4eba\u5011\u5fd8\u8a18\uff0c\u56e0\u70ba\u592a\u7fd2\u6163\u628acode\u5168\u90fd\u5beb\u9032entity\u6216\u662fcontroller\u88e1\u9762\u3002<\/p>\n<p>\u5176\u5be6\uff0c\u5728\u7a0b\u5f0f\u8907\u96dc\u8d77\u4f86\u4e4b\u5f8c\uff0c\u6700\u597d\u628a\u610f\u7fa9\u4e0a\u7368\u7acb\u7684\u90e8\u4efd\u5404\u81ea\u7368\u7acb\u6210\u985e\u5225\u3002<\/p>\n<p>\u7136\u5f8c\u5206\u5225\u66ff\u9019\u4e9bPOPO\u5beb\u5404\u5f0f\u5404\u6a23\u7684\u6e2c\u8a66\uff0c\u5c31\u80fd\u5927\u5e45\u589e\u52a0\u8edf\u9ad4\u7684\u54c1\u8cea\u8207\u7a69\u5b9a\u6027\u4e86\u3002<\/p>\n<h1>\u7d50\u8ad6<\/h1>\n<p>\u5beb\u6e2c\u8a66\u7684\u76ee\u7684\u7d14\u7cb9\u662f\u70ba\u4e86\u589e\u52a0\u5b89\u5168\u611f\uff0c\u8b93\u5de5\u7a0b\u5e2b\u665a\u4e0a\u5b89\u5fc3\u5165\u7761\u800c\u5df2\u3002<\/p>\n<p>\u4e0d\u9700\u8981\u64b2\u5929\u84cb\u5730\u822c\u5730\u72c2\u5beb\u6e2c\u8a66\uff0c\u9069\u91cf\u7684\u6e2c\u8a66\u5c31\u975e\u5e38\u8db3\u5920\u3002<\/p>\n<p>\u4ee5\u4e2d\u5927\u578b\u5c08\u6848\u4f86\u8aaa\uff0c\u5beb\u6e2c\u8a66\u53ef\u4ee5\u5e6b\u52a9\u7701\u4e0b\u300c\u975e\u5e38\u5927\u91cf\u7684\u6642\u9593\u300d\u3002<\/p>\n<p>\u5be6\u52d9\u4e0a\uff0c\u5728\u4e00\u958b\u59cb\u5546\u696d\u908f\u8f2f\u4e0d\u591a\u7684\u6642\u5019\uff0c\u5beb\u5728controller\u901a\u5e38\u6c92\u4ec0\u9ebc\u554f\u984c\uff0c\u628a\u5e7e\u500b\u8b8a\u6578\u5b58\u9032\u8cc7\u6599\u5eab\u800c\u5df2\uff0c\u4e0d\u592a\u9700\u8981\u5beb\u6e2c\u8a66\u3002<\/p>\n<p>\u7b49\u5230\u908f\u8f2f\u6162\u6162\u8b8a\u8907\u96dc\uff0c\u767c\u73fe\u4e0d\u5beb\u6e2c\u8a66\u6703\u4e0d\u6562\u4e0a\u7dda\u7684\u6642\u5019\uff0c\u518d\u62c9\u51fa\u4f86\u4e26\u4e14\u88dc\u5beb\u6e2c\u8a66\u5373\u53ef\u3002<\/p>\n<p>\u5e0c\u671b\u4f60\u4e4b\u5f8c\u7684\u5c08\u6848\u958b\u767c\uff0c\u53ef\u4ee5\u8a66\u8a66\u770b\u5beb\u6e2c\u8a66\u5e36\u4f86\u7684\u597d\u8655\u8207\u7f8e\u5999\uff01<\/p>\n<hr \/>\n<p><em>\u6b61\u8fce\u8a02\u95b1<a href='https:\/\/www.facebook.com\/%E8%BD%89%E5%80%8B%E5%BD%8E%E6%97%A5%E8%AA%8C-650279948417734\/'>\u8f49\u500b\u5f4e\u65e5\u8a8c\u7684\u7c89\u7d72\u5c08\u9801<\/a>\uff0c\u6211\u5f88\u6a02\u610f\u548c\u4f60\u5206\u4eab\u5404\u7a2e\u5fc3\u5f97\u3002<\/em><\/p>\n<p>(Photo via Elizabeth Hahn, CC licensed.)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u8a31\u591a\u60f3\u8981\u5b78\u5beb\u6e2c\u8a66\u7684\u670b\u53cb\uff0c\u5e38\u5e38\u4e0d\u77e5\u9053\u600e\u9ebc\u958b\u59cb\u3002 \u5176\u5be6\u5beb\u6e2c\u8a66\u6bd4\u5927\u591a\u6578\u4eba\u4ee5\u70ba\u7684\u9084\u8981\u7c21\u55ae\u3002 \u5c31\u7b97\u662f\u5c0f\u578b\u7684\u7db2\u7ad9\u3001\u7c21\u55ae\u7684\u8cfc &hellip; <a href=\"https:\/\/blog.turn.tw\/?p=3250\" class=\"more-link\">\u7e7c\u7e8c\u95b1\u8b80 <span class=\"screen-reader-text\">\u958b\u767c\u7db2\u7ad9\u6642\uff0c\u5beb\u6e2c\u8a66\u76843\u500b\u7c21\u55ae\u65b9\u6cd5<\/span> <span class=\"meta-nav\">&rarr;<\/span> <\/a><\/p>\n","protected":false},"author":1,"featured_media":3258,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_mi_skip_tracking":false},"categories":[2],"tags":[29,25],"_links":{"self":[{"href":"https:\/\/blog.turn.tw\/index.php?rest_route=\/wp\/v2\/posts\/3250"}],"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=3250"}],"version-history":[{"count":52,"href":"https:\/\/blog.turn.tw\/index.php?rest_route=\/wp\/v2\/posts\/3250\/revisions"}],"predecessor-version":[{"id":3303,"href":"https:\/\/blog.turn.tw\/index.php?rest_route=\/wp\/v2\/posts\/3250\/revisions\/3303"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.turn.tw\/index.php?rest_route=\/wp\/v2\/media\/3258"}],"wp:attachment":[{"href":"https:\/\/blog.turn.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3250"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.turn.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3250"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.turn.tw\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3250"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}