วันศุกร์ที่ 2 กันยายน พ.ศ. 2559

การทำ Virtual host กับ Pretty url เพื่อเรียก URL ได้ง่ายๆ และเป็นมิตรกับ SEO

ออกตัวไว้ก่อนว่าขั้นตอนนี้ไม่จำเป็นต้องทำก็ได้ ไม่ได้มีผลอะไรกับโปรเจคเรามากนัก แต่ทำไว้ดีกว่า เชื่อเถอะ เดี๋ยวเอางานขึ้นโฮสต์จริงก็ต้องทำอยู่ดี !!!

      จากบทความในตอนที่แล้วจะเห็นได้ว่า URL ที่ใช้รัน Frontend และ Backend นั้นทั้งยาวและไม่สวยงาม ในความต้องการคืออยากจะให้ Frontend เข้า URL แรกของเว็[เลยโดยไม่ต้องเข้าหลาย Sub folder และ Backend ก็ให้เป็น Sub folder หนึ่งของ Frontend ในลักษณะอย่างนี้
  1. Frontend จาก Url เดิม http://localhost/yii-application/frontend/web/ เปลี่ยนไปเป็น http://yiiapp.local/
  2. Backend จาก Url เดิม http://localhost/yii-application/backend/web/ เปลี่ยนไปเป็น http://yiiapp.local/admin/
      เมื่อได้ความต้องการอย่างนี้แล้วอย่าเพิ่งคิดว่า "งั้นก็จับย้าย index.php มาอยู่โฟลเดอร์แรกเลยสิ หรือปรับโครงสร้างของไฟล์ และโฟลเดอร์ แล้วค่อยไปไล่โค๊ดเอา" ใจเย็นๆ ก่อนวิธีการนั้นเป็นวิธีการที่ผิดอย่างแรง และยุ่งยากซับซ้อนมาก อีกทั้งถึงสามารถแก้โค๊ดจนทำงานได้ก็จะเจอความลำบากแน่ๆ ในอนาคต

Virtual host

        การที่เราจะใช้งานเว็บไดๆ เราก็ต้องพิมพ์ URL ลงใน Web browser แล้วเว็บนั้นก็จะแสดงผลใน Web browser แล้วเคยสงสัยไหมว่าเราพิมพ์เว็บนี้ลงไปแล้ว Web มันรู้ได้ไงว่าจะเอาข้อมูลมาจากเซิฟเวอร์ตัวไหน คำตอบก็คือก่อนที่จะโหลดข้อมูลเหล่านั้นมา Request Url ของเราจะทำการถามหาที่อยู่ของเว็บไซต์ที่เราใส่ลงไปจาก Domain Name Server หรือชื่อย่อ DNS (ไม่ขออธิบาย DNS นะ นี่ก็ยาวมากแล้ว) แล้วรู้อีกหรือไม่ว่าเครื่องที่เราใช้อยู่ทุกวันนี้เป็น DNS ส่วนตัวอยู่แล้ว ซึ่งมันจะถูกทำงานก่อนจะออกไปหา DNS ข้างนอกก่อนเสมอ ดังนั้นถ้าเราไปปรับตั้งค่าว่าให้เว็บไไดเว็บนึงให้วิ่งไปหาเซิฟเวอร์อะไรก็สามารถทำได้ (แต่จะมีผลเฉพาะเครื่องเราเท่านั้นนะ) เช่นาเราไปตั้งค่า DNS ในเครื่องเราไว้ว่าเว็บไซต์ google.co.th ให้เอาข้อมูลมาจากเซิฟเวอร์ไอพี 127.0.0.1 ดังนั้นเมื่อเครื่องของเราเปิดเว็บ google.co.th ก็จะโหลดข้อมูลจากเครื่องตัวเองเสมอ ไม่เชื่อลองทำดู 55555
        เอาละพร่ามมาซะยาวไปกันต่อดีกว่า จากย่อหน้าที่แล้วเราก็ใช้หลักการนี้เพื่อตั้ง URL ของเราเอง ก็ให้ไปเปิดไฟล์ hosts ด้วย Text editor ทั่วไป เช่น notepad เป็นต้น ไฟล์ hosts จะอยู่ที่
  • Windows: c:\Windows\System32\Drivers\etc\hosts
  • Mac OS X / Linux: /etc/hosts
        แล้วให้เพิ่มข้อความ 127.0.0.1   yiiapp.local ลงในบรรทัดล่างสุดเพื่อที่จะบอกเครื่องเราว่าถ้ามีการเรียก URL yiiapp.local ก็ให้ไปโหลดข้อมูลจากไอพี 127.0.0.1 แล้วเซฟไฟล์ hosts และปิดได้เลย
        ลำดับต่อมาเราต้องไปบอก Apache ด้วยว่าถ้ามีการเรียกโหลดข้อมูลจากมันโดยใช้ Url yiiapp.local ให้โฟลเดอร์ไหนเป็น Web root โดยการเข้าไปแก้ไขไฟล์ config vhost ของ Apache ซึ่งเราต้องหาไฟล์นี้ให้เจอส่วนใหญ่แล้วก็จะถูกเก็บไว้ที่โฟลเดอร์เดียวกับโปรแกรม Web server ที่เราเลือกใช้นั่นแหละ แล้วเข้าไปใน conf/apache/httpd.conf (ย้ำอีกครั้งว่าแค่ส่วนใหญ่) และส่วนใหญ่อีกเช่นกันไฟล์ที่เก็บ config ของ virtual host มักจะถูก Include เข้ามาในไฟล์ httpd.conf อีกที โดยส่วนใหญ่(อีกละ) จะชื่อไฟล์ว่า httpd-vhost.conf ยังไงก็แล้วแต่มันจะต้องมีอยู่บรรทัดนึงในไฟล์ httpd.conf ที่ Include ไฟล์ httpd-vhost.conf เข้ามา เพราะฉนั้นเราต้องเปิดไฟล์ httpd.conf เพื่อหาเส้นทางที่ไฟล์ httpd-vhost.conf อยู่ แล้วเปิดขึ้นมาแก้ไข (วนไปวนมา งงกันไหมเนี่ยะ) จากนั้นให้เพิ่มข้อความชุดนี้ลงไป (ซึ่งมันเองก็น่าจะมีตัวอย่างให้ดูอยู่แล้ว)
<VirtualHost *:80>
    ServerAdmin webmaster@yiiapp.local 
#<--- อีเมลล์ของเว็บมาสเดตอร์ ใส่อะไรก็ได้แต่ต้องอยู่ในฟอร์แมตอีเมลล์
    DocumentRoot "c:/xampp/htdocs/yii-application" #<--- ที่อยู่ของโฟลเดอร์โปรเจ็คเรา
    ServerName yiiapp.local #<--- ชื่อเว็บที่ต้องการใช้
    ErrorLog "logs/yiiapp.local-error_log" #<--- ที่เก็บ log เมื่อ error
    CustomLog "logs/yiiapp.local-access_log" common #<--- ที่เก็บ log การเข้าถึงเว็บเรา
</VirtualHost>
      เมื่อเสร็จแล้วให้เซฟและปิดไฟล์นี้ได้เลย และอย่าลืม Restart Apache ด้วย
      เอาละไปต่อ ถึงขั้นตอนนี้เมื่อเราเรียก URL http://yiiapp.local มันก็เปิดเว็บจากโฟลเดอร์โปรเจ็คของเราแล้ว แต่มันก็แสดงรายการไฟล์และโฟลเดอร์อยู่ เพราะฉนั้นเราต้องให้ .htaccess เข้ามาช่วยจัดการ URL อีกแรงนึง

.htaccess

        มันมีวิธีการที่จะประมวลผล URL ก่อนที่จะเข้าไปทำงานในโฟลเดอร์ไดๆ อยู่แล้วซึ่งใน Apache (Web server ของเรา) มีการรองรับความต้องการตรงนี้อยู่ด้วยการใช้การประมวลผล URL ด้วยไฟล์ .htaccess ซึ่งหลักการทำงานของมันก็คือเมื่อ Request url มาที่โฟลเดอร์ที่มีไฟล์ .htaccess อยู่ Apache จะอ่าน และประมวลผลไฟล์ .htaccess ก่อนเสมอ ดังนั้นถ้า Request url มาที่โฟลเดอร์หลักของโปรเจ็คก็ใช้ .htaccess ไปสัง Apache ให้ไปรันโฟลเดอร์ frontend/web ซ่ะ เช้นเดียวกันหาก Request url แล้วมี /backend มาด้วยก็ให้เข้าไปรันในโฟลเดอร์ backend/web เลย ทีนี้ URL ของเราก็จะไม่ยาวแล้ว เอาละเริ่มต้นกันเลย
  1. สร้างไฟล์ .htaccess ในโฟลเดอร์หลักของโปรเจ็ค
  2. ไม่ต้องทำอธิบายโค๊ดของ .htaccess แล้วนะ เอาเป็นว่าโค๊ดชุดนี้ทำงานตอมคอนเซ็ปข้างต้นให้ Copy โค๊ดชุดนี้ไป Past ในไฟล์ .htaccess
    Options FollowSymLinks
    AddDefaultCharset utf-8
    <IfModule mod_rewrite.c>
        RewriteEngine On
        # the main rewrite rule for the frontend application
        RewriteCond %{REQUEST_URI} !^/(backend/web|admin)
        RewriteRule !^frontend/web /frontend/web%{REQUEST_URI} [L]
        # redirect to the page without a trailing slash (uncomment if necessary)
        #RewriteCond %{REQUEST_URI} ^/admin/$
        #RewriteRule ^(admin)/ /$1 [L,R=301]
        # the main rewrite rule for the backend application
        RewriteCond %{REQUEST_URI} ^/admin
        RewriteRule ^admin(.*) /backend/web/$1 [L]
        # if a directory or a file of the frontend application exists, use the request directly
        RewriteCond %{REQUEST_URI} ^/frontend/web
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        # otherwise forward the request to index.php
        RewriteRule . /frontend/web/index.php [L]
        # if a directory or a file of the backend application exists, use the request directly
        RewriteCond %{REQUEST_URI} ^/backend/web
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        # otherwise forward the request to index.php
        RewriteRule . /backend/web/index.php [L]
        RewriteCond %{REQUEST_URI} \.(htaccess|htpasswd|svn|git)
        RewriteRule \.(htaccess|htpasswd|svn|git) - [F]
    </IfModule>
        ถึงตอนนี้เราสามารถที่จะเรียกเว็บเราด้วย URL ที่ต้องการได้แล้ว แต่อย่าเพิ่งดีใจมันยังไม่จบ ลองคลิ๊กที่เมนูต่างๆ ดูสิจะเห็นว่า URL มันยังไปที่ /frontend/index.php?xxx/xxx อยู่ ถึงคราวที่เราต้องเข้าไปแก้ไข config ของโปรเจ็คเรากันบ้างแล้วดูในหัวข้อถัดไป

Project Config

        มาเริ่มกันเลยดีกว่า ไม่พูดพร่ำทำเพลงละ เพราะยาวมากแล้ว เราจะแก้ไข Config หลักของ Frontend และ Backend กัน
  • แก้ไขไฟล์ frontend/config/main.php
    1. เพิ่ม 'homeUrl' => '/', อยู่ในระดับเดียวกับ components
    2. เพิ่ม 'baseUrl' => '', อยู่ใน components > request
    3. ยกเลิกคอมเมนต์ urlManager
      <?php
      //ไม่ใช่เอาสคริปต์นี้ไปแทนที่สคริปต์เดิมนะ ของเดิมเป็นยังไงก็อยู่อย่างนั้น อันนี้แค่ให้ดูว่าอะไๆรมันไปอยู่ตรงใหนแค่นั้นเอง
      return [
          'homeUrl' => '/',
          'components' => [
              'request' => [
                  'baseUrl' => '',
              ],
              'urlManager' => [
                  'enablePrettyUrl' => true,
                  'showScriptName' => false,
              ],
          ],
      ];
  • แก้ไขไฟล์ frontend/web/robots.txt เพื่อให้พวก Search Engine เข้าไปยุ่มย่ามกับ Url frontend กับ backend ให้เอาสคริปต์ชุดนี้แทนที่ทั้งหมดไปเลย
    User-agent: *
    Disallow: /frontend/web
    Disallow: /backend/web
  • แก้ไขไฟล์ backend/config/main.php ทำเหมือนกันกับ config ของ frontend เลยเลี่ยนแค่ค่าของ homeUrl และ baseUrl ตามการตั้งค่าใน .htaccess
    1. เพิ่ม 'homeUrl' => '/admin', อยู่ในระดับเดียวกับ components
    2. เพิ่ม 'baseUrl' => '/admin', อยู่ใน components > request
    3. ยกเลิกคอมเมนต์ urlManager
      <?php
      //ไม่ใช่เอาสคริปต์นี้ไปแทนที่สคริปต์เดิมนะ ของเดิมเป็นยังไงก็อยู่อย่างนั้น อันนี้แค่ให้ดูว่าอะไๆรมันไปอยู่ตรงใหนแค่นั้นเอง
      return [
          'homeUrl' => '/admin',
          'components' => [
              'request' => [
                  'baseUrl' => '/admin',
              ],
              'urlManager' => [
                  'enablePrettyUrl' => true,
                  'showScriptName' => false,
              ],
          ],
      ];

อ้างอิง: https://github.com/mickgeek/yii2-advanced-one-domain-config

   
เห้อเสร็จสักทีพอเขียนเป็นบทความดูหมือนขั้นตอนจะยุ่งยาก แต่ถ้าลองทำดูจริงๆ ขั้นตอนมันไม่เยอะหรอก ยิ่งถ้าทำบ่อยๆ เดี๋ยวก็คล่องเอง หลับตาทำก็ยังได้ อิอิ

ติดตั้ง Yii Framework 2 ด้วย Composer

        ตัว Yii Framework 2 นั้นมี Tempalte (ไม่ใช่ Web template นะ มันหมายถึงโครงสร้างของไฟล์ และสคริปต์) อยู่ 2 แบบด้วยกันคือ Basic และ Advanced ซึ่งทั้ง 2 Template การเขียนคำสั่งเหมือนกันทุกอย่าง จะต่างกันแค่โครงสร้างของโฟลเดอร์ และไฟล์ และที่แตกต่างที่ชัดเจนคือ Advanced จะมีเว็บอยู่ 2 ที่คือ Frontend กับ Backend ส่วน Basic จะมีเว็บที่เดียว ซึ่งขึ้นอยู่กับผู้ที่จะพัฒนาเว็บเองว่าแบบใหนที่ตรงวัตถุประสงค์ของโปรเจ็คมากกว่ากันเช่น ทำเว็บแบบเสนอ content เฉยๆ ก็ควรเลือกแบบ Basic แต่ถ้าเป็นโปรเจ็คที่มีความซับซ้อน การจำกัดการเข้าถึงของ User หลายระดับ แบบนี้ก็ควรจะใช้ Advanced มากกว่า จากข้อแตกต่างข้างต้นจึงทำให้คำสั่งที่ไม่เหมือนกันระหว่าง Basic กับ Advanced ก็มีแค่การอ้างอิงที่อยู่ของ Class หรือไฟล์ในโฟลเดอร์เท่านั้นเอง คำสั่งที่เหลือก็เหมือนกัน
        เอาหละในเมื่อเข้าใจข้อแตกต่างของ Template หระว่าง Basic กับ Advanced แล้ว ในบทความชุดนี้จะขอเลือกใช้แบบ Advanced แล้วกัน และจะขอนำเข้าไปสู่การติดตั้งด้วย Composer ดังนี้ (จริงๆ แล้วมีไกด์สำหรับการติดตั้งอยู่แล้วในเว็บไซต์ของ Yii Advanced Template ดูได้จากที่นี่ << Click >> )
  1. สำหรับเครื่องที่ยังไม่เคยติดตั้ง Plugin fxp หรือเพิ่งติดตั้ง Composer ใหม่จำเป็นต้องติดตั้ง Plugin ตัวนี้ก่อน 1 ครั้ง ผ่านทาง Command หรือ Terminal หากเคยติดตั้งแล้วก็ข้ามไปข้อ 2 ได้เลย
    > composer global require "fxp/composer-asset-plugin:^1.2.0"


  2. ใช้ Command หรือ Terminal เข้าไปที่ Web Root ของ Web Server ด้วยคำสั้ง cd แล้วใช้คำสั่งสร้างโปรเจ็คได้เลย
    > cd c:\xampp\htdocs
    > composer create-project --prefer-dist yiisoft/yii2-app-advanced
    yii-application
    สังเกตุคำว่า yii-application ที่เป็นสีแดงนั่นคือชื่อโฟลเดอร์โปรเจ็คของเรา ซึ่งสามารถเปลี่ยนให้เป็นชื่อที่เราต้องการได้ ขั้นตอนนี้เครื่องของเราจำเป็นที่ต้องเชื่อมต่อกับ Internet (หากไม่มีเน็ตก็ติดตั้งไม่ได้น๊ะ) และเมื่อสั่งรันคำสั้งไปแล้ว Composer จะทำการดาวน์โหลด Yii Advanced Template ลงในโปรเจ็คของเรา ขั้นตอนนี้อาจใช้เวลานานหน่อยอาจจะใช้เวลานาน 3-5 นาที หรือมากกว่านั้น ให้รออย่างเดียวจนกว่ามันจะเสร็จ (สังเกตุเมื่อเสร็จเราจะมีเคอร์เซอร์กระพริบสามารถพิมพ์คำสั่งลงใน Command หรือ Terminal ได้ แต่ไม่ต้องพิมพ์อะไรน๊ะ) เมื่อติดตั้งเสร็จแล้วอย่าเพิ่งปิด Command หรือ Terminal เราต้องใช้คำสั่งอื่นๆ เพื่อตั้งค่าต่างๆ ของโปรเจ็คให้เสร็จก่อน

  3. หากเครื่องของเรายังไม่เคยติดตั้ง Yii 2 มาก่อนระหว่างการโหลดไฟล์จะขึ้นให้กรอก Git Token ให้เราไปสร้าง Token จากเว็บไซต์ https://github.com/ โดยมีขั้นตอนดังนี้
    1. คลิกที่รูปโปรไฟล์ (อยู่มุมขวา-บน) >> Settings
    2. คลิ๊กเมนู Personal access tokens (อยู่ทางซ้าย)
    3. คลิกปุ่ม Generate new token
    4. ตั้งชื่อ token ตามต้องการ (อะไรก็ได้) และไม่จำเป็นต้องคลิ๊กเช็คออพชั่นไดๆ
    5. เลื่อนลงมาคลิ๊กปุ่ม Generate token (ปุ่มสีเขียวด้านล่าง)
    6. จะได้ชุดตัวอักษรมา 1 ชุด ให้ Copy ตัวอักษรชุดนี้แล้วไป Past ใน Command หรือ Terminal แล้วกดปุม Enter ตอน Past ใน Command / Terminal จะไม่แสดงข้อความที่ Past ไม่ต้องตกใจกด Enter ไปได้เลย หากกด Enter ไปแล้วยังขึ้นให้กรอก Token อีก แสดงว่าเราอาจลากคลุมข้อความก่อน Copy ไม่หมดหรือเกินมา ให้คลุมให้ครบแล้ว Copy - Past ใหม่

  4. ให้พิมพ์คำสั้ง cd เข้าสู่โปรเจ็คของเรา แล้วพิมพ์คำสั่งการตั้งค่าโหมด Devlopment หรือ Production
    > cd yii-application
    > php init
    #สำหรับ Windows, และ php ./init สำหรับ Mac OS X / Linux
    หลังจากนั้นจะขึ้นข้อความถามให้เลือกโหมด 0 = Devlopment หรือ 1 = Production ให้ตอบ 0 เนื่องจากเรายังอยู่ในขั้นตอนการพัฒนา
    Yii Application Initialization Tool v1.0
    Which environment do you want the application to be initialized in?
      [0] Development
      [1] Production

      Your choice [0-1, or "q" to quit] 0 #<---- ตอบ 0
      Initialize the application under 'Development' environment? [yes|no] yes #<---- ตอบ yes หรือ y
    สงสัยละสิ Development กับ Production ต่างกันยังไง ความหมายมันก็บอกอยู่แล้วคือ Development คืออยู่ในระหว่างหารพัฒนา ดังนั้นเวลาสคริปต์เกิด Error หรือ Warning มันก็จะแสดงข้อความ Error / Warning ออกมาให้กับเราได้ทราบ ส่วน Production คือนำไปใช้งานจริงแล้วจึงไม่ควรจะแสดง Error / Warning ให้ User เห็นอาจจะเป็นอันตรายกับโปรแกรมของเราได้เพราะข้อความ Error / Warning จะแสดง Full path หรือ โครงสร้าง ชื่อตาราง ฟิลด์ของฐานข้อมูลเลยทีเดียว หากผู้ไม่ประสงค์ดีเห็นเข้าโปรแกรมของเราก็อาจจะนำไปสู่การถูกโจมตีได้ สรุป 2 โหมดนี้คือ Development โชว์ Error / Warning ส่วน Production ไม่โชว์ จอบอ.

        ถึงตอนนี้การติดตั้งก็เป็นอันเสร็จเรียบร้อยแล้ว เราลองไปรันหน้าเว็บกันดูหน่อย อย่างที่ได้กล่าวไว้ข้างต้นว่า Advanced template มีเว็บอยู่ 2 ที่ด้วยกันคือ Frontend และ Backend เราลองมารันทีละเว็บกัน
  1. Frontend ที่ http://localhost/yii-application/frontend/web/ 

     
  2. Backend ที่ http://localhost/yii-application/backend/web/ 

        ถ้าได้หน้าจอตามนี้แสดงว่าการติดตั้งของเราเสร็จสมบูรณ์พร้อมที่จะให้เราเขียนโปรแกรมได้เลย

เตรียมสภาพแวดล้อมของเครื่องให้พร้อมสำหรับการใช้งาน Yii Framework 2

        การเตรียมสภาพแวดล้อมของเครื่องให้พร้อมสำหรับการใช้งาน Yii Framework 2 นั้นมี 3 ส่วนใหญ่ๆ คือการติดตั้งตัวจำลอง Web Server, Dependency และ Github Account จะอธิบายแต่ละตัวดังนี้

Web Server

        แน่นอนว่า Yii Framework นั้นเป็น PHP Framework ดังนั้นการที่จะรัน Project นั้นจึงจำเป็นจะต้องจำลองเครื่องของเราให้เป็น PHP Web Server เสียก่อน  โดยการติดตตั้งนั้นมีความยุ่งยากอยู่พอสมควรเพราะจะให้เป็น PHP Web Server ได้นั้นจะต้องติดตั้งโปรแกรมที่จำเป็นเบื้องต้น ดังนี้
  1. Web Server ด้วยโปรแกรม Apache, Nginx หรือ IIS เป็นต้น
  2. PHP เพื่อใช้ในการ Compile คำสั่ง PHP
  3. MySql เพื่อใช้เป็นฐานข้อมูล
        และหลังจากติดตั้งโปรแกรมหลักๆ ทั้ง 3 แล้วจำเป็นต้องปรับแต่งการตั้งค่าของแต่ละโปรแกรมให้ทำงานเข้ากันได้ รวมถึงต้องติดตั้ง PHP Extensions อีกไม่รู้กี่ตัวเพื่อให้การทำงานของ PHP มีความสามารถเพิ่มขึ้น และรองรับกับ Project

        นี่ยังไม่เริ่มทำโปรเจคเลยต้องวุ่นวายขนาดนี้เชียวหรือ ใจเย็นๆ กันก่อน จากความวุ่นวายข้างต้นจึงได้มีผู้ที่พัฒนาโปรแกรมที่มัดรวมโปรแกรมข้างต้นเข้าด้วยกัน ทำการปรับแต่งค่าให้เข้ากันได้ และมี PHP Extensions ที่เป็นมาตรฐานติดมาพร้อมกันเลย และนอกจากโปรแกรมที่จำเป็นดังกล่าวผู้พัฒนาอาจจะติดตั้งโปรแกรมเสริมมาเช่น FTP, Debugger เป็นต้นให้เราได้ใช้งานได้สะดวกเพิ่มขึ้นไปอีกด้วย โปรแกรมที่ว่ามามีอยู่หลายตัวด้วยกัน จะยกตัวอย่างที่ได้รับความนิยมอยู่ในปัจจุบันได้แก่
โปรแกรม เว็บไซต์ Windows Mac OS X Linux
WAMP http://www.wampserver.com / x x
MAMP https://www.mamp.info / / x
XAMPP https://www.apachefriends.org / / /
        จากตารางก็สามารถเลือกใช้ตามความชอบใจได้เลย สำหรับการดาวน์โหลดและการติดตั้งก็สามารถเข้าไปดูไกด์ได้จากเว็บไซต์ที่เลือกได้เลย (ไม่ยากดาวน์โหลดมา->ดับเบิ้ลคลิ๊กตัวติดตั้ง-> Next/Yes/Ok ตามสไตล์ Windows ^_^ ส่วน Mac OS X ก็ดับเบิ้ลคลิ๊กตัวติดตั้ง .dmg ลากใส่ Applications ส่วนของ Linux จะขั้นตอนเยอะหน่อยขอข้ามไปแล้วกันเดี๋ยวยาว)

Dependency Manager for PHP

        เนื่องจาก Yii Framework 2 นั้นมีวิธีการการติดตั้ง 2 แบบด้วยกันคือ Archive File (ดาวน์โหลดไฟล์ zip มา Extract แล้วเริ่มเขียนโปรเจ็คได้เลย) และอีกแบบคือติดตั้งผ่านทาง Dependency ซึ่งทั้ง 2 วิธีนี้จะสามารถใช้เขียนโปรเจ็คได้ทั้งคู่ แต่ผมขอแนะนำให้เลือกวิธีการติดตั้งแบบ Dependency ดีกว่า แต่การติดตั้งผ่านทาง Dependency นั้นจะต้องทำการติดตั้งโปรแกรม Composer ลงในเครื่องเราก่อนโดยดาวน์โหลดได้จาก https://getcomposer.org/ ส่วนวิธีการติดตั้งแต่ละ OS จะมีไกด์อยู่แล้วในเว็บของ Composer เอง อย่างของ Windows ดาวน์โหลดตัวติดตั้ง (.exe) แล้วก็ติดตั้งแบบ Windows Styles เช่นเคย ส่วน Mac OS X และ Linux ก็จะมีวิธีติดตั้งเหมือนกัน แต่ดูในเว็บของ composer อาจจะงงๆ ผมสรุปคำสั่งให้ง่ายๆแล้วกัน
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

หลังจากนั้นให้เปิด Command ของ Windows หรือ Terminal ของ Mac OS X, Linux แล้วลองพิมพ์คำสั่ง composer แล้วกดปุ่ม Enter หากขึ้นข้อความแบบนี้ แสดงว่าการติดตั้งก็ผ่าน
Surakits-MacBook-Air:htdocs surakit$ composer
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.2.0 2016-07-19 01:28:52

Usage:
  command [options] [arguments]

Options:
  -h, --help                                        Display this help message
  -q, --quiet                                       Do not output any message
  -V, --version                                    Display this application version
      --ansi                                           Force ANSI output
      --no-ansi                                      Disable ANSI output
  -n, --no-interaction                           Do not ask any interactive question
      --profile                                         Display timing and memory usage information
      --no-plugins                                  Whether to disable plugins.
  -d, --working-dir=WORKING-DIR     If specified, use the given directory as working directory.
  -v|vv|vvv, --verbose                          Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Github Account

        เอาหละสิ่งต้องเตรียนเป็นตัวสุดท้ายคือ ต้องมี Account ของ Github เพื่อสร้าง Token แล้วนำมากรอกในตอนที่ติดตั้ง Yii Framework หากยังไม่มีก็ให้ไปสมัคร Account ไว้ที่ https://github.com/

สรุป: การเตรียมความพร้อม

  1. ติดตั้ง PHP Web Server -> WAMP / MAMP / XAMPP เลือกติดตั้งตัวไดตัวนึงเท่านั้น
  2. ติดตั้ง Dependecy Manager for PHP -> Composer
  3. Github Account -> หากยังไม่มีให้ไปสมัครไว้ที่ https://github.com

วันพฤหัสบดีที่ 10 มีนาคม พ.ศ. 2559

สร้าง modules ซ้อนใน Module 01-เกริ่นนำ

เนื่องจากผมได้สร้าง CMS ขึ้นมาตัวนึงด้วย Yii 2 Advance template แบ่ง frontend และ backend ตามปกติ แต่เจ้าหน้าบ้านกับหลังบ้านเนี่ยะใช้ assets ของไครก็ของมัน จึงทำให้ resource เดียวกันถูกคัดลอกไปอยู่ทั้งหน้าบ้านและหลังบ้าน ถ้ารวมต้นฉบับที่ถูกเก็บไว้ในโฟลเดอร์ vendor แล้วกลายเป็นว่า resource อันเดียวถูกเก็บไว้ถึง 3 ที่ แล้วสมมุติ resource ที่มีขนาดใหญ่มากๆ เช่น mpdf ซึ่งมีขนาด 100MB+ ก็จะถูกโคลนไปทั้งหน้าบ้านและหลังบ้าน เปลืองพื้นที่เปล่าๆ จึงเริ่มเปลี่ยนใจกลับมาใช้ ฺBasic template ดีกว่า(มั้ย) เพื่อที่จะมี resource แค่ใน vendor และ assets

 ปกติเมื่อใช้ Basic template แล้วถึงแม้เราจะทำโมดูลแยกการทำงาน url มันก็จะเป็น r=module/controller/action เสมอ แต่ความต้องการของผมอยากให้ url มันเป็นแบบนี้
r=webManager/module1/controller/action
r=webManager/module2/controller/action
r=webManager/module3/controller/action
...
พอจะเข้าใจนะ ก็เลยหาวิธีที่จะเอาโมดูลไปซ้อนในโมดูลอีกทีนึง จึงได้ไปเจอคำสั่งนี้
http://www.yiiframework.com/doc-2.0/yii-base-module.html#setModules()-detail

$this->setModules([
    'comment' => [
        'class' => 'app\modules\comment\CommentModule',
        'db' => 'db',
    ],
    'booking' => ['class' => 'app\modules\booking\BookingModule'],
]);

เห็นโค๊ดแล้วพอจะเข้าใจแล้วเนาะ ก็แค่เอา Arrays ไปใส่ในคำสั่ง setModules (มี s ด้วยนะ) จะเป็นยังไงต่อ เดี๋ยวค่อยมาเขียนต่อตอน 2 นะครับ