ฉันจะติดตั้งแพ็คเกจ PHP ของ Composer โดยไม่มี Composer ได้อย่างไร


107

ฉันกำลังพยายามติดตั้ง Coinbase PHP API แต่ต้องใช้ Composer:

https://github.com/coinbase/coinbase-php

ฉันกำลังมองหาโซลูชัน PHP สากล (อาจเป็นฟังก์ชัน) เพื่อให้ฉันติดตั้งแพ็คเกจคอมโพสิตลงในเซิร์ฟเวอร์โดยตรงโดยไม่ต้องใช้ Composer

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

มันจะช่วยได้มากถ้ามีวิธีแก้ปัญหาที่ยืดหยุ่นหรือแนวทางบางอย่างที่เราสามารถติดตั้งได้โดยไม่ต้องใช้ Composer? ฉันจะทำเช่นนี้ได้อย่างไร?

โปรดอย่าตอบกับบางความคิดเห็นแดกดัน มีคนที่ไม่ต้องการใช้ Composer และฉันไม่เห็นว่าทำไมเราจึงควรรวมกลุ่มไว้ในซอฟต์แวร์ของบุคคลที่สามโดยเฉพาะเพื่อทำการพัฒนาเว็บ


7
แพ็คเกจทั้งหมดที่ใช้โปรแกรมแต่งเพลงยังคงเป็นเพียงไดเร็กทอรีที่เต็มไปด้วยไฟล์ PHP คุณสามารถติดตั้งได้ในลักษณะเดียวกับที่คุณเคยทำก่อนที่นักแต่งเพลงจะมีอยู่: คัดลอกincludeไฟล์เหล่านี้ไปที่ไหนสักแห่ง
หลอกลวง

2
การติดตั้งโดยใช้ Composer หมายถึงการรันคำสั่งเดียวซึ่งมักจะแสดงในโฮมเพจของแพ็กเกจ ฉันเข้าใจว่ามีกรณีการใช้งานสำหรับการติดตั้งด้วยตนเอง แต่มันจะไม่มีวิธีที่ง่ายกว่านี้
ÁlvaroGonzález

21
@ ÁlvaroGonzálezฉันไม่เห็นด้วยกับความคิดเห็นของคุณมากขึ้น โปรดดูที่: okmaya.com/2016/03/13/package-managers-hate-npm-composer ฉันไม่ได้บอกว่าผู้จัดการแพ็กเกจไม่ดีสำหรับบางคนและบางโครงการเพียงแค่ว่าพวกเขามักต้องการงานและความพยายามมากกว่าการวางโฟลเดอร์ในโครงการของคุณและอ้างถึง
dallin

3
@dallin แม้จะมีชื่อเรื่อง แต่บทความนั้นส่วนใหญ่เป็นการคุยโวเกี่ยวกับเฟรมเวิร์กและโซ่เครื่องมือที่ทันสมัยกว่า (เป็นปัญหาของตัวมันเอง) หากคุณต้องการติดตั้งไลบรารีที่มีการอ้างอิง 30 รายการการทิ้ง Composer เพื่อสนับสนุนการติดตั้งด้วยตนเอง 30 ครั้งสามารถทำให้คุณรู้สึกเป็นผู้ชายมากขึ้นหรืออะไรก็ตาม แต่ฉันจะไม่เรียกว่าง่ายกว่าสำหรับนักพัฒนามือใหม่
ÁlvaroGonzález

10
@ ÁlvaroGonzálezพูดตามตรงฉันไม่จำเป็นต้องติดตั้งไลบรารีที่มีการอ้างอิง 30 รายการ (ฟังดูแย่มาก) ฉันแน่ใจว่ามันจะเป็นฝันร้ายหากไม่มีผู้จัดการแพ็คเกจ ประสบการณ์ของฉันแม้ว่าจะคล้ายกับบทความนั้น ฉันมักจะพยายามติดตั้งบางอย่างด้วยการอ้างอิงหนึ่งหรือสองรายการและต้องใช้เวลาในการแก้ไขปัญหากับตัวจัดการแพ็คเกจก่อนที่ฉันจะเริ่มเขียนโค้ด ข้อความแสดงข้อผิดพลาดนั้นเกิดขึ้นบ่อยเกินไปและคลุมเครือและลึกลับอย่างเหลือเชื่อ ซึ่งอาจแสดงให้เห็นถึงความรู้สึกของฉันดีกว่า: imgur.com/r/webdev/bO7oTf6 ประสบการณ์ของฉันกับ PM มีความคล้ายคลึงกัน
dallin

คำตอบ:


39

composer.jsonไฟล์แสดงรายการอ้างอิง ในตัวอย่างของคุณ:

"require": {
    "php": ">=5.5.0",
    "guzzlehttp/guzzle": "^6.0",
    "psr/http-message": "^1.0",
    "psr/log": "^1.0"
},

จากนั้นคุณจะต้องค้นหาแพ็คเกจที่เกี่ยวข้องในไฟล์ ไซต์packagist ทำซ้ำขั้นตอนเดียวกันสำหรับการอ้างอิงแต่ละรายการ: ค้นหาการอ้างอิงเพิ่มเติมในcomposer.jsonไฟล์ที่เกี่ยวข้องและค้นหาอีกครั้ง

ในที่สุดเมื่อคุณมีรายการแพ็คเกจที่ต้องการทั้งหมดคุณจะต้องติดตั้งทีละรายการเท่านั้น ส่วนใหญ่เป็นเพียงการทิ้งไฟล์ไว้ที่ใดที่หนึ่งในไดเรกทอรีโครงการของคุณ แต่คุณต้องมั่นใจด้วยว่า PHP สามารถค้นหาคลาสที่ต้องการได้ เนื่องจากคุณไม่ได้ใช้ตัวโหลดอัตโนมัติของ Composer คุณจึงต้องเพิ่มลงในตัวโหลดอัตโนมัติที่คุณกำหนดเอง คุณสามารถค้นหาข้อมูลจากcomposer.jsonไฟล์ที่เกี่ยวข้องเช่น:

"autoload": {
    "psr-4": { "Coinbase\\Wallet\\": "src/" }
},

หากคุณไม่ได้ใช้ class auto-loader คุณจะต้องหาข้อมูลแต่ละตัว require_onceคำสั่งรายการ คุณอาจต้องลองผิดลองถูกมากมายเพราะผู้เขียนห้องสมุดส่วนใหญ่ไม่สนใจที่จะจัดทำเอกสารนั้น

นอกจากนี้และในกรณีที่มีความสับสนเกี่ยวกับสิ่งนี้:

  • นักแต่งเพลงมีตัวติดตั้ง GUI อย่างเป็นทางการสำหรับ Windows และคัดลอกแล้ววางขั้นตอนการติดตั้งบรรทัดคำสั่งสำหรับทุกแพลตฟอร์ม
  • นักแต่งเพลงสามารถเรียกใช้ในเครื่องและเอาท์พุทเพียงอัพโหลดที่อื่น คุณไม่จำเป็นต้องใช้ SSH ในโฮสติ้งที่ใช้ร่วมกันของคุณ
  • คำสั่งที่จำเป็นในการติดตั้งไลบรารีสามารถคัดลอกและวางได้จากเว็บไซต์แพ็กเกจแม้ว่าผู้ดูแลแพ็กเกจจะไม่สนใจที่จะจัดทำเอกสาร แต่ packagist.org จะสร้างขึ้นตามค่าเริ่มต้น

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


ฉันได้ตรวจสอบคำตอบอื่น ๆ ที่มาหลังจากฉันแล้ว พวกเขาส่วนใหญ่แบ่งออกเป็นสองประเภท:

  1. ติดตั้งไลบรารีและเขียนสคริปต์ดาวน์โหลดที่กำหนดเองด้วย
  2. ใช้อินเทอร์เฟซออนไลน์บนเว็บสำหรับนักแต่งเพลง

เว้นแต่ฉันจะทำอะไรหายไปก็ไม่มีใครตอบข้อร้องเรียนของ OP:

  • เส้นโค้งการเรียนรู้
  • การใช้ซอฟต์แวร์ของบุคคลที่สาม
  • ความเป็นไปได้ในการพัฒนาบนเซิร์ฟเวอร์ (ใช้ SSH ฉันคิดว่า)
  • ต้นไม้พึ่งพาลึกที่อาจเกิดขึ้น

29
หากสิ่งนี้ไม่ได้โน้มน้าวให้ทุกคนใช้นักแต่งเพลงก็จะไม่มีอะไร…
หลอกลวง

3
ก่อนอื่นผู้แต่งเวอร์ชันปัจจุบันต้องใช้ proc_open () ซึ่งไม่สามารถใช้ได้ทุกที่ และยังมีปัญหาอื่น ๆ อีกด้วย ในขณะที่ฉันยอมรับว่านักแต่งเพลงมีข้อดี แต่ฉันรู้มาตลอดว่าวันหนึ่งฉันจะประสบปัญหาและวันนี้ก็เป็นเช่นนั้น ฉันยังไม่ทราบวิธีการติดตั้งไลบรารีที่ใช้ร่วมกันสำหรับแอปพลิเคชันไคลเอนต์มากกว่า 50 รายการ (โดยใช้ Composer)
karvonen

9
ฉันหวังว่านักพัฒนาห้องสมุดจะหยุดใช้นักแต่งเพลง ไม่ต้องไปในสภาพแวดล้อมการผลิตที่จริงจังใด ๆ คนที่ซ่อนตัวอยู่เบื้องหลัง 'แค่ใช้นักแต่งเพลง' ไม่รู้ว่าพวกเขากำลังทำอะไรอยู่ในตอนแรก
IncredibleHat

1
หัวเราะใน JS
Obed Marquez Parlapiano

ฉันคิดว่าสิ่งที่ @ObedMarquezParlapiano พยายามจะพูดคือการจัดการแพ็คเกจเป็นเพียงเครื่องมือในการจัดการกับการอ้างอิงโครงการและการร้องเรียนเกี่ยวกับอดีตมักเกิดจากสิ่งหลังเพราะอย่างน้อยเครื่องมือมาตรฐาน PHP de-facto ก็มีความน่าเชื่อถือพอสมควร ใครกำลังดิ้นรนกับ NPM ของ Node.js สามารถยืนยันได้ แน่นอนฉันอาจจะคิดผิด
ÁlvaroGonzález

121

คุณสามารถลองhttps://php-download.com/ซึ่งสามารถช่วยให้คุณดาวน์โหลดการพึ่งพาได้ตลอดเวลาพร้อมกับvendorโฟลเดอร์ สัญญาว่าไม่จำเป็นต้องใช้นักแต่งเพลง พยายามด้วยตัวเอง ค้นหาและสร้างโฟลเดอร์ที่จำเป็นทั้งหมดและซิปเพื่อดาวน์โหลด ทำงานได้อย่างสมบูรณ์ !!


5
ทำงานได้อย่างสมบูรณ์แบบ! ขอบคุณ !!
Yousphere

28
นี่ควรเป็นคำตอบที่ได้รับการยอมรับ มันทำในสิ่งที่นักแต่งเพลงทำแล้วส่งกลับ zip

ไม่มีไลบรารีทั้งหมดจาก github เมื่อฉันลองใช้อันนี้เช่นgithub.com/mgp25/Instagram-APIมันบอกว่าไม่พบ
Andi Hamolli

3
คำตอบด้านบนบอกขั้นตอนมากมายที่ต้องทำในขณะที่เว็บไซต์ลดขั้นตอนให้ดาวน์โหลดได้ 1 ขั้นตอน ฉันไม่ใช่โปรแกรมเมอร์มืออาชีพ แต่ PHP ช่วยให้ฉันทำเรื่องบ้าๆได้อย่างง่ายดายโดยที่ฉันไม่จำเป็นต้องเรียนรู้ SSH หรือนักแต่งเพลงหรือแพ็คเกจ .... สิ่งเหล่านี้มีไว้สำหรับมืออาชีพและผู้เชี่ยวชาญ .... เว็บไซต์ได้ลบข้อ จำกัด นั้นออก .. ... ฉันเชื่อว่าทุกคนที่โหวตคำตอบของฉันพบว่าเว็บไซต์ทำได้ดีกว่านักแต่งเพลง ..... ถ้าคุณทำได้ .... มันจะช่วยโปรแกรมเมอร์ทุกคนที่ไม่ใช่คนเก่ง
jahajee.com

4
ÁlvaroGonzález. โดยส่วนตัวแล้วฉันไม่สนใจว่านักแต่งเพลงจะรวบรวมโปรเจ็กต์บนเครื่องอื่นหรือไม่ ฉันไม่มีสิทธิ์ติดตั้งในเครื่องทั้งหมดที่ฉันใช้งานและบางครั้งฉันต้องได้รับไลบรารีบนเครื่อง windows โดยไม่ต้องเรียกใช้ไฟล์ exe ฉันขอขอบคุณผู้แต่งฉันไม่สามารถใช้มันได้ตลอดเวลาซึ่งน่าผิดหวังหากไม่มีไซต์นี้ในการคอมไพล์ล่วงหน้าให้ฉัน
Altimus Prime

9

ฉันใช้โฮสติ้งที่ใช้ร่วมกันสำหรับเว็บไซต์และไม่สามารถดำเนินการคำสั่งที่นั่นได้ นอกเหนือจากการเรียกใช้โปรแกรมแต่งเพลงผ่านคำขอสคริปต์ php ที่ฉันขอผ่านเบราว์เซอร์ฉันมักจะใช้เวิร์กโฟลว์นี้:

  • ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้ง php ในเครื่องแล้ว
  • สร้างไดเร็กทอรีบนเดสก์ท็อป
  • ดาวน์โหลด composer.phar จากhttps://getcomposer.org/download/ (ภายใต้ส่วนหัว* ดาวน์โหลดด้วยตนเอง ) และวางไว้ในไดเร็กทอรี
  • ทำให้ไฟล์composer.jsonวางในเนื้อหาต่อไปนี้

     {
         "require": {
             "coinbase/coinbase": "~2.0"
         }
     }
    
  • เรียกดูไดเร็กทอรีด้วยเชลล์ที่คุณเลือก (bash, git-bash, cmd, windows bash)

  • ชนิด php composer.phar update ภาพหน้าจอของ bash output
  • อัปโหลดไดเร็กทอรีผู้ขายไปยังเว็บเซิร์ฟเวอร์ของคุณผ่าน ftp หรือช่างเครื่องที่คุณใช้
  • รวมไว้ในโปรเจ็กต์ php ของคุณที่คุณโหลดไลบรารีของคุณ (แก้ไขพา ธ ไปยังตำแหน่งที่คุณอัปโหลด dir ผู้จำหน่ายเพื่อรวมไฟล์โหลดอัตโนมัตินั้น)

    require_once('vendor/autoload.php');
    

ด้วยวิธีนี้คุณจะได้รับประโยชน์จากการจัดการการพึ่งพาและคุณไม่จำเป็นต้องรวมไฟล์ทั้งหมดกว่าล้านล้านไฟล์ด้วยตนเองและดาวน์โหลดการอ้างอิงทั้งหมดด้วยตนเองและการอัปเดตก็ทำได้ง่ายเพียงแค่พิมพ์php composer.phar updateแล้วแทนที่ผู้จำหน่ายบนเซิร์ฟเวอร์ของคุณด้วย อันใหม่.


4

ฉันต้องทำสิ่งนี้สำหรับเซิร์ฟเวอร์ FTP ที่ฉันไม่มีสิทธิ์เข้าถึง SSH ไซต์ที่อยู่ในรายการนี้ใช้งานได้แล้วฉันก็รู้ว่าคุณสามารถทำการติดตั้งนักแต่งเพลงบนเซิร์ฟเวอร์ของคุณเอง (โดยใช้เวอร์ชัน PHP ของเป้าหมายของคุณ) จากนั้นคัดลอกไฟล์ทั้งหมด


1
นั่นน่าจะเป็นคำตอบ ทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน
Michael Walter

1
คุณช่วยอธิบายคำตอบของคุณให้ดีขึ้นได้ไหม ขออภัยในความโง่เขลาของฉัน
Andi Hamolli

1
@IchHabsDrauf โดยทั่วไปเขาคิดว่าจะใช้นักแต่งเพลง (ในส่วนนี้ไม่ใช่ anwser จริงๆ) และคัดลอกไฟล์ไปยังสภาพแวดล้อมการผลิต ความคิดเห็นของฉันอาจเป็นไปได้ว่าอาจมีคนที่ไม่มีนักแต่งเพลงในสภาพแวดล้อม dev ด้วยดังนั้นนี่จึงไม่ใช่ anwser จริงๆ
Gall Annonim

3

นี่ไม่ใช่ทางออกที่ดีที่สุด แต่สำหรับฉันมันเป็นความช่วยเหลือที่ยิ่งใหญ่สำหรับกรณีส่วนใหญ่: https://github.com/Wilkins/composer-file-loader

อนุญาตให้คุณโหลดไฟล์ composer.json เช่นเดียวกับที่นักแต่งเพลงจะทำ สิ่งนี้ช่วยให้คุณสามารถโหลดไฟล์ composer.json ได้โดยไม่ต้องมีผู้แต่ง (ตามทฤษฎีแล้ว PHP 5.2 ก็เพียงพอแล้ว)

ฉันรู้ว่าคำถามเก่า แต่ฉันหวังว่ามันจะช่วยใครสักคนได้


2

ทางเลือกอื่นที่ใช้งานได้สำหรับฉัน (เนื่องจาก php-download ไม่ทำงาน) สามารถทำได้โดยการสร้างตัวดาวน์โหลดนักแต่งเพลงในท้องถิ่น

  1. ดาวน์โหลดและติดตั้ง XAMPP ในเครื่อง: https://www.apachefriends.org/index.html
  2. ดาวน์โหลดและติดตั้งนักแต่งเพลงในเครื่อง: https://getcomposer.org/download/
  3. เปิด commandprompt นำทางเพื่อพูดc:\tempและพิมพ์การอ้างอิงของผู้แต่งตัวอย่างเช่น:composer require league/oauth2-client
  4. คัดลอกไฟล์จากc:\tempโฟลเดอร์ของคุณไปยังโฮสต์เว็บของคุณโดยใช้โปรแกรม FTP
  5. เพิ่มสิ่งนี้ที่ด้านบนของ php ของคุณ: require("vendor/autoload.php");

ทำงานอย่างมีเสน่ห์! ขอบคุณสำหรับสิ่งนี้ :)
Aaron Meese

0

การวิเคราะห์ปัญหา

ปัญหาในการติดตั้งการอ้างอิงโดยไม่มี Composerคือระบบโหลดอัตโนมัติ

นักแต่งเพลงที่ใช้โหลดโฮมเมดขึ้นอยู่กับแผนที่อาร์เรย์นี้เป็นมาตรฐานโดยพฤตินัย แต่ระบบโหลดอัตโนมัตินี้ "โดยบังเอิญ" ในกรณีนี้ไม่สอดคล้องกับ PSR-4

PSR-4 เป็นมาตรฐานde-iureสำหรับการโหลดอัตโนมัติในคลาส PHP ดังนั้นคุณจึงไม่สามารถหลีกหนีจากการโหลดอัตโนมัติได้ คุณต้องใช้หนึ่งในนั้น

ข้อเสนอโซลูชัน

ในกรณีนี้ตัวโหลดอัตโนมัติ PSR-4 ที่ยอดเยี่ยมนี้สามารถกำหนดค่าด้วยตนเองเพื่อโหลดอัตโนมัติVendorClassในVendorNamespaceที่ใดก็ได้ในโค้ดของคุณตราบเท่าที่คุณต้องการautoload.phpไฟล์ที่กำหนดเองในช่วงต้นของซอร์สโค้ดของคุณ

ตัวอย่างชีวิตจริง

ลองดูตัวอย่างนี้: ฉันมีโครงการเดิมที่ทำไม่ได้และจะไม่ใช้ Composer ไม่เคยและไม่เคยแม้ว่าพระเจ้าจะอนุญาตด้วยปาฏิหาริย์ โครงการนี้จะมีความเร็วในการพัฒนาที่ยอดเยี่ยมนี้กับแพคเกจสำหรับสคริปต์บรรทัดคำสั่ง นี่คือโครงสร้างไดเรกทอรีโครงการของฉัน:

 - src
 - tests
 - vendor (not the Composer's one)

แพ็คเกจนี้มีโครงสร้างไดเร็กทอรีนี้:

 - examples
 - src
   - Commando
 - tests

สิ่งเดียวที่ฉันต้องการคือsrcโฟลเดอร์ การวางโฟลเดอร์นี้ในโฟลเดอร์ผู้ขายของฉันก็ใช้ได้ ดังนั้นตัวโหลดอัตโนมัติที่กำหนดเองของฉันจะเป็นดังนี้:

// Constants
$base_path = "path\to\my\project";
$autoloader_class = '\vendor\MarcoConsiglio-Wichee\PSR-4-Autoloading\Psr4AutoloaderClass.php';
define("BASE_PATH", str_replace("\\", DIRECTORY_SEPARATOR, $base_path));

// Autoloader
require_once BASE_PATH.'\vendor\MarcoConsiglio-Wichee\PSR-4-Autoloading\Psr4AutoloaderClass.php';

// Init the autoloader.
$package = [
    "nategood\commando" => [
        "namespace" => "Commando",
        "path" => str_replace("\\", DIRECTORY_SEPARATOR, '\vendor\nategood\commando\src\Commando')
    ],
    "kevinlebrun\colors.php" => [
        "namespace" => "Colors",
        "path" => str_replace("\\", DIRECTORY_SEPARATOR, '\vendor\kevinlebrun\colors.php\src\Colors')
    ]
];

// Register namespaces.
$loader = new \PSR4\Psr4AutoloaderClass;
$loader->register();
                      // Namespace                                      // Path to source
$loader->addNamespace($package["nategood\commando"]["namespace"],       BASE_PATH.$package["nategood\commando"]["path"]);
$loader->addNamespace($package["nategood\commando"]["namespace"],       BASE_PATH.$package["nategood\commando"]["path"]."\Util");
$loader->addNamespace($package["kevinlebrun\colors.php"]["namespace"],  BASE_PATH.$package["kevinlebrun\colors.php"]["path"]);

ตอนนี้ฉันสามารถใช้แพ็คเกจคำสั่งได้ทุกที่ในโปรเจ็กต์ของฉัน!

ข้อเสียข้อดี

โซลูชันนี้ช่วยให้คุณ:

  • สร้างตัวโหลดอัตโนมัติแบบกำหนดเองได้อย่างง่ายดายและด้วยตนเอง (คุณจะต้องระบุVendorNamespaceและโฟลเดอร์ที่ค้นหาVendorClasses ในไฟล์VendorNamespace.
  • จัดระเบียบการพึ่งพาผู้แต่งของคุณได้อย่างอิสระทุกที่ในโฟลเดอร์โครงการของคุณ (และทำไมไม่อยู่นอกมัน)
  • นำเข้าแพ็กเกจ Composer ตามที่อยู่ในโปรเจ็กต์ของคุณ (ไม่ว่าจะดาวน์โหลดในเครื่องด้วย Composer หรือโคลนที่เก็บแพ็กเกจ) หรือส่วนที่เกี่ยวข้อง (เช่นการลบไฟล์ composer.json หรือไฟล์ที่ต้องใช้ตัวโหลดอัตโนมัติของผู้แต่ง)

จุดด้อย:

  • สร้างตัวโหลดอัตโนมัติที่กำหนดเองด้วยตนเองหมายถึงการทำงานกับทุกๆพึ่งพาที่จำเป็นของโครงการของคุณ (ฉันหวังว่าจะไม่มาก)
  • ข้อผิดพลาดในเส้นทางต้นทางของแพ็กเกจอาจเป็นเรื่องที่น่าเบื่อและน่าหงุดหงิด
  • ใช้งานได้กับชื่อไฟล์ที่รองรับ PSR-4 เท่านั้น (เช่นใช้A.class.phpชื่อไฟล์ไม่ได้)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.