{"id":3395,"date":"2023-07-04T18:00:44","date_gmt":"2023-07-04T11:00:44","guid":{"rendered":"https:\/\/www.marketenterprise.vn\/blog\/?p=3395"},"modified":"2023-07-31T18:56:15","modified_gmt":"2023-07-31T11:56:15","slug":"tich-hop-vue-voi-cakephp","status":"publish","type":"post","link":"https:\/\/www.marketenterprise.vn\/blog\/tich-hop-vue-voi-cakephp.html","title":{"rendered":"T\u00edch h\u1ee3p Vue.js v\u1edbi CakePHP framework"},"content":{"rendered":"<h2>T\u1ed5ng quan<\/h2>\n<p><span style=\"font-weight: 400;\"><a href=\"https:\/\/cakephp.org\/\" target=\"_blank\" rel=\"noopener\">CakePHP<\/a> l\u00e0 m\u1ed9t framework tuy\u1ec7t v\u1eddi \u0111\u1ec3 x\u00e2y d\u1ef1ng c\u00e1c \u1ee9ng d\u1ee5ng web truy\u1ec1n th\u1ed1ng m\u1ed9t c\u00e1ch nhanh ch\u00f3ng. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Nh\u01b0ng m\u1ecdi \u1ee9ng d\u1ee5ng \u0111\u1ec1u c\u1ea7n t\u00ednh t\u01b0\u01a1ng t\u00e1c v\u00e0 th\u01b0\u1eddng th\u00ec \u0111i\u1ec1u \u0111\u00f3 ph\u1ea3i \u0111\u01b0\u1ee3c th\u1ef1c hi\u1ec7n m\u00e0 kh\u00f4ng c\u1ea7n t\u1ea3i ho\u1eb7c l\u00e0m m\u1edbi to\u00e0n b\u1ed9 trang web. \u0110\u00f3 l\u00e0 n\u01a1i JavaScript xu\u1ea5t hi\u1ec7n v\u00e0 c\u00f3 r\u1ea5t nhi\u1ec1u th\u01b0 vi\u1ec7n JS v\u00e0 khung nh\u01b0 Vue, React, v.v. gi\u00fap d\u1ec5 d\u00e0ng th\u00eam t\u00ednh t\u01b0\u01a1ng t\u00e1c v\u00e0o \u1ee9ng d\u1ee5ng c\u1ee7a b\u1ea1n. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">C\u0169ng trong v\u00e0i n\u0103m qua, c\u00e1c \u1ee9ng d\u1ee5ng trang \u0111\u01a1n (hay th\u01b0\u1eddng \u0111\u01b0\u1ee3c g\u1ecdi l\u00e0 SPA) \u0111ang tr\u1edf n\u00ean ph\u1ed5 bi\u1ebfn.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u0110i\u1ec1u \u0111\u00f3 c\u00f3 ngh\u0129a l\u00e0 Vue ho\u1eb7c React c\u00f3 th\u1ec3 gi\u00fap x\u00e2y d\u1ef1ng front-end d\u1ec5 d\u00e0ng, n\u00f3 kh\u00f4ng th\u1ec3 thay th\u1ebf back-end. V\u00ec v\u1eady, \u0111i\u1ec1u c\u1ea7n thi\u1ebft l\u00e0 ph\u1ea3i t\u00edch h\u1ee3p c\u1ea3 front-end v\u00e0 back-end \u0111\u00fang c\u00e1ch \u0111\u1ec3 ch\u00fang ta c\u00f3 th\u1ec3 t\u1eadn d\u1ee5ng t\u1ed1t nh\u1ea5t c\u1ea3 hai th\u1ebf gi\u1edbi.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">M\u1eb7c d\u00f9 vi\u1ec7c t\u00edch h\u1ee3p c\u00e1c khung JS hi\u1ec7n \u0111\u1ea1i (Vue ho\u1eb7c React) v\u1edbi CakePHP th\u1ef1c s\u1ef1 d\u1ec5 d\u00e0ng, nh\u01b0ng kh\u00f4ng c\u00f3 h\u01b0\u1edbng d\u1eabn ho\u1eb7c t\u00e0i nguy\u00ean n\u00e0o cho bi\u1ebft ch\u00ednh x\u00e1c c\u00e1ch th\u1ef1c hi\u1ec7n. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">T\u00f4i th\u01b0\u1eddng th\u1ea5y m\u1ecdi ng\u01b0\u1eddi \u0111\u0103ng c\u00e2u h\u1ecfi v\u1ec1 c\u00e1ch th\u1ee9c ho\u1eb7c ph\u01b0\u01a1ng ph\u00e1p hay nh\u1ea5t \u0111\u1ec3 t\u00edch h\u1ee3p <a href=\"https:\/\/www.marketenterprise.vn\/blog\/vuejs-la-gi.html\">Vue.js<\/a> v\u1edbi CakePHP v\u00e0 n\u00f3i r\u1eb1ng kh\u00f4ng c\u00f3 t\u00e0i nguy\u00ean n\u00e0o c\u00f3 th\u1ec3 gi\u00fap h\u1ecd.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">V\u00ec v\u1eady, \u1edf \u0111\u00e2y t\u00f4i \u0111ang c\u1ed1 g\u1eafng tr\u1ea3 l\u1eddi c\u00e2u h\u1ecfi c\u1ee7a h\u1ecd v\u1ec1 c\u00e1ch t\u00edch h\u1ee3p Vue.js v\u1edbi CakePHP. M\u1eb7c d\u00f9 t\u00f4i \u0111ang t\u1eadp trung v\u00e0o Vue.js \u1edf giao di\u1ec7n ng\u01b0\u1eddi d\u00f9ng nh\u01b0ng kh\u00e1i ni\u1ec7m\/\u00fd t\u01b0\u1edfng chung s\u1ebd gi\u1ed1ng v\u1edbi React ho\u1eb7c Svelte ho\u1eb7c b\u1ea5t k\u1ef3 khung giao di\u1ec7n ng\u01b0\u1eddi d\u00f9ng n\u00e0o kh\u00e1c.<\/span><\/p>\n<h2>C\u00e0i \u0111\u1eb7t<\/h2>\n<figure id=\"attachment_3413\" aria-describedby=\"caption-attachment-3413\" style=\"width: 300px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2023\/06\/20183641\/Screenshot-2023-06-20-at-18.36.17-300x122.png\" alt=\"VueJS vs CakePHP\" width=\"300\" height=\"122\" class=\"wp-image-3413 size-medium\" title=\"VueJS &amp; CakePHP\" srcset=\"https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2023\/06\/20183641\/Screenshot-2023-06-20-at-18.36.17-300x122.png 300w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2023\/06\/20183641\/Screenshot-2023-06-20-at-18.36.17-1024x416.png 1024w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2023\/06\/20183641\/Screenshot-2023-06-20-at-18.36.17-768x312.png 768w, https:\/\/mevn-public.s3-ap-southeast-1.amazonaws.com\/marketenterprise.vn\/wp-images\/2023\/06\/20183641\/Screenshot-2023-06-20-at-18.36.17.png 1310w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><figcaption id=\"caption-attachment-3413\" class=\"wp-caption-text\">VueJS &amp; CakePHP<\/figcaption><\/figure>\n<h4><span style=\"font-weight: 400;\">Tr\u01b0\u1edbc ti\u00ean, h\u00e3y t\u1ea1o m\u1ed9t d\u1ef1 \u00e1n CakePHP m\u1edbi th\u00f4ng qua l\u1ec7nh composer:<\/span><\/h4>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-linenumbers=\"false\">composer create-project --prefer-dist cakephp\/app:~4.0 cakephp-vuejs-app<\/pre>\n<h4><span style=\"font-weight: 400;\">B\u00e2y gi\u1edd h\u00e3y c\u00e0i \u0111\u1eb7t plugin AssetMix b\u1eb1ng l\u1ec7nh:<\/span><\/h4>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">composer require ishanvyas22\/asset-mix<\/pre>\n<p><span style=\"font-weight: 400;\">T\u1ea1i sao plugin n\u00e0y? Ch\u00e0, plugin n\u00e0y gi\u00fap ch\u00fang ta t\u00edch h\u1ee3p Laravel Mix v\u1edbi CakePHP framework m\u1ed9t c\u00e1ch d\u1ec5 d\u00e0ng. Plugin n\u00e0y s\u1ebd g\u00e1nh t\u1ea5t c\u1ea3 c\u00f4ng vi\u1ec7c kh\u00f3 kh\u0103n cho ch\u00fang t\u00f4i \u0111\u1ec3 ch\u00fang t\u00f4i c\u00f3 th\u1ec3 t\u1eadp trung v\u00e0o vi\u1ec7c x\u00e2y d\u1ef1ng \u1ee9ng d\u1ee5ng v\u1edbi Vue.js v\u00e0 CakePHP.<\/span><\/p>\n<h2>C\u1ea5u h\u00ecnh<\/h2>\n<p><span style=\"font-weight: 400;\">1. Load plugin b\u1eb1ng c\u00e1ch s\u1eed d\u1ee5ng l\u1ec7nh sau:<\/span><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">bin\/cake plugin load AssetMix<\/pre>\n<p><span style=\"font-weight: 400;\">2. T\u1ea1o th\u01b0 m\u1ee5c tri\u1ec3n khai Vue.js b\u1eb1ng l\u1ec7nh sau:<\/span><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">bin\/cake asset_mix generate --dir=resources<\/pre>\n<p><span style=\"font-weight: 400;\">3. C\u00e0i \u0111\u1eb7t c\u00e1c g\u00f3i c\u1ea7n thi\u1ebft cho font-end:<\/span><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">npm install<\/pre>\n<p><span style=\"font-weight: 400;\">4. Tri\u1ec3n khai font-end \u0111\u1ec3 c\u00f3 th\u1ec3 ch\u1ea1y tr\u00ean tr\u00ecnh duy\u1ec7t:<\/span><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">npm run dev<\/pre>\n<p>5. Sau khi ch\u1ea1y l\u1ec7nh <b><i>npm run dev<\/i><\/b><span>, 1 file <\/span><b>app.js <\/b><span>\u0111\u01b0\u1ee3c build ra. Ti\u1ebfp theo, ch\u00fang ta s\u1ebd nh\u00fang file n\u00e0y v\u00e0o layout:<\/span><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">&lt;?= $this-&gt;AssetMix-&gt;script('app') ?&gt;<\/pre>\n<p><span style=\"font-weight: 400;\">6. Th\u00eam d\u00f2ng b\u00ean d\u01b0\u1edbi v\u00e0o file src\/View\/AppView.php:<\/span><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">$this-&gt;loadHelper('AssetMix.AssetMix');<\/pre>\n<p>T\u1ea5t c\u1ea3 \u0111\u00e3 xong, ch\u00fang ta \u0111\u00e3 s\u1eb5n s\u00e0ng s\u1eed d\u1ee5ng Vue.js v\u1edbi CakePHP<\/p>\n<h2>Ki\u1ec3m th\u1eed<\/h2>\n<p><span style=\"font-weight: 400;\">B\u00e2y gi\u1edd ch\u00fang ta s\u1ebd t\u1ea1o 1 view file <\/span><span style=\"font-weight: 400;\">templates\/Pages\/greet.php <\/span><span style=\"font-weight: 400;\">v\u00e0 nh\u00fang Vue component v\u00e0o:<\/span><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">&lt;div id=\"app\"&gt;\r\n    &lt;h1&gt;Greetings&lt;\/h1&gt;\r\n    &lt;!-- Load AppGreet component --&gt;\r\n    &lt;app-greet&gt;&lt;\/app-greet&gt;\r\n&lt;\/div&gt;\r\n<\/pre>\n<p><span style=\"font-weight: 400;\">Ti\u1ebfp theo ch\u1ea1y l\u1ec7nh bin\/cake server \u0111\u1ec3 start nhanh 1 server v\u00e0 v\u00e0o tr\u00ecnh duy\u1ec7t v\u1edbi url: localhost:8765\/pages\/greet<\/span><\/p>\n<p><span style=\"font-weight: 400;\">K\u1ebft qu\u1ea3 ch\u00fang ta s\u1ebd th\u1ea5y hi\u1ec3n th\u1ecb\u00a0 d\u00f2ng ch\u1eef Hello world<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Ti\u1ebfp theo, ch\u00fang ta s\u1ebd th\u1eed thay \u0111\u1ed5i ch\u1eef Hello world b\u1eb1ng c\u00e1ch thay \u0111\u1ed5i n\u1ed9i dung c\u1ee7a file: resources\/js\/components\/AppGreet.vue<\/span><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">&lt;template&gt;\r\n  &lt;div&gt;\r\n    Welcome to Market Enterprise\r\n  &lt;\/div&gt;\r\n&lt;\/template&gt;<\/pre>\n<p><span style=\"font-weight: 400;\">Sau khi thay \u0111\u1ed5i n\u1ed9i dung, ch\u00fang ta s\u1ebd ch\u1ea1y l\u1ea1i l\u1ec7nh npm run dev \u0111\u1ec3 build l\u1ea1i. Ch\u1ea1y l\u1ea1i url localhost:8765\/pages\/greet, k\u1ebft qu\u1ea3 ch\u00fang ta s\u1ebd nh\u1eadn \u0111\u01b0\u1ee3c ch\u1eef Welcome to Market Enterprise.<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Trong b\u00e0i n\u00e0y, t\u00f4i xin chia s\u1ebb m\u1ed9t c\u00e1ch t\u00edch h\u1ee3p VueJS v\u00e0o CakePHP kh\u00e1 th\u00fa v\u1ecb.<\/p>\n","protected":false},"author":51,"featured_media":3409,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-3395","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technology"],"_links":{"self":[{"href":"https:\/\/www.marketenterprise.vn\/blog\/wp-json\/wp\/v2\/posts\/3395","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.marketenterprise.vn\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.marketenterprise.vn\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.marketenterprise.vn\/blog\/wp-json\/wp\/v2\/users\/51"}],"replies":[{"embeddable":true,"href":"https:\/\/www.marketenterprise.vn\/blog\/wp-json\/wp\/v2\/comments?post=3395"}],"version-history":[{"count":0,"href":"https:\/\/www.marketenterprise.vn\/blog\/wp-json\/wp\/v2\/posts\/3395\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.marketenterprise.vn\/blog\/wp-json\/wp\/v2\/media\/3409"}],"wp:attachment":[{"href":"https:\/\/www.marketenterprise.vn\/blog\/wp-json\/wp\/v2\/media?parent=3395"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.marketenterprise.vn\/blog\/wp-json\/wp\/v2\/categories?post=3395"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.marketenterprise.vn\/blog\/wp-json\/wp\/v2\/tags?post=3395"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}