php

Laravel แนะนำโครงสร้างภายในโปรเจค อธิบายแต่ละส่วนการทำงาน EP2

หลังจากที่ได้ทำการติดตั้งตามบทความนี้แล้ว “Laravel เริ่มติดตั้งและสร้าง route ง่าย ๆ EP1” บทความนี้จะมาอธิบายเพิ่มเติมแต่ละส่วนของโครงสร้างโปรเจคว่ามีหน้าที่ทำอะไร และตัวอย่างการใช้งานอย่างไรได้บ้าง

มาทำความรู้จักโครงสร้างของ Laravel กัน

  • app/Console
  • app/Exceptions จัดการ Error Exception จากการทำงานที่ผิดพลาด
  • app/Http
    • app/Http/Controllers จัดเก็บ Controllers file (*Controller.php) สำหรับเก็บ Logic ,Route ,Repository ,ORM ต่าง ๆ จะเขียนในไฟล์เหล่านี้
    • app/Http/Middleware จัดเก็บไฟล์ middleware เข้าออกจอง Routes ต่าง ๆ เช่น การทำ Basic Authenticate ,Session Handlers เป็นต้น
    • app/Kernel
  • app/Models เก็บ Model จาก databases ต่าง ๆ กำหนด
  • app/Providers เก็บไฟล์ Providers กำหนด เช่น BroadcasProvider ,EventServiceProvider ,RouteServiceProvider เป็นต้น
  • bootstrap
    • bootstrap/cache
    • bootstrap/app.php
  • config
    • config/app.php เก็บค่า config ระดับ app เช่น ชื่อ app ,env (production) ,timezone UTC เป็นต้น
    • config/auth.php
    • config/broadcasting.php
    • config/cache.php
    • config/cors.php
    • config/databases.php เก็บ database driver ต่าง ๆ mysql , pgsql, sqlsrv ,sqlite เป็นต้น
    • config/filesystems.php
    • config/hashing.php
    • config/logging.php
    • config/mail.php
    • config/queue.php
    • config/services.php
    • config/session.php
    • config/view.php
  • database
    • database/factories
    • database/migrations เก็บไฟล์ script create table ของ database
    • database/seeders
  • public หลังจาก compile laravel mix จะถูกมาเก็บในนี้ ไฟล์ที่นี่
    • public/.htaccess
    • public/favicon.ico
    • public/index.php
    • public/rebots.txt
  • resources
    • resources/css เก็บไฟล์ css ( Cascading Style Sheets ) ต่าง ๆ
    • resources/js เก็บไฟล์ js (Javascript ) ต่าง ๆ
    • resources/lang
    • resources/views เก็บไฟล์ view (*.blade) ต่าง ๆ
  • routes
    • routes/api.php จัดการ route RESTApis ต่าง ๆ (laravel –resource )
    • routes/channels.php
    • routes/console.php
    • routes/web.php จัดการ route ทั่วไป แบบปกติจะจัดการที่ไฟล์นี้เป็นส่วนใหญ๋
  • storage
    • storage/app/public
    • storage/framework
    • storage/logs
  • tests เขียน unittest ต่าง ๆ
    • tests/Feature
    • tests/Unit
  • vender จัดการ libraries ต่าง ๆ ที่ได้จากการติดตั้ง laravel ตั้งแต่เริ่มต้น
  • .env เก็บค่า config ต่าง ๆ โดยจะแบ่งเป็น dev , prod
  • artisan
  • composer.json
  • package.json
  • webpack.mix.js จัดการไฟล์ต่าง ๆ ที่เป็น css ,js ก่อนการ compile minify จะได้ output เก็บที่ public/

ในบ้าง directory ,file ไม่ได้เข้าไปยุ่งเกี่ยวในระหว่างการใช้งาน จะขอไม่อธิบาย หากคุณต้องการศึกษาเพิ่มเติม https://laravel.com/docs/7.x/structure

Yii1กับ Trick ต่างๆ ที่คุณอาจจะยังไม่เคยรู้

Yii1กับ Trick ต่างๆ ที่คุณอาจจะยังไม่เคยรู้ (จากประสบการณ์ใช้งานจริง)

ถึงแม้ว่า PHP Framework ที่ชื่อว่า Yii นี้ปัจจุบันจะพัฒนาไปถึง version 2 เป็นที่เรียบร้อยแล้ว แล้วจะเปลี่ยนไปใช้ version ใหม่ไปทำไมก็ในเมื่อ v.1.x ยังใช้งานไม่เต็มประสิทธิภาพเลย (ถึงแม้ใครจะบอกว่า version ใหม่ย่อมดีกว่าของเก่าเสมอ) ใช่สิก็ Content ของวันนี้เป็นเรื่อง Trick ของ Yii1 สิครับ ก็ต้องอวย v.1.x สิไม่แปลก

เริ่มตั้งแต่การ Setup Yii1 กัน

  • ก่อนอื่นก็ต้องไป Download Yii1 ที่ Yii1 Link Download
  • Unzip File yii-1.1.17.467ff50.zip และให้ Copy หรือ Rename Folder  ให้เป็นชื่อ application ของเราเอง ภายในให้เหลือแต่ folder ชื่อ framework, requirements
  • Run Command
cd demo

php framework/yiic wepapp app

Trick

1.ไม่อยากให้ URL มีคำว่า r=index.php
1. เปิด Url re-writing on Apache
2. สร้างไฟล์ .htaccess วางใน root path app ของเรา ภายในไฟล์ใส่คำสั่งดังต่อไปนี้

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule . index.php

3. เปิดการใช้งาน urlManager ใน Configuration ที่ไฟล์ protected/config/main.php (ถ้า comment อยู่ในเอา comment ออก)
'urlManager'=>array(
  'urlFormat'=>'path',
  'rules'=>array(
      '<controller:\w+>/<id:\d+>'=>'<controller>/view',
      '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
      '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
  ),
  'showScriptName'=>false,
)
2.include internal javascript file end of body tag </body>
โดยปกติการ include file javascirpt เข้าไปใช้ใน project ของเรา

<script type="text/javascript" src="http://poolsawat.com/js/jquery.min.2.2.4.js"></script>

ในส่วนของ tag <head></head> แล้วถ้า dependencies ของในส่วนที่เราเรียกใช้มันเยอะมากละ มีผลต่อ performance แน่ ๆ
ดังนั้นการที่เราใส่ js ไฟล์ที่ tag body ก่อน </body> จะช่วยแก้ปัญหาเรื่องนี้ได้มาก 

สำหรับ Yii1 หากต้องการทำแบบนี้ให้ใช้คำสั่ง

$cs = Yii::app()->clientScript;
$cs->registerScriptFile($Yii::app()->baseUrl. '/js/jquery.min.2.2.4.js', CClientScript::POS_END);

เท่านี้ก็จะทำให้ไฟล์ js ของเราถูกโหลดหลัง html page แล้วครับ

3.echo data in JSON format ด้วย CJSON
$data = array('status' => true, 'message' => 'ok');

echo CJSON::encode($data);
4.Get form enctype=”multipart/form-data” ด้วย CUploadedFile::getInstanceByName(‘picture’)
<!-- form.php -->
<form class="ui form"  method="post" action="upload.php" enctype="multipart/form-data">
<input type="file" name="picture"  id="idInputPicture" />
</form>

<!-- upload.php-->
$file = CUploadedFile::getInstanceByName('picture');
$file->getError();
$file->getExtensionName();
$file->getName();
$file->getSize();
$file->getTempName();
$file->getType();
$file->saveAs(Yii::getPathOfAlias('webroot') . '/uploads/' . $file->getName());
5. use NOW() ด้วย CDbExpression Class
$model->field_date = new CDbExpression('NOW()');

$model->save();
* ใช้สำหรับการ save ผ่าน model

 

PHP การเชื่อมต่อฐานข้อมูลแบบ PDO

logo_pdo

ครั้งเมื่ออดีตตราบจนถึงปัจจุบัน PHP Programming Language ก็มีการพัฒนาอยู่ตลอดเวลาจนปัจุบันก็อยู่ที่ เวอร์ชัน 5.6 แต่ยังไม่ได้รับความนิยมเทียบเท่าเวอร์ชัน 5.4 กับ 5.5 ก็จะยังมีผู้ใช้งานเยอะกว่า (ถ้าอยากจะอัพเกรดครั้งนี้ก็คงจะไปเวอร์ชั่น 7) แต่ถ้าถามว่า Hosting ในไทย ที่สนันสนุนเวอร์ชั่น 5.4, 5.5, 5.6 อาจจะยังมีน้อย




เรื่องการสนันสนุนปรับปรุงภาษาทีมพัฒนาเขายังสนันสนุนเวอร์ชั่น 5.4, 5.5, 5.6 ต่อไป แต่จะเลิกสนันสนุน เวอร์ชั่น 5.3 อย่างเต็มตัวข้อดีที่สำคัญของเวอร์ชัน 5.6 พัฒนาปรับปรุงเรื่องความปลอดภัยให้ดีขึ้น มาดูทางทีมพัฒนากันเขามีแผนการพัฒนา สนันสนุน PHP อย่างไรบ้าง

SUPPORT_PHP

 

แอบมาดูในอนาตคของ PHP 7 ในอนาคตว่ามีอะไรเพิ่มมาบ้าง

  • แน่นอนเรื่องความเร็วต้องเร็วกว่า PHP 5.6 แน่นอน
  • สนันการทำงานของเครื่อง 64 bit
  • กำจัดข้อผิดพลาดต่างๆ ที่มีใน PHP เวอร์ชั่น 5
  • ยกเลิก SAPIs and extensions (พวก php_mysql extension) จะไม่มีอีกต่อไป
  • เพิ่ม  Syntaxes  ?? , <=>, Group use (อันนี้ต้องมาดูกันจริงแล้วจะเอาไว้ใช้แบบใดกันแน่)

 

แล้วถ้า PHP เวอร์ชั่น 5.5 ขึ้นไป รวม PHP 7 ที่กำลังจะมาจะไม่มี php_mysql extension แล้วละพวกเราจะทำอย่างไร

ซึ่งปัญหานี้มีทางออกแล้วทางทีมพัฒนาก็แนะนำให้หันมาใช้ PDO หรือไม่ก็ mysqli จะมาแก้ปัญหานี้

The PDO class คืออะไร

pdo เป็น class extension เสริมที่ทางทีมพัฒนา PHP เขาสร้างขึ้นมาเพื่อช่วยเหล่านักพัฒนาให้ทำงานได้อย่างเป็นระบบ และมีความปลอดภัยมากขึ้น มีหน้าที่เชื่อมต่อระหว่าง PHP และเซิร์ฟเวอร์ฐานข้อมูล ให้มีการทำงานเป็นลักษณะ Object ซึ่ง PHP ก็รองรับการเขียนโปรแกรมแบบ Object มากยิ่งขึ้น และนอกจากนั้นจำทำให้เราพัฒนาตัวเองให้สามารถเขียนโปรแกรมในระดับที่สูงขึ้นได้เช่นกัน

สรุปฟังก์ชันการทำงาน

PDO {
public __construct ( string $dsn [, string $username [, string $password [, array $options]]] )
public bool beginTransaction ( void )
public bool commit ( void )
public mixed errorCode ( void )
public array errorInfo ( void )
public int exec ( string $statement )
public mixed getAttribute ( int $attribute )
public static array getAvailableDrivers ( void )
public bool inTransaction ( void )
public string lastInsertId ([ string $name = NULL ] )
public PDOStatement prepare ( string $statement [, array $driver_options = array() ] )
public PDOStatement query ( string $statement )
public string quote ( string $string [, int $parameter_type = PDO::PARAM_STR ] )
public bool rollBack ( void )
public bool setAttribute ( int $attribute , mixed $value )

}




ตารางการเปรียบเทียบ

การทำงาน รูปแบบ ตัวอย่าง
เชื่อมต่อฐานข้อมูล php_mysql
$link = mysql_connect('localhost', 'user', 'pass');
mysql_select_db('testdb', $link);
mysql_set_charset('UTF-8', $link);
pdo
$db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8', 'username', 'password');
เพิ่มข้อมูล php_mysql
$result = mysql_query("INSERT INTO table (col1,col2) VALUES ($alue1,$value2));
pdo
$stmt = $db->prepare("INSERT INTO table (col1,col2) VALUES (:value1,:value2)");
$stmt->bindValue(':value1', $value1, PDO::PARAM_STR);
$stmt->bindValue(':value2', $value2, PDO::PARAM_STR);
$stmt->execute();
แก้ไขข้อมูล php_mysql
$result = mysql_query("UPDATE table SET col1 = $value1 WHERE id = $id");
pdo
$stmt = $db->prepare("UPDATE table SET col1 =:value1 WHERE id =:id");
$stmt->bindValue(':value1', $value1, PDO::PARAM_STR);
$stmt->bindValue(':id', $id, PDO::PARAM_STR);
$stmt->execute();
ลบข้อมูล php_mysql
$result = mysql_query("DELETE FROM table WHERE id =".$id);
การคิวรี่ข้อมูล php_mysql
$result = mysql_query("SELECT col1, col2, col3 FROM table_name");
while($row = mysql_fetch_assoc($result)) {
//Process each row here
}
 pdo
$sth = $pdo->prepare("SELECT col1, col2, col3 FROM table_name");
$sth->execute();
while($row = $sth->fetch(PDO::FETCH_ASSOC)) {
//Process each row here
}
pdo
$stmt = $db->prepare("DELETE FROM table WHERE id=:id");
$stmt->bindValue(':id', $id, PDO::PARAM_STR);
$stmt->execute();
คิวรี่ข้อมูล php_mysql
$result = mysql_query("SELECT col1, col2, col3 FROM table_name");
while($row = mysql_fetch_assoc($result)) {
//Process each row here
}
pdo
$sth = $pdo->prepare("SELECT col1, col2, col3 FROM table_name");
$sth->execute();
while($row = $sth->fetch(PDO::FETCH_ASSOC)) {
//Process each row here
}




นี่ก็คือตัวอย่างบางส่วนสำหรับการเปรียบเทียบการใช้งาน php_mysql กับ pdo การฝึกฝนบ่อยๆจะทำให้เกิดความชำนาญ และความเชียวชาญที่เพิ่มขึ้นขอให้สนุกกับการเขียนโปรแกรมนะครับ

Slim Framework และ HelloWorld บน Slim

SlimMicroFramework

Slim Framework คือ Framework ทางฝั่ง PHP Programming Language …

  • ติดตั้ง Slim

1. การจะเริ่มใช้งาน Slim Framework เบื้องต้นมีวิธีการติดตั้ง 2 แบบ คือ

– ติดตั้งผ่าน Composer คือไร (ตัวอย่างนี้จะขอเลือกวิธีนี้ในการ นำเสนอ)

– โหลดไฟล์ Zip Archive File Download Zip

*** ขอนำเสนอตัวอย่างนี้ด้วยวิธี การติดตั้ง ผ่าน Composer ต้องทำการติดตั้ง Composer ก่อน และ ติดตั้ง Web Server ที่รองรับ Php Web base (แนะนำ Xampp เวอชั่นล่าสุดนะดีครับ)

2. สร้าง โปรเจค

-> C:\xampp\htdocs\helloslim (ถ้าใครติดตั้ง Web server Xampp ก็ให้ไปสร้างไว้ใน C:\xampp\htdocs )

3.  cmd เข้าไป C:\xampp\htdocs\helloslim

slim_1

 

3.1 รอ…

slim_2

4.  ตรวจสอบไฟล์ ก่อนว่าติดตั้งสำเร็จหรือไม่

slim_3

 

ได้แบบนี้ก็สำเร็จ

  • เริ่ม Hello World กับ Slim

1.  สร้างไฟล์ 2 ไฟล์

  • index.php
  • .htaccess

slim_4

 

และเปิด Project ขึ้นมา

 

2.  เพิ่มโค๊ด เข้าไปในไฟล์ index.php

slim_6

 

และ เพิ่มโค๊ดที่ไฟล์  .htaccess

slim_7

 

3.  ทดสอบ Hello World กัน

slim_8

 

4. ได้มาแล้ว Hello World

ไม่ยากใช่ไหมละครับ ลองนำไปเล่นดูนะครับ ขอให้สนุก