Как интегрировать шаблонизатор twig в архитектуру PHP MVC без фреймворка

Я работаю над проектом, который основан на архитектуре MVC (без использования какой-либо структуры) и сейчас работает нормально, но проблема в том, как интегрировать механизм шаблонов twig php. Я публикую структуру макета своего проекта и код, который я использую для загрузки шаблона и рендеринга представления. Пожалуйста, изучите и предложите мне правильное решение для интеграции ветки в архитектуру php mvc,

Структура проекта

  • Проект1

    • app
      • controllers
        • welcome_controllers.php
      • модели
      • views
        • welcome
          • index.html.twig
        • templates
          • layout.html.twig
    • config
    • libraries
      • Twig(twig files resides here)
      • router.php базовый класс контроллера

    class Controller {

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

    }

Класс WelcomeController

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>

Теперь я определил шаблон layout.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'));

Надеюсь это поможет!

РЕДАКТИРОВАТЬ:

Файловая система загрузчика twig загружает каждый шаблон на одном уровне внутри определенных вами каталогов (не уверен, загружает ли он файлы рекурсивно или только те, которые находятся в корне каталога, вы можете попробовать это). Это означает, что вам не нужно определять путь при рендеринге, расширении или включении других шаблонов веточек. Шаблоны просто загружаются и существуют на одном уровне. Попробуйте следующее:

Загрузчик файловой системы:

$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