Bagaimana mengintegrasikan mesin template ranting ke dalam arsitektur PHP MVC tanpa kerangka kerja

Saya sedang mengerjakan proyek yang didasarkan pada arsitektur MVC (tidak menggunakan kerangka apa pun) dan berfungsi dengan baik saat ini, tetapi masalahnya adalah bagaimana mengintegrasikan mesin templat ranting php. Saya memposting struktur tata letak proyek saya dan kode yang saya gunakan untuk memuat template dan merender tampilan. Silakan lihat dan sarankan saya solusi yang tepat untuk mengintegrasikan ranting ke dalam arsitektur php mvc,

Struktur proyek

  • Proyek1

    • app
      • controllers
        • welcome_controllers.php
      • model
      • views
        • welcome
          • index.html.twig
        • templates
          • layout.html.twig
    • konfigurasi
    • libraries
      • Twig(twig files resides here)
      • router.php Kelas dasar pengontrol

    Pengontrol kelas {

    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);
    }
    

    }

Kelas WelcomeController

class WelcomeController extends AppController{

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

file indeks.html.ranting

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

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

file layout.html.ranting

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

Sekarang, saya telah mendefinisikan template layout.html.php di folder views/templates dan saya ingin mewarisi semua halaman tampilan untuk pengontrol darinya. Tolong seseorang bantu saya jika menerapkan hal ini sebelumnya atau punya ide tentang ini.


person Community    schedule 29.06.2015    source sumber
comment
Tampilan di MVC bukan hanya file template yang bodoh. Buat kelas atau fungsi yang dapat Anda panggil dari pengontrol Anda yang akan menyiapkan Twig dan merender file templat. Kelas/fungsi/kumpulan kelas itu adalah pandangan Anda. Apakah itu memperjelas semuanya? Masalah apa sebenarnya yang Anda hadapi dengan integrasi?   -  person deceze♦    schedule 29.06.2015


Jawaban (2)


Tidak yakin Jika ini yang Anda tanyakan, pertanyaan Anda agak membingungkan, tapi mungkin menceritakan pengalaman saya sendiri akan membantu.

Saya membuat kerangka MVC saya sendiri mencoba menyalin beberapa fungsi terbaik dari Symfony2. Saya melakukannya dengan menggunakan beberapa vendor yang sama, termasuk Twig.

Saya menginstal Twig melalui Composer yang secara otomatis menghasilkan autoloader. Cara saya mengintegrasikan Twig adalah dengan membuat metode loadTwig di dalam __construct pengontrol utama saya:

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);
    // ...
}

Kemudian, setiap kali saya perlu merender template yang terletak di dalam folder "views" atau "widgets", saya cukup memanggil:

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

Semoga ini membantu!

EDIT:

Sistem file pemuat ranting memuat setiap templat pada tingkat yang sama di dalam direktori yang Anda tetapkan (tidak yakin apakah itu memuat file secara rekursif atau hanya yang ada di root direktori, Anda dapat mencobanya). Ini berarti Anda tidak perlu menentukan jalur saat merender, memperluas, atau menyertakan templat ranting lainnya. Templat hanya dimuat dan ada pada tingkat yang sama. Coba yang berikut ini:

Pemuat Sistem File:

$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'
    )
);

Rendering (gunakan tampilan alih-alih render):

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

Templat:

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

{% block title %}
    Index Page Title
{% endblock %}
person viarnes    schedule 29.06.2015
comment
Saya telah memperbarui pertanyaan saya agar lebih jelas. Saya juga telah mencoba kode Anda tetapi saya mendapatkan kesalahan bahwa pengecualian tidak tertangkap 'Twig_Error_Loader' dengan pesan 'Sepertinya Anda mencoba memuat templat di luar direktori yang dikonfigurasi. - person ; 30.06.2015
comment
Sempurna. pertama-tama terima kasih atas dukungan Anda. tapi sekarang masalahnya adalah sistem file. Saya harus menambahkan semua direktori tampilan ke dalam sistem file seperti yang Anda sebutkan. Apakah ada cara untuk mengotomatiskannya, jika saya membuat ratusan pengontrol maka tampilan akan berisi ratusan folder ke pengontrol yang sesuai dan menambahkan setiap folder tampilan pengontrol ke dalam sistem file akan membosankan. - person ; 30.06.2015
comment
Bagaimana dengan memuat sistem file secara dinamis untuk setiap pengontrol? Sesuatu seperti $loader = new Twig_Loader_Filesystem(array(APP_PATH . '/templates/' . $MyController)); - person viarnes; 30.06.2015
comment
Saya telah melakukan apa pun yang saya minta sampai sekarang. Saya hanya punya pertanyaan lain di sini. jika saya telah mengatur dan mendapatkan metode ajaib dengan pengontrol lalu bagaimana saya bisa mendapatkan akses ke variabel-variabel yang telah saya atur dalam tindakan pengontrol. - person ; 01.07.2015

Jika Anda hanya ingin menggunakan data Twig to Render ke templat Anda, berhati-hatilah dalam meneruskan $twig var ke ___construct dari setiap kelas objek yang Anda buat dan kemudian validasi bahwa itu lolos dengan baik sebelum dirender.

kontrol

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

kelas

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

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

validasi ranting di kelas

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

    all print view and render stuff;

}

Kemudian Anda dapat dengan mudah menggunakan templat Anda di setiap kelas PHP yang dibuat dengan Twig sebagai parameter.

Semoga ini membantu.

person Debz    schedule 19.06.2018