จะใส่ 'ฟังก์ชั่นตัวช่วย' ของเอนทิตีได้ที่ไหน?

ฉันมีปัญหาในการทำความเข้าใจแนวคิดหลักของ Symfony 2

ฉันกำลังทำงานบนเว็บไซต์ที่ผู้ใช้สามารถสร้างเนื้อหาซึ่งสามารถส่งไปยังบุคคลอื่นได้โดยใช้ URL ที่เป็นความลับ บางอย่างเช่น www.yoursite.com/{secret-identifier-string}

ฉันวางแผนที่จะทำเช่นนี้:

  • คงอยู่ในเนื้อหาของผู้ใช้
  • สร้างสตริงตัวระบุที่มีรหัสเนื้อหาและการประทับเวลาการสร้าง (หรือเนื้อหาอื่นใดที่จะไม่มีวันเปลี่ยนแปลงอีก เป็นคุณลักษณะด้านความปลอดภัยเพิ่มเติม) ด้วยวิธีการเข้ารหัสแบบสองทาง (เช่น mcrypt_encrypt)
  • สร้างลิงค์และแสดงให้ผู้ใช้เห็นเพื่อมอบให้
  • เมื่อใดก็ตามที่มีการเรียก url สตริงตัวระบุจะถูกถอดรหัส หากการประทับเวลาที่ระบุตรงกับค่าที่สอดคล้องกันของแถวรหัสเนื้อหา เพจนั้นจะปรากฏขึ้น

คำถามของฉันคือ:

  • คุณคิดว่านี่เป็นขั้นตอนที่ดีโดยทั่วไปหรือไม่ เพราะเหตุใด
  • ภายนอก Symfony2 ฉันจะสร้างวิธีการช่วยเหลือเช่น getIdentifierString() และ getContentPageLink() ฉันจะใส่รหัสที่เกี่ยวข้องใน Symfony2 ได้ที่ไหน มันอยู่ในคลาสเอนทิตีหรือไม่? ถ้าเป็นเช่นนั้นฉันกำลังประสบปัญหาเนื่องจากฉันใช้คลาสบริการสำหรับการเข้ารหัส บริการนี้มีอยู่ในคอนโทรลเลอร์เท่านั้น

ขอบคุณมาก!


person sprain    schedule 24.06.2012    source แหล่งที่มา
comment
ตัวระบุต้องเป็นสตริงที่เข้ารหัสแบบสองทางหรือไม่ ทำไมไม่เพียงแค่สร้างสตริงสุ่มแบบยาว (แฮชเนื้อหาทางเดียว) และจัดเก็บสิ่งนั้นเป็นดัชนี เหตุผล/ข้อดีในการเข้ารหัสและถอดรหัส ID และการประทับเวลาคืออะไร   -  person MDrollette    schedule 24.06.2012
comment
ฉันเห็นข้อดีของการไม่สร้างข้อมูลที่ไม่จำเป็นซึ่งต้องเก็บไว้ในฐานข้อมูล   -  person sprain    schedule 25.06.2012


คำตอบ (2)


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

ดูเหมือนว่าวิธีการของคุณมีการขึ้นต่อกัน (ในการเข้ารหัส) ดังนั้นคุณจึงสามารถสร้างบริการใหม่ที่รับผิดชอบในการสร้างลิงก์ได้ ในตัวสร้างมันต้องใช้ตัวเข้ารหัสและวิธีการจะถูกส่งผ่านเอนทิตีเพื่อสร้างลิงก์/สตริง

ตัวอย่างเช่น บริการของคุณ:

<service id="app_core.linkifier" class="App\CoreBundle\Linkifier">
    <argument type="service" id="the.id.for.encryptor"/>
</service>

และชั้นเรียน:

class Linkifier
{
    private $encryptor;

    public function __construct(Encryptor $encryptor)
    {
        $this->encryptor = $encryptor;
    }

    public function generateContentPageLink(Entity $the_entity)
    {
        return $this->encryptor->encrypt($the_entity);
    }
}
person MDrollette    schedule 24.06.2012

ด้วยความเคารพต่อ DI และการออกแบบที่มุ่งเน้นการบริการ เนมสเปซ และสิ่งดี ๆ ทั้งหมดที่เราได้รับประโยชน์จาก

ฉันยังคงปฏิเสธที่จะพิมพ์หรืออ่าน:

$this->mysyperfancyservice->dowhatevertheseviceissupposedtodowith($the_entity);

เรียบง่ายที่ไหน

do($the_entity);

คือทั้งหมดที่ฉันต้องการใน 150 อินสแตนซ์ทั่วทั้งโปรเจ็กต์ของฉัน โดยที่ do คือสิ่งที่ทุกคนที่ทำงานในโปรเจ็กต์จะรู้

นั่นคือสิ่งที่ผู้ช่วยมีไว้เพื่อ - อ่านง่ายและเรียบง่าย ตราบใดที่มันไม่ขึ้นอยู่กับบริการอื่น ๆ

วิธีแก้ปัญหาของฉันอยู่ในคุณสมบัตินักแต่งเพลงพื้นฐาน: "autoload": { ... "files": [ "src/helper/functions.php" ] }

ฉันใส่ฟังก์ชันที่มีประโยชน์อย่างยิ่งจำนวนจำกัดลงในไฟล์ src/helper/functions.php และเพิ่มลงในโปรเจ็กต์แบบนั้น

เพื่อให้ฟังก์ชันใช้งานได้ทั่วทั้งโปรเจ็กต์ จำเป็นต้องรัน: composer dump-autoload

person tishma    schedule 24.08.2018