Menu

Showing posts with label laravel. Show all posts
Showing posts with label laravel. Show all posts

Monday, August 16, 2021

[PHP - Laravel] วิธีการสร้าง Class Diagram ที่มี Caller Graph จาก Source Code ที่เป็น Laravel
[PHP - Laravel] How to Generate Class Diagram with Caller Graph from Laravel Source Code

เราจะใช้ Doxygen ร่วมกับ Graphviz ในการสร้าง Class diagram ที่มี Caller Graph 

Doxygen เป็นเครื่องมือที่ใช้สร้างเอกสารจาก source code ที่มีอยู่ ภาษาโปรแกรมที่ support เช่น PHP, Java, Python เป็นต้น

Graphviz เป็น open source software ที่ใช้สร้างและแสดงผลกราฟรูปแบบต่างๆ

Doxygen จะเรียกใช้ dot ของ Graphviz สำหรับสร้างเอกสารในส่วนของ caller graph

การติดตั้ง Doxygen และ Graphviz

  1. ดาวน์โหลด Doxygen จาก https://www.doxygen.nl/download.html และติดตั้งตามปกติ
  2. ดาวน์โหลด Graphviz จาก https://graphviz.org/download/ และติดตั้งตามปกติ
  3. เพิ่ม C:\Program Files\Graphviz\bin เข้าไปที่ System path

Monday, June 14, 2021

[Laravel - Composer] วิธีการตั้งค่า Authentication token ของ Github ใน Composer
[Laravel - Composer] How to Set Github Authentication Token in Composer

หลังจากรัน composer install เพื่อติดตั้ง package ที่จำเป็นต้องใช้งาน แล้วได้ข้อความตามข้างล่างนี้

Head to https://github.com/settings/tokens/new?scopes=repo&description=Composer+on+MACHINE-NAME+2021-02-17+0532
to retrieve a token. It will be stored in "C:/Users/puthipong/AppData/Roaming/Composer/auth.json" for future use by Composer.
Token (hidden): GitHub API limit (0 calls/hr) is exhausted, could not fetch https://api.github.com/repos/test/l5-repository/contents/composer.json?ref=ce164fa72b884b4af488ff2749a171346f229c66. Create a GitHub OAuth token to go over the API rate limit. You can also wait until ? for the rate limit to reset.

สิ่งที่เราต้องทำมีดังนี้
  1. เข้าไปที่ URL ตามข้อความข้างต้น
    https://github.com/settings/tokens/new?scopes=repo&description=Composer+on+MACHINE-NAME+2021-02-17+0532
  2. กดสร้าง token 
  3. รันคำสั่งข้างล่างนี้
    composer config --global github-oauth.github.com <token>
หมายเหตุ สำหรับข้อมูลเพิ่มเติม อ่านได้ที่ https://getcomposer.org/doc/articles/authentication-for-private-packages.md#github-oauth

Wednesday, February 17, 2021

[Laravel - Composer] วิธีการใช้ Custom Package พร้อมกับการกำหนด Version ของ Package นั้นในไฟล์ composer.json
[Laravel - Package] How to Use Your Custom Package with Package Version in Composer File

ไฟล์ composer.json เป็นแหล่งรวมรายการ package ที่ต้องใช้ใน Laravel project

บางครั้งเราอาจจะต้อง fork package บางตัวมาจาก repository อื่น เพื่อนำมาปรับใช้กับ project ของเรา

หลังจากที่เราปรับแก้ package แล้ว เรามีวิธีตั้งค่าไฟล์ composer เพื่อเรียกใช้ package จาก branch บน repository ของเราดังนี้
  1. เพิ่มชื่อ package ของเราในส่วน require หรือ require-dev ดังนี้
    "require": {
        ...
        "{package_name}": "dev-{branch_name}",
        ...
    }
    เช่น
    "require": {
        ...
        "monolog/monolog": "dev-fix-concurrent-mkdir",
        ...
    }
  2. เพิ่ม repository ของเราในส่วน repositories ดังนี้
    "repositories": {
        ...
        {
          "type": "vcs",
          "url": "{my_repository_url}"
        },
        ...
    }
    เช่น
    "repositories": {
        ...
        {
          "type": "vcs",
          "url": "https://github.com/my_repo/monolog.git"
        },
        ...
    }

Monday, January 25, 2021

[PHP - Composer] วิธีการรัน Composer แบบไม่จำกัดหน่วยความจำและไม่ต้องแก้ไขไฟล์ php.ini
[PHP - Composer] How to Run Composer with Unlimited Memory and Do Not Update PHP INI File

เมื่อเรารัน composer install หรือ composer require เราอาจจะเจอกับ error ข้างล่างนี้ ทำให้เราไม่สามารถติดตั้ง package ที่เราต้องการได้

Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 4096 bytes) in phar:///usr/local/bin/composer/src/Composer/DependencyResolver/Solver.php on line 223

อีกทั้งการแก้ไขขนาด memory ในไฟล์ php.ini ก็ดูเกินความจำเป็นไป

วิธีการรัน composer โดยไม่จำกัดขนาด memory สามารถรันได้ด้วยคำสั่งดังนี้

COMPOSER_MEMORY_LIMIT=-1 composer require {package_name}

สำหรับข้อมูลเพิ่มเติม อ่านได้ที่ Memory limit errors

Monday, April 20, 2020

[PHP - Laravel] วิธีการตรวจสอบว่า Private key ที่ผู้ใช้งานใส่เข้ามาตรงกับ Public key ที่ตั้งค่าไว้หรือไม่
[PHP - Laravel] How to Verify Private Key with Existing Public Key

สืบเนื่องจากโพสต์ [Laravel - Model] การเข้ารหัสและถอดรหัสค่าของฟิลด์ใน Laravel Model โดยใช้ SSH Keys ที่ใช้ SSH keys ในการเข้ารหัสข้อมูล โดยที่เราตั้งค่า public key ไว้ในไฟล์ .env แต่เราให้ผู้ใช้งานเป็นผู้กรอก private key เอง แล้วเราจะรู้ได้อย่างไรว่า private key ที่ถูกกรอกเข้ามานั้น เป็นคู่ของ public key ที่เราตั้งค่าไว้จริงๆ

เรามีวิธีตรวจสอบ 2 วิธีดังนี้
  • การตรวจสอบด้วยการ sign และ verify signature
  • การตรวจสอบด้วยการ encrypt และ decrypt ข้อความ

การตรวจสอบด้วยการ sign และ verify signature

ขั้นตอนการตรวจสอบเป็นดังนี้
  1. เลือกข้อความมา 1 ข้อความ ข้อความอะไรก็ได้
  2. sign ข้อความนั้นด้วย private key ที่ผู้ใช้กรอกเข้ามา เพื่อสร้าง signature
  3. verify ข้อความนั้นกับ signature ที่เพิ่ง sign ด้วย public key ในระบบ
  4. ถ้า verify ไม่ผ่านจะเกิด exception ดังนี้

Friday, April 10, 2020

[Laravel] การบันทึกไฟล์ JSON ใน Laravel Tinker
[Laravel] How to Save JSON File in Laravel Tinker

Tinker ช่วยให้เราสามารถตอบโต้กับ Laravel application ของเราทั้งหมดผ่านทาง command line ได้

เราสามารถเข้าใช้ Tinker ได้ โดยรันคำสั่งดังนี้
php artisan tinker
ส่วนใหญ่เราจะใช้ Tinker ช่วยในการตรวจสอบความถูกต้องของข้อมูลในฐานข้อมูล โดยเราจะใช้ Eloquent ในการ query ข้อมูลขึ้นมา และในบางครั้งเราต้องการส่งออกผลการ query ออกเป็นไฟล์ เพื่อนำไปตรวจสอบเพิ่มเติม

สมมติว่า เรา query ข้อมูลใน Tinker แล้วเก็บใส่ตัวแปรดังนี้
$users = User::all();
และเรามีการตั้งค่า disks ในไฟล์ config/filesystems.php ดังนี้
...
    'disks' => [
        'local' => [
            'driver' => 'local',
            'root' => storage_path('app'),
        ],
...
การส่งออกผลการ query ข้างต้นออกเป็นไฟล์ JSON เราจะรันคำสั่งใน Tinker ดังนี้
Storage::disk('local')->put('users.json', json_encode((array) $users, JSON_PRETTY_PRINT));
ไฟล์ผลการ query ที่ถูกสร้างอยู่ที่ path storage/app/users.json

Wednesday, April 8, 2020

[Laravel] ขั้นตอนการตั้งค่า XAMPP สำหรับรันโปรเจค Laravel
[Laravel] How to Set XAMPP to Run Laravel Project

สมมติว่า 
  • เรามี folder ชื่อ laravel ที่เป็น folder ของ project ที่เป็น Laravel
  • เราติดตั้ง XAMPP ไว้ที่ C:\xampp
  • เราต้องการเรียกหน้าเว็บของเราผ่าน domain ชื่อ laravel.dev
เราจะมีขั้นตอนดังต่อไปนี้

Wednesday, April 1, 2020

[PHP - Laravel] Closure คืออะไร
[PHP - Laravel] What is Closure?

Closure เป็น anonymous function ที่นิยมใช้เป็น callback method อีกทั้งยังสามารถใช้เป็น parameter ของ function ได้อีกด้วย

ตัวอย่างการใช้งาน

สมมติว่า เรามี function ชื่อ handle โดยที่ function นี้รับ parameter เป็น Closure ดังต่อไปนี้
function handle(Closure $closure) {
    $closure();
}
เวลาเราเรียกใช้งาน handle เราสามารถใส่ function ของเราเข้าไปเป็น parameter แบบนี้ได้เลย
handle(function(){
    echo __METHOD__;
});
นอกจากนั้น เราสามารถประกาศ function ของเราเก็บไว้ในตัวแปรก่อน แล้วค่อยส่งตัวแปรนั้นเป็น parameter แบบนี้ก็ได้
$myFunction = function(){
    echo __METHOD__;
});
handle($myFunction);

Thursday, March 19, 2020

[PHP - Laravel] Trait คืออะไร?
[PHP - Laravel] What is Trait?

ปัญหานึงของการเขียนโปรแกรมด้วยภาษา PHP คือ class 1 class สามารถ inherit จาก class อื่นได้เพียง class เดียวเท่านั้น (single inheritance) ทำให้ไม่สามารถ inherit method ที่ต้องการใช้จาก class อื่นๆ เพื่อลดความซ้ำซ้อนของโค้ดได้

Traits เป็นกลไกสำหรับการใช้ code ซ้ำในภาษาที่เป็น single inheritance เช่น PHP

Traits มีความคล้ายคลึงกับ class ต่างกันที่ Traits เป็นเพียงกลุ่มของ method เท่านั้น จึงไม่สามารถเรียกใช้งานแบบ instance ได้ นอกจากนั้น มันยังมีความสามารถเพิ่มเติม คือ การเรียกใช้ class member ของ class ที่เรียกใช้มันได้ โดยไม่ต้อง inherit อีกด้วย

Wednesday, February 26, 2020

[Laravel - Package] การเข้ารหัสและถอดรหัสข้อความโดยใช้ SSH keys
[Laravel - Package] String Encryption and Decryption by Using SSH Keys

การเข้ารหัสและถอดรหัสข้อความโดยใช้ SSH keys ใน Laravel เราจะใช้ package ชื่อ phpseclib

สำหรับตัวอย่างการเข้ารหัสและถอดรหัสเป็นดังนี้
use phpseclib\Crypt\RSA;
...

$publicKey = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCEa1ivzN/iW1wBTyT1T6uPcDKzi3HlCBCp3ro61ZxA1byilNH/TP7HW3iFAh0A0Lyk7dZ7d6Ot4jdsXc783T+Ic0n2Blfh0kCm0ci7q2qXqOLpCa6N30LQyiDofSmaLRzQlD49kjVY8GJYrdqo7lEQvBupenJzjS71LgkIqq+BeQIDAQAB';

$privateKey = 'MIICXQIBAAKBgQCEa1ivzN/iW1wBTyT1T6uPcDKzi3HlCBCp3ro61ZxA1byilNH/TP7HW3iFAh0A0Lyk7dZ7d6Ot4jdsXc783T+Ic0n2Blfh0kCm0ci7q2qXqOLpCa6N30LQyiDofSmaLRzQlD49kjVY8GJYrdqo7lEQvBupenJzjS71LgkIqq+BeQIDAQABAoGAVfYZrIYjEJ6eK3tlUppVlNgREd0EItoJdzzPSEJDHROjUSeq60DgZCpNIossqMrYq3h6M8yGxOqFcCO1qxE1nDhwMRxNYALnM8yBfVTe/RfASD7A+XLBB4HKOPPAs7HjPj6rdJpTSLxSNFXW7lMmw+AUTuI1B5TTqINWR83rewECQQDrYAXjdB9/Xg2x+tW6kBh3Dcdm12d3bTIXklfVeds4/3tvJyZkWi/FnNAkZLG40+R39xzP2s+XbN4Ul14aok4VAkEAkAXNBC++X+91esEIwTf4RTMxn7Q/m5F9j7G827bTWUJ+oPCoCnmdLth+9QfMyVboo4D7P8w+trm665+emV7i1QJBALdBZrRFh/RxdPY6VkdPw0yGFNb0JKFuCg8iKHKT0mPZPfA3qgN92C3iPofnQhumFf51DiCiuvepkmqzw1e3QFUCQEDznMYqkfzKDX1S2RPqnfj3YYXY0Gbkcm//hGDCTwaOSnVikyZGOnEKChePcPfMThaO8MCQ6CeYE4h38BrTBBECQQDDp8w+aItksMhcLGIyPRZZmlLew6ic+Pv+8fES9apzy/13MbBpxm/oPVavftLQi+6N29eTtqbE7lL1hRcdsUqn';

$plaintext = 'test';

$rsa = new RSA();

$rsa->loadKey($publicKey);
$ciphertext = $rsa->encrypt($plaintext);

$rsa->loadKey($privateKey);
echo $rsa->decrypt($ciphertext);
สำหรับตัวอย่างการ Verify key เป็นดังนี้
$plaintext = 'ThisIsTest';

$rsa = new RSA();
$rsa->loadKey($privateKey);
$signature = $rsa->sign($plaintext);

$rsa->loadKey($publicKey);
$rsa->verify($plaintext, $signature); // Throw exception if verification is failed

Tuesday, February 25, 2020

[Laravel - Model] การเข้ารหัสและถอดรหัสค่าของฟิลด์ใน Laravel Model โดยใช้ SSH Keys
[Laravel - Model] Field Values Encryption and Decryption in Laravel Model by Using SSH Key

สืบเนื่องจากโพสต์ [Laravel - Model] การเข้ารหัสและถอดรหัสค่าของฟิลด์ใน Laravel Model ที่เราเข้ารหัสข้อมูลก่อนเก็บลงฐานข้อมูล โดยใช้การเข้ารหัสและถอดรหัสของ Laravel ซึ่งใช้ APP_KEY ใน .env เป็น key ทำให้คนที่เข้าถึง application สามารถถอดรหัสข้อมูลได้

เพื่อเพิ่มความปลอดภัยขึ้นไปอีกขั้น เราจะเปลี่ยนจากการใช้ APP_KEY ใน .env เป็น SSH Keys ซึ่งแยกเป็น Public key และ Private key แทน โดยเราจะได้เพียง Public key มาใช้ในการเข้ารหัส แต่คนมีสิทธิ์ดูข้อมูลเท่านั้นที่จะมี Private key เพื่อใช้ถอดรหัสข้อมูล

Monday, January 6, 2020

[Laravel - Scheduler] ระวัง!!! การไม่กำหนด username ใน Cron Entry สามารถทำให้เกิด "Permission Denied" ได้
[Laravel - Scheduler] Warning!!! Adding Cron Entry without Specify Username May Cause "Permission Denied"

จากตัวอย่างใน Starting The Scheduler จะกำหนดให้ใส่ cron entry ดังนี้
 
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
ถ้าหากเราตั้งค่าข้างต้นใน crontab ของ root จะมีผลทำให้ folder ที่ถูกสร้างโดย Laravel command ที่ถูกรัน เป็นสิทธิ์ root ทันที

ผลกระทบ คือ เมื่อ controller พยายามเขียนไฟล์หรือสร้าง folder ภายใน folder ดังกล่าว จะเกิด Permission Denied ขึ้น ซึ่งอาจจะทำให้หน้าเว็บไม่สามารถใช้งานได้เลย

วิธีการป้องกัน คือ ให้ใส่ cron entry โดยกำหนด username ที่รันเป็น user ที่ใช้รัน web server ดังนี้
 
* * * * * username cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
โดยปกติแล้ว username ที่รัน PHPFPM จะเป็น www-data ดังนั้น cron entry จะเป็นดังนี้
 
* * * * * www-data cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

หมายเหตุ กรณีที่สร้าง folder ด้วยสิทธิ์ root ไปแล้ว ให้แก้ไขโดยใช้คำสั่งดังนี้
 
chown username folder_name
เช่น
 
chown www-data storages

Thursday, December 26, 2019

[Laravel - Blade Template] การใช้งาน Loops ประเภทต่างๆ
[Laravel - Blade Template] How to Use Each Loop Types

For Loop

@for ($i = 0; $i < 10; $i++)
    The current value is {{ $i }}
@endfor

ForEach Loop

@foreach ($users as $user)
    This is user {{ $user->name }}
@endforeach

ForElse Loop - ForEach with handling for empty inputs

@forelse ($users as $user)
    This is user {{ $user->name }}
@empty
    No users
@endforelse

[Laravel - Blade Template] การตรวจสอบเงื่อนไขใน Blade Template
[Laravel - Blade Template] How to Use Conditional Statement

If Statement

@if (count($record) > 0)

@elseif (count($record) < 0)

@else

@endif

Unless Statement

@unless (count($record)< 0)

@endunless

[Laravel - Blade Template] การตรวจสอบการเข้าใช้งานและการตรวจสอบสิทธิ์การใช้งาน
[Laravel - Blade Template] Authentication and Authorization

การตรวจสอบการเข้าใช้งาน 

มี 2 แบบดังนี้
  • ตรวจสอบว่า user ได้เข้าสู่ระบบแล้ว
  • @auth
    
    @else
    
    @endauth
    
  • ตรวจสอบว่า user ยังไม่ได้เข้าสู่ระบบแล้ว
  • @guest
    
    @else
    
    @endguest
    

[Laravel - Blade Template] การสร้าง Layout และการ Extend Layout
[Laravel - Blade Template] How to Create and Extend Layout

การสร้าง Layout

การสร้าง Layout เป็นการสร้างเว็บเพจด้วย HTML เช่นเดียวกับหน้าเว็บทั่วไป แต่แทนค่าส่วนต่างๆที่จะใช้โดย child view ด้วย directives ซึ่งมี directives ที่เกี่ยวกับ Layout ดังนี้
  • @section ใช้ประกาศ section ในส่วนของเนื้อหา
  • @show ใช้ประกาศ section และใช้แสดงเนื้อหาของ section นั้น
  • @yield ใช้แสดงเนื้อหาของ section ที่ระบุ
ตัวอย่าง เช่น
@section('sidebar')
    This is the master sidebar.
@show

<div class="container">
    @yield('content')
</div>

Wednesday, December 11, 2019

[Laravel - Package] วิธีการใช้งาน Laravel Modules
[Laravel - Package] How to Use Laravel Modules

Modules

การสร้าง Module ใหม่

php artisan module:make module_name
ยกตัวอย่าง เช่น
php artisan module:make Projects

การตั้ง namespace ของ Class

namespace namespace_name\module_name\Http\Controllers;
ยกตัวอย่าง เช่น
namespace Modules\Projects\Http\Controllers;

[Laravel - Blade Template] การนำเข้า Template อื่นพร้อมกับกำหนด Parameter สำหรับ Template นั้น
[Laravel - Blade Template] How to Include Other Template with Parameters

โดยปกติแล้ว เวลาเราต้องการเพิ่ม template อื่นใน template หลักของเรา เราจะใช้โค้ดดังนี้
@include('menu.index')
Template ดังกล่าวถูกทำขึ้น เพื่อนำเข้าไปใช้ประโยชน์ในหลาย template หลัก เช่น template ของส่วนเมนูที่ต้องนำไปเพิ่มเข้าทุก template ที่ต้องการแสดงส่วนของเมนู

แต่ในบางครั้ง เราต้องการส่ง parameter เข้าไปยัง template ดังกล่าวด้วย เช่น การกำหนดว่า template หลักที่เพิ่ม template นั้นๆเข้ามาเป็น template เกี่ยวกับอะไร เพื่อแสดงเมนูในส่วนที่เกี่ยวข้องแตกต่างจากส่วนอื่น เป็นต้น เราสามารถใช้โค้ดดังนี้
@include('menu.index', ['group'=> 'users'])
จากตัวอย่าง เราส่ง parameter ชื่อ group เข้าไปยัง template menu.index ทำให้ใน template ดังกล่าว เราสามารถใช้ตัวแปร $group ได้

Tuesday, December 3, 2019

[Laravel - Package] วิธีการติดตั้งและตั้งค่า Laravel Debugbar
[Laravel - Package] How to Install and Config Laravel Debugbar

Laravel Debugbar เป็น package ที่รวม PHP Debug Bar เข้ากับ Laravel เพื่อใช้แสดงข้อมูลจากส่วนต่างๆของ Application

วิธีการติดตั้ง

  1. สั่งติดตั้ง Laravel Modules package
  2. composer require barryvdh/laravel-debugbar --dev
  3. สร้างไฟล์ config ของ package ใน project
  4. php artisan vendor:publish --provider="Barryvdh\Debugbar\ServiceProvider"
    

[Laravel - Package] วิธีการติดตั้งและตั้งค่า Laravel Modules
[Laravel - Package] How to Install and Config Laravel Modules

Laravel Modules เป็น package ที่สร้างขึ้น เพื่อจัดการ Laravel application ที่มีขนาดใหญ่ โดยการแบ่งเป็น module ย่อยๆ

วิธีการติดตั้ง

  1. สั่งติดตั้ง Laravel Modules package
  2. composer require nwidart/laravel-modules
  3. สร้างไฟล์ config ของ package ใน project
  4. php artisan vendor:publish --provider="Nwidart\Modules\LaravelModulesServiceProvider"