วิธีรวมเอ็นจิ้นเทมเพลตทวิกเข้ากับสถาปัตยกรรม PHP MVC โดยไม่มีเฟรมเวิร์ก

ฉันกำลังทำงานในโปรเจ็กต์ที่ใช้สถาปัตยกรรม MVC (ไม่ได้ใช้เฟรมเวิร์กใดๆ เลย) และทำงานได้ดีในขณะนี้ แต่ปัญหาคือจะรวมเอ็นจิ้นเทมเพลตทวิก php ได้อย่างไร ฉันกำลังโพสต์โครงสร้างเลย์เอาต์ของโปรเจ็กต์ของฉันและโค้ดที่ฉันใช้ในการโหลดเทมเพลตและเรนเดอร์มุมมอง โปรดพิจารณาและแนะนำโซลูชันที่เหมาะสมให้ฉันเพื่อรวมทวิกเข้ากับสถาปัตยกรรม php mvc

โครงสร้างโครงการ

  • โครงการ1

    • app
      • controllers
        • welcome_controllers.php
      • โมเดล
      • views
        • welcome
          • index.html.twig
        • templates
          • layout.html.twig
    • กำหนดค่า
    • libraries
      • Twig(twig files resides here)
      • router.php คลาสพื้นฐานของคอนโทรลเลอร์

    ตัวควบคุมคลาส {

    var $twig = null;
    
    public function loadTwig() {
        Twig_Autoloader::register();
        $loader = new Twig_Loader_Filesystem(
            array (APP_PATH.'/views/')
        );
        // set up environment
        $params = array(
            'cache' => BASE_PATH.'/cache', 
            'auto_reload' => true, // disable cache
            'autoescape' => true
        );
        $this->twig = new Twig_Environment($loader, $params);
    }
    

    }

ยินดีต้อนรับคลาสคอนโทรลเลอร์

class WelcomeController extends AppController{

    public function index(){
        $this->loadTwig();
        $this->twig->render('welcome/index.html.twig');
    }
}

ไฟล์index.html.twig

{% extends '../templates/layout.html.twig' %}

{% block title %}
    Index Page Title
{% endblock %}

ไฟล์layout.html.twig

<html>
    <head>
        <title>{% block title %}{% endblock %} - My Webpage</title>
    </head>
    <body>
       base template text
    </body>
</html>

ตอนนี้ ฉันได้กำหนด templatelayout.html.php ในโฟลเดอร์ views/templates แล้ว และฉันต้องการสืบทอดหน้ามุมมองทั้งหมดสำหรับคอนโทรลเลอร์จากโฟลเดอร์นั้น โปรดมีคนช่วยฉันหากใช้สิ่งนี้มาก่อนหรือมีความคิดเกี่ยวกับเรื่องนี้


person Community    schedule 29.06.2015    source แหล่งที่มา
comment
การดูใน MVC ไม่ใช่แค่ไฟล์เทมเพลตที่โง่เขลา สร้างคลาสหรือฟังก์ชันที่คุณสามารถเรียกได้จากคอนโทรลเลอร์ของคุณ ซึ่งจะตั้งค่า Twig และเรนเดอร์ไฟล์เทมเพลต คลาส/ฟังก์ชัน/ชุดของคลาสนั้นเป็นมุมมองของคุณ นั่นทำให้สิ่งต่าง ๆ ชัดเจนขึ้นหรือไม่? คุณมีปัญหาอะไรกับการบูรณาการอย่างแน่นอน?   -  person deceze♦    schedule 29.06.2015


คำตอบ (2)


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

ฉันสร้างเฟรมเวิร์ก MVC ของตัวเองโดยพยายามคัดลอกฟังก์ชันการทำงานที่ดีที่สุดของ Symfony2 ฉันทำโดยใช้ผู้ขายรายเดียวกันบางราย รวมถึง Twig ด้วย

ฉันติดตั้ง Twig ผ่าน Composer ซึ่งจะสร้างตัวโหลดอัตโนมัติโดยอัตโนมัติ วิธีที่ฉันรวม Twig คือการสร้างเมธอด loadTwig ภายใน __construct ของคอนโทรลเลอร์หลักของฉัน:

public function loadTwig() {
    $loader = new Twig_Loader_Filesystem(
        array (
            "../html/views",
            "../html/widgets"
        )
    );
    // set up environment
    $params = array(
        'cache' => "../cache", 
        'auto_reload' => true, // disable cache
        'autoescape' => true
    );
    $this->twig = new Twig_Environment($loader, $params);
    // ...
}

จากนั้น ทุกครั้งที่ฉันต้องแสดงเทมเพลตที่อยู่ในโฟลเดอร์ "views" หรือ "widgets" ฉันแค่เรียก:

 $this->twig->display('myview.html.twig', array('foo' => 'bar'));

หวังว่านี่จะช่วยได้!

แก้ไข:

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

ตัวโหลดระบบไฟล์:

$loader = new Twig_Loader_Filesystem(
    // array (APP_PATH.'/views/') you may try if this work, but:
    array (
        APP_PATH.'views/templates',
        APP_PATH.'views/welcome'
        APP_PATH.'views/foo'
        APP_PATH.'views/bar'
    )
);

การเรนเดอร์ (ใช้จอแสดงผลแทนการเรนเดอร์):

$this->twig->display('index.welcome.html.twig', array('foo' => 'bar')); // if you have more than one index.html.twig, rename your templates :)

แม่แบบ:

{% extends 'layout.html.twig' %}

{% block title %}
    Index Page Title
{% endblock %}
person viarnes    schedule 29.06.2015
comment
ฉันได้อัปเดตคำถามของฉันเพื่อให้ชัดเจนยิ่งขึ้น ฉันได้ลองใช้รหัสของคุณแล้ว แต่ฉันได้รับข้อผิดพลาดว่า Uncaught ข้อยกเว้น 'Twig_Error_Loader' พร้อมข้อความ 'ดูเหมือนว่าคุณพยายามโหลดเทมเพลตนอกไดเรกทอรีที่กำหนดค่าไว้' - person ; 30.06.2015
comment
สมบูรณ์แบบ. ก่อนอื่นขอขอบคุณสำหรับการสนับสนุนของคุณ แต่ตอนนี้ปัญหาอยู่ที่ระบบไฟล์ ฉันต้องเพิ่มไดเร็กทอรีมุมมองทั้งหมดลงในระบบไฟล์ตามที่คุณพูดถึง มีวิธีใดที่จะทำให้มันเป็นอัตโนมัติหรือไม่ ถ้าฉันสร้างคอนโทรลเลอร์นับร้อยตัว มุมมองจะมีโฟลเดอร์นับร้อยให้กับคอนโทรลเลอร์ที่เกี่ยวข้อง และการเพิ่มโฟลเดอร์มุมมองของคอนโทรลเลอร์ทุกตัวลงในระบบไฟล์คงจะน่าเบื่อ - person ; 30.06.2015
comment
แล้วการโหลดระบบไฟล์แบบไดนามิกสำหรับคอนโทรลเลอร์แต่ละตัวล่ะ? บางอย่างเช่น $loader = new Twig_Loader_Filesystem(array(APP_PATH . '/templates/' . $MyController)); - person viarnes; 30.06.2015
comment
ฉันได้ทำทุกอย่างที่ฉันขอจนถึงตอนนี้ ฉันมีคำถามอื่นที่นี่ ถ้าฉันตั้งค่าและรับวิธีเวทย์มนตร์ด้วยคอนโทรลเลอร์แล้วฉันจะสามารถเข้าถึงตัวแปรเหล่านั้นที่ฉันตั้งค่าไว้ในการทำงานของคอนโทรลเลอร์ได้อย่างไร - person ; 01.07.2015

หากคุณเพียงต้องการใช้ Twig เพื่อเรนเดอร์ข้อมูลไปยังเทมเพลตของคุณ ให้ดูแลการส่ง $twig var ไปยัง ___construct ของแต่ละคลาสอ็อบเจ็กต์ที่คุณสร้างอินสแตนซ์ จากนั้นตรวจสอบว่าส่งผ่านได้ตามปกติก่อนที่จะเรนเดอร์

การควบคุม

$objEmployee = new Employee($objConexion->conectar(), $twig);

ชั้นเรียน

function __construct($l,$q,$t){

    $this->link     = $l;
    $this->query    = $q;
    $this->twig     = $t;
}

ตรวจสอบทวิกในชั้นเรียน

if (isset($this->twig)){

    all print view and render stuff;

}

จากนั้นคุณสามารถใช้เทมเพลตของคุณกับคลาส PHP ทุกคลาสที่สร้างอินสแตนซ์ด้วย Twig เป็นพารามิเตอร์ได้อย่างง่ายดาย

หวังว่านี่จะช่วยได้

person Debz    schedule 19.06.2018