โฟลเดอร์ย่อยและวิธีการเรียน namespace


11

ใน Drupal 7 ฉันสามารถมีโมดูลในโมดูลอื่นได้ นี่เป็นกรณีใน Drupal 8 และฉันจะกำหนดชื่อคลาสในโมดูลย่อยได้อย่างไร

อีกสิ่งหนึ่งที่ฉันสามารถทำได้ใน Drupal 7 คือการสร้างโฟลเดอร์ย่อยภายในโฟลเดอร์โมดูลเพื่อจัดกลุ่มโมดูลของฉัน

ตัวอย่าง:

sites
--- / all
--- / --- / modules
--- / --- / --- / Collection_Alpha
--- / --- / --- / --- / module_a
--- / - - / --- / --- / module_b
--- / --- / --- / Collection_Beta
--- / --- / --- / --- / module_x
--- / --- / --- / --- / module_y

ยังคงเป็นไปได้ใน Drupal 8 หรือไม่? ถ้าใช่ฉันจะกำหนดชื่อคลาสของฉันอย่างไรเพื่อให้โปรแกรมโหลดอัตโนมัติสามารถแก้ไขโครงสร้างโฟลเดอร์ที่ถูกต้องได้?

เช่น: Drupal \ Collection_Alpha \ module_a \ myClass1?


2
ฉันค่อนข้างแน่ใจว่าความละเอียดของเนมสเปซจะถูกลงทะเบียนเป็น "/ path / to / module / src" ดังนั้นคุณไม่จำเป็นต้องทำอะไรที่แตกต่างสำหรับโมดูล 'sub' เช่นโมดูลหลักจะอยู่Drupal\my_moduleใน 'my_module / src' โมดูลย่อยจะอยู่Drupal\my_submoduleใน 'my_module / modules / my_submodule / src' และอื่น ๆ
Clive

ขอบคุณไคลฟ์ที่เหมาะสม! แล้วโฟลเดอร์ย่อยล่ะ? มีความคิดใดบ้างถ้าสิ่งนี้ยังคงได้รับการสนับสนุนและมีลักษณะอย่างไรกับการโหลดคลาสอัตโนมัติ?
dustinmoris

คำตอบ:


7

@Clive ถูกต้อง

namespace ที่เป็นเสมอ Drupal\{module_name}ในกรณีที่โมดูลนั้นมีความเกี่ยวข้อง (ตราบใดที่มันอยู่ที่ไหนซักแห่งที่ Drupal สามารถหาได้) เนมสเปซนั้นชี้ไปที่$path_to_module/srcเสมอ

มันจะไม่ทำงานในวิธีอื่นใด ไซต์ที่ต่างกันมีโมดูลในโครงสร้างที่แตกต่างกันและสถานที่ต่างกัน แต่รหัสเดียวกันต้องทำงานไม่ว่าที่ไหน


ขอบคุณไคลฟ์และเบอร์เดียร์! ฉันเดาว่าฉันมีคำถามติดตามอีกหนึ่งคำถาม: เป็นไปได้หรือไม่ที่จะลงทะเบียนเนมสเปซเพิ่มเติมซึ่งชี้ไปยังโฟลเดอร์โมดูลด้วย เช่น: DrupalModules \ {module_name} เพื่อชี้ไปที่ $ path_to_module / src? ฉันขอให้เข้าใจการออกแบบชั้นเรียนของเราในวันนี้ให้ดีขึ้นเพื่อให้มีแรงเสียดทานเพียงเล็กน้อยเมื่อย้ายไปที่ D8 ในหนึ่งวัน
dustinmoris

1
ถ้าคลาสนั้นเป็นแบบเฉพาะของ Drupal (เช่นคุณไม่ได้เขียนไลบรารีแบบสแตนด์อโลน) มันจะเป็นการดีกว่าถ้าจะให้พวกมันอยู่ภายใต้\Drupalเพื่อความมั่นคง แต่คำถามที่น่าสนใจอย่างไรก็ตามฉันขอแนะนำให้คุณถามเป็นคำถามแยกต่างหาก ในความเป็นจริงถ้าคุณทำไม่ได้ผมอาจจะ :)
ไคลฟ์

1
คุณอาจทำได้ใช่เห็น system_register () และ drupal_classloader_register () ผู้ช่วยเหล่านั้นทำหน้าที่ฮาร์ดโค้ด "Drupal \" แต่คุณสามารถรับบริการ class_loader ได้โดยตรง แต่อย่างที่ @Clive กล่าวว่าฉันไม่แนะนำให้ทำอย่างนั้นจริง ๆ แล้วไม่มีเหตุผลที่จะทำเช่นนั้นเว้นแต่ว่าคุณจะมีห้องสมุดภายนอกอยู่ด้วย
Berdir

Coolio นั่นดูสมเหตุสมผล! ขอบคุณเพื่อน! @Clive: ตามที่คุณแนะนำฉันสร้างdrupal.stackexchange.com/questions/142309//
dustinmoris

คุณสามารถตรวจสอบโมดูล mongodb แล้วเพื่อดูโครงสร้าง

6

Namespace ที่อยู่บนพื้นฐานของ PSR-4 AUTOLOAD ตรวจสอบสเปคhttp://www.php-fig.org/psr/psr-4

หากคุณต้องการโมดูลย่อยคุณสามารถใช้โครงสร้างโฟลเดอร์ถัดไป D8:

/modules
   my_module/
     src/
      Controller/
        A.php
     modules/
       my_sub_module/
         src/
          Controller/
            B.php

namespace สำหรับ "my_module":

Drupal\my_module\Controller\A

เนมสเปซสำหรับ "my_sub_module":

Drupal\my_sub_module\Controller\B

ดูเนมสเปซ PSR-4 และการโหลดอัตโนมัติใน Drupal 8สำหรับข้อมูลเพิ่มเติม


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