ฉันควรเลือก Doctrine 2 หรือ Propel 1.5 / 1.6 และทำไม [ปิด]


30

ฉันต้องการได้ยินจากผู้ที่ใช้ Doctrine 2 (หรือใหม่กว่า) และ Propel 1.5 (หรือใหม่กว่า) การเปรียบเทียบส่วนใหญ่ระหว่างผู้ทำแผนที่เชิงสัมพันธ์ของวัตถุทั้งสองนั้นอ้างอิงจากเวอร์ชันเก่า - Doctrine 1 เทียบกับ Propel 1.3 / 1.4 และ ORM ทั้งสองผ่านการออกแบบที่สำคัญในการแก้ไขล่าสุดของพวกเขา ตัวอย่างเช่นการวิพากษ์วิจารณ์ส่วนใหญ่ของ Propel นั้นดูเหมือนจะอยู่กึ่งกลางของคลาส"ModelName Peer " ซึ่งถูกคัดค้านใน 1.5 ทุกกรณี

นี่คือสิ่งที่ฉันได้สะสมจนถึงขณะนี้ (และฉันพยายามทำให้รายการนี้สมดุลเท่าที่จะเป็นไปได้ ... ):

  • ขับเคลื่อน
    • ข้อดี
      • เป็นมิตรกับ IDE อย่างยิ่งเนื่องจากมีการสร้างรหัสจริงแทนที่จะใช้วิธีเวทมนต์ PHP ซึ่งหมายความว่าฟีเจอร์ IDE เช่นการทำให้โค้ดสมบูรณ์มีประโยชน์จริง ๆ
      • เร็ว (ในแง่ของการใช้ฐานข้อมูล - ไม่มีการทำวิปัสสนาบนฐานข้อมูล)
      • ล้างการโยกย้ายระหว่างเวอร์ชันสกีมา (อย่างน้อยใน 1.6 เบต้า)
      • สามารถสร้างแบบจำลอง PHP 5.3 (เช่นเนมสเปซ)
      • เชื่อมโยงหลายสิ่งเข้าไว้ในฐานข้อมูลแบบสอบถามเดียวได้อย่างง่ายดายด้วยสิ่งต่างๆเช่นuseXxxวิธีการ (ดูวิดีโอ "การเติมโค้ด" ด้านบน)
    • จุดด้อย
      • ต้องการขั้นตอนการสร้างพิเศษคือการสร้างคลาสโมเดล
      • รหัสที่สร้างต้องสร้างใหม่เมื่อใดก็ตามที่มีการเปลี่ยนแปลงเวอร์ชันของ Propel การตั้งค่าจะเปลี่ยนไปหรือเปลี่ยนสคีมา สิ่งนี้อาจไม่ได้ใช้งานง่ายสำหรับบางวิธีและวิธีการที่กำหนดเองที่ใช้กับโมเดลนั้นสูญหายไป (ฉันคิดว่า?) - ไม่จริง; วิธีการที่กำหนดเองจะไม่สูญหายไปเนื่องจากคลาสที่สร้างขึ้นเป็นคลาสพื้นฐาน Propel จัดเตรียมคลาสเอนทิตีสำหรับการขยายโดยเฉพาะ
      • คุณลักษณะที่มีประโยชน์บางอย่าง (เช่นลักษณะการทำงานของเวอร์ชันการโยกย้ายแบบแผน) อยู่ในสถานะเบต้า
  • หลักคำสอน
    • ข้อดี
      • นิยมมากขึ้น
      • Doctrine Query Language สามารถแสดงความสัมพันธ์ที่ซับซ้อนระหว่างข้อมูลได้ง่ายกว่าด้วยกลยุทธ์ ActiveRecord ของ Propel
      • เพิ่มพฤติกรรมที่ใช้ซ้ำได้ง่ายกว่าเมื่อเปรียบเทียบกับ Propel
      • การแสดงความคิดเห็นโดยใช้ DocBlock เพื่อสร้างสคีมาจะถูกฝังใน PHP จริงแทนที่จะเป็นไฟล์ XML แยกต่างหาก
      • ใช้ PHP 5.3 Namespaces ได้ทุกที่
    • จุดด้อย
      • ต้องเรียนรู้ภาษาการเขียนโปรแกรมใหม่ทั้งหมด (Doctrine Query Language)
      • ดำเนินการในแง่ของ "วิธีการวิเศษ" ในหลายสถานที่ทำให้การเติมข้อความอัตโนมัติ IDE ไร้ค่า
      • ต้องการการวิปัสสนาฐานข้อมูลจึงช้ากว่า Propel เล็กน้อยตามค่าเริ่มต้น การแคชสามารถลบสิ่งนี้ แต่การแคชเพิ่มความซับซ้อนมาก
      • พฤติกรรมที่น้อยลงจะรวมอยู่ใน codebase หลัก คุณสมบัติหลายอย่างที่ Propel นำเสนอนอกกรอบ (เช่นชุดซ้อน) มีให้ผ่านทางส่วนขยายเท่านั้น
      • ขนาดใหญ่ของ Freakin :)

สิ่งนี้ฉันได้รวบรวม แต่ผ่านการอ่านเอกสารที่มีให้สำหรับเครื่องมือทั้งสอง - ฉันยังไม่ได้สร้างอะไรเลย

ฉันต้องการได้ยินจากผู้ที่ใช้เครื่องมือทั้งสองเพื่อแบ่งปันประสบการณ์ของพวกเขาเกี่ยวกับข้อดี / ข้อเสียของแต่ละไลบรารีและคำแนะนำของพวกเขาคืออะไร ณ จุดนี้ :)


คุณกำลังพูดถึงรุ่นหลักคำสอนใด v2 และ v1.2 เป็นขั้วแยก
Orbling

1
@Orbling: คุณอ่านชื่อเรื่องหรือเนื้อหาของคำถามหรือไม่ อ่านอีกครั้ง :)
Billy ONeal

@Billy ONeal: จุดดี Doctrine2 มีพฤติกรรมลบออกจาก Core อย่างสิ้นเชิงดังนั้นฉันคิดว่าคุณอาจพูดถึง v1.2 แทน
Orbling

@Orbling: อ่านั่นสมเหตุสมผลแล้ว ในทางตรงกันข้ามมันให้สิ่งที่เทียบเท่ากับ "พฤติกรรม" - แต่มันไม่ได้เรียกพวกมันว่า
Billy ONeal

@Billy ONeal: ไม่จริงหรอกคุณสามารถใช้มันด้วยตัวเองในลักษณะที่ค่อนข้างง่ายหรือคุณอาจได้รับปลั๊กอินของบุคคลที่สาม แต่มันไม่เหมือน Doctrine1 หรือ Propel
Orbling

คำตอบ:


15

ปิดกระแสในปัจจุบันเพื่อแนะนำลัทธิฉันต้องพูดเป็นอย่างอื่น โปรดจำไว้ว่าการตั้งค่าส่วนตัวของฉันมุ่งเน้นไปที่ประสบการณ์ส่วนตัวของฉัน แต่วิธีที่ @Dan พูดพวกเขาทั้งคู่มีศักยภาพมาก

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

ด้วยการใช้ Propel ฉันได้ทำการติดตั้ง รูปแบบการจัดเก็บสำหรับระบบของฉันและมันใช้งานได้ดีจริง ๆ ไม่ต้องพูดถึงประสิทธิภาพของ Propel ซึ่งเป็นหนึ่งใน ORM ที่เร็วที่สุดที่ฉันเคยเห็น

ดังนั้นคำตอบพื้นฐานของฉันคือPropelเพราะมันใช้งานซอฟต์แวร์ที่ดีโดยมีโค้ดน้อยลงและให้อำนาจแก่ IDE เพื่อให้คุณมีระบบ Intellisense ที่ดีโดยไม่สูญเสียจุดของซอฟต์แวร์ ORM ที่เชื่อมต่อกับฐานข้อมูลและทำสิ่งที่ดี ...

หวังว่าฉันสามารถช่วย


ฉันใช้ลัทธิเป็นเวลาหนึ่งปี ฉันลอง Kohana, Laravel Eloquent ฉันชอบเขตข้อมูลสาธารณะของพวกเขาเพราะฉันเกลียดชังผู้บุกรุกและสุนัข (ฉันชอบ accessor: P) หลังจากที่ฉันเห็นคำว่า 'IDE เป็นมิตร' ใน Propel ฉันตัดสินใจลองใช้ Propel คืนนี้
Zorji

11

ข้อมูลของคุณเกี่ยวกับ Doctrine 2 ไม่ถูกต้อง ...

  • DQL นั้นค่อนข้าง SQL ดังนั้นจึงไม่ต้องเรียนรู้มากนัก
  • หลักคำสอน 2 ไม่ได้ใช้ 'เวท' ใด ๆ (เฉพาะสิ่งที่คุณคาดหวังในคลัง PHP ที่ทันสมัย)
  • หลักคำสอน 2 ไม่ได้ทำวิปัสสนาฐานข้อมูลอย่างแข็งขัน ... การจับคู่จะถูกเก็บไว้ในไฟล์เอนทิตีของคุณและจะถือว่าฐานข้อมูลของคุณเหมาะสมกับสิ่งนั้น
  • การแคชนั้นแทบไม่มีความซับซ้อนมากนัก
  • หลักคำสอน 2 ไม่มี 'พฤติกรรม' นอกกรอบ

ฉันไม่เคยใช้ Propel มาก่อน แต่ Doctrine 2 นั้นใหม่กว่ามากและมี codebase คุณภาพสูงจริงๆ แต่ดูเหมือนว่า Propel ใช้ Active Record, Doctrine 2 ใช้รูปแบบ Data Mapper

ข้อเสียของ Doctrine 2 ที่ใหม่กว่าคือการขาดตัวอย่างของบุคคลที่สาม แต่มันก็สร้างขึ้นอย่างรวดเร็ว

ฉันแนะนำ Doctrine 2 ...


หากคุณยังไม่เคยใช้ Propel มาก่อนฉันไม่มีทางเลือกนอกจากลงคะแนนเนื่องจากเป็น FUD สำหรับความคิดเห็น "Magic" สิ่งที่ฉันหมายถึงคือมันขึ้นอยู่กับวิธีเวทย์มนตร์ PHP เช่น__getและ__set(ซึ่งเป็นจริง) มากกว่าวิธีการจริง
Billy ONeal

1
ตกลงสำหรับการลงคะแนน ... แต่ Doctrine 2 ใช้วิธีเวทมนต์ที่ไหน? นอกเหนือจากวิธีการค้นหาของ DocumentRepository * (__call) แต่นั่นไม่ใช่ปัญหาเพราะเป็นเพียงวิธีการสอบถามที่ดีกว่า ... คุณจะสูญเสียการเติมข้อความอัตโนมัติ IDE เสมอ ถ้าคุณต้องการให้ ActiveRecord ใช้ Propel หากคุณต้องการ Data Mapper ให้ใช้ Doctrine 2
Cobby

2
Propel ไม่ได้ทำการวิพากษ์ฐานข้อมูลที่ runtime เนื่องจากการสร้างรหัส
William Durand

หัวข้อย่อยรายการ # 1 ไม่ถูกต้องทั้งหมด DQL ไม่ได้ "สวยมาก" เช่น SQL DQL ขึ้นอยู่กับความจริงที่ว่าคุณกำลังอ้างถึงโมเดลวัตถุซึ่ง Doctrine ต้องระวังและมีความยุ่งยากบางอย่างหากจำเป็นต้องมีการรวมที่ซับซ้อนมากขึ้น
Mike Purcell

2
DQL เป็นภาษาถิ่นของ SQL วิธีที่ไม่ทำให้ "สวยมาก" เช่น SQL? ใช่ความหมายของภาษาแตกต่างกันเล็กน้อย (object vs. tables) แต่ท้ายที่สุด DQL เป็นภาษาสำหรับการสืบค้นข้อมูลที่มีโครงสร้าง - ซึ่งเพิ่งเกิดขึ้นเพื่อแสดงเป็นวัตถุที่ไม่ใช่ตาราง - SQL
Cobby

3

จากความคิดเห็นของคุณดูเหมือนว่าคุณกำลังพยายามเลือก Propel หรือ Doctrine เพื่อแทนที่หรือเติมเต็มความต้องการ ORM ในแอปพลิเคชันรุ่นเก่า

ที่ถูกกล่าวว่าฉันคิดว่ามันเป็นสิ่งสำคัญที่จะไม่สูญเสียสายตาของความจริงที่ว่าการย้ายไปที่หนึ่งอาจเป็นการปรับปรุงที่ดีในการสมัครของคุณ ดังนั้นจึงไม่มีคำตอบที่ผิดจริง

ดังนั้นวิธีการแก้ปัญหาที่คุณเลือกนั้นขึ้นอยู่กับความชอบของคุณตามคำตอบของคำถามต่อไปนี้:

  1. สิ่งที่ดีที่สุดที่รวมเข้ากับโซลูชันปัจจุบันของคุณ
  2. API ใดที่คุณต้องการ
  3. คุณอยากให้มีส่วนไหน (แพตช์เอกสารเอกสารรายงานข้อผิดพลาด ฯลฯ ... )

ส่วนตัวแล้วฉันอยากจะแนะนำหลักคำสอน 2เพราะเป็นชุมชนเอกสารและสถาปัตยกรรม


1
ฉันกำลังมองหาการเปรียบเทียบระหว่างพวกเขาที่นี่ว่า (เพราะเหตุใดฉันจึงสนับสนุนเรื่องนี้ฉันไม่ต้องการมีส่วนร่วมในเรื่องใด - ฉันต้องการใช้ห้องสมุดไม่ใช่เขียน!;)) คุณกำลังพูดว่า Doctrine 2 มีชุมชนเอกสารและสถาปัตยกรรมที่ดี - สถาปัตยกรรมฉลาดใช่มันคือ DataMapper เอกสารฉลาดฉันไม่แน่ใจว่าฉันเห็นด้วย - ทั้งสองโครงการดูเหมือนจะมีเอกสารที่ดี ฉันไม่เห็นชุมชนส่วนใหญ่ใช้ระบบใดระบบหนึ่ง คุณสนใจที่จะอธิบายรายละเอียดของสิ่งเหล่านี้หรือไม่?
Billy ONeal

2
คุณชอบเอกสารหลักคำสอนหรือไม่ คุณอ่าน Propel หรือไม่? และใช่ชุมชนหลักคำสอนเป็นสิ่งที่ดี แต่ลองดูที่พื้นที่เก็บข้อมูล ODM, จำนวนมากของ PRs ไม่ได้แสดงความคิดเห็นหรือรวมหรือปฏิเสธ ... ดูที่ระยะเวลาขับเคลื่อน, ชุมชนมีการใช้งานจริง ๆ )
William Durand

3

ฉันแนะนำ Propel ให้คุณเพราะมันผสานรวมรวดเร็วและมีประสิทธิภาพ ในการสร้างรหัสดีกว่าการโหลดคลาสบนรันไทม์จะช่วยลดขั้นตอนการดีบักและแสดงสิ่งที่คุณสร้างขึ้น ดังนั้นขั้นตอนการสร้างจึงไม่ใช่ปัญหา

Doctrine2 ไม่มีพฤติกรรมที่เป็นทางการและรูปแบบการออกแบบ DataMapper นั้นยอดเยี่ยม แต่ใช้งานได้ยากในชีวิตจริง โอ้และ DQL เป็นความเจ็บปวด แต่ยังเลิกใช้ภาษาเพื่อเรียนรู้ ...

ถ้าคุณต้องการคิดกับวัตถุ (ไม่มี DQL / SQL / อะไรก็ตาม) เลือก Propel

Doctrine2 เป็นส่วนหนึ่งของ Symfony2 de facto แต่สิ่งต่างๆจะเคลื่อนไหวเร็ว ๆ นี้ดูที่บทความ Fabien Potencier ล่าสุด

ไชโยวิลเลียม


ฉันเริ่มต้นด้วย Propel 2 ปีที่แล้วกับ symfony1 จากนั้นต้องเปลี่ยนไปใช้ Doctrine2 เพื่อ symfony2 มีความสุขที่ได้กลับไปที่ Propel.Cheers!
Bhanu Krishnan

2

พวกเขาทั้งคู่ดีมาก มีบางกรณีขอบที่หนึ่งสามารถทำอะไรหรือทำสิ่งที่ดีกว่าอีกกรณีหนึ่ง ที่ใดก็ตามที่ฉันเคยประสบปัญหาอย่างใดอย่างหนึ่งก็เนื่องมาจากการขาดความรู้ของฉันมากกว่าสิ่งที่พวกเขาไม่สามารถทำได้

ซึ่งหมายความว่าเอกสารและการสนับสนุนมีความสำคัญมากกว่าความสามารถที่แท้จริงของรหัส คุณรู้จักใครที่สามารถช่วยคุณได้บ้างเมื่อเจอปัญหา คุณเข้ากับเอกสารได้ดีแค่ไหน? หนึ่งในนั้น 'รู้สึก' เป็นธรรมชาติมากขึ้นสำหรับ yoU?


2

ฉันเลือก Propel 1.63 สำหรับแอปพลิเคชั่น mysql รุ่นเก่า (200 โต๊ะขึ้นไป) - ปัจจัยที่รวมอยู่ในนี้: การสนับสนุน IDE ที่ช่วยให้นักพัฒนาใหม่สามารถค้นหาวิธีการได้อย่างง่ายดายด้วยการเติมโค้ดให้สมบูรณ์ การสนับสนุนคีมาฐานข้อมูลข้ามประสิทธิภาพ; สนับสนุนพื้นเมืองที่ดีกว่าสำหรับ enums และการใช้พฤติกรรมหลายอย่าง ที่จริงฉันเริ่มต้นด้วยหลักคำสอนเนื่องจากนี่คือ Symfony2 ที่ได้รับการสนับสนุนที่ดีที่สุด แต่เมื่อ Propel ปรับปรุงการสนับสนุนของพวกเขาด้วย Symfony (แพลตฟอร์มถัดไปที่ฉันจะย้ายไปในที่สุด) ฉันเปลี่ยนไปเนื่องจากการจัดการปัญหาที่ดีกว่า ไม่มีความเสียใจเลย Propel เป็นผู้ชนะที่เด็ดขาด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.