(drupal8)在自定义的模块里面创建自定义的twig模板

原文链接:

https://www.drupal.org/docs/8/theming/twig/create-custom-twig-templates-from-custom-module

译文:

drupal8开发的总体思路是,你应该尽量避免在自定义的模块PHP代码里面直接写html代码,而是创建twig模板。通过下面的几个步骤,在你自己的模块里面创建twig模板。 第一步:在.module文件里面定义hook_theme 如果你的模块目录不存在[module].module文件的话,则创建[module].module文件,并且添加定义你所需要的所有的twig模板的代码,数组的每个item的key表示你待会要调用的模板的名称。

function test_twig_theme($existing, $type, $theme, $path) {
  return array(
     'test_twig' => array(
            'variables' => array('test_var' => NULL)
    )
  );
}

参考hook_theme()的文档获取更多信息

第二步:调用模板

在返回render数组的地方(在模块的router yml文件里面定义的控制器方法 )调用twig模板。下面是一个testing module的实例代码,这部分代码已经在这个模块的route yml里面被定义调用了。

/**
 * @file
 * Contains \Drupal\test_twig\Controller\TestTwigController.
 */
 namespace Drupal\test_twig\Controller; 
use Drupal\Core\Controller\ControllerBase; 
class TestTwigController extends ControllerBase {
  public function content() { 
    return array(
          '#theme' => 'test_twig',      
          '#test_var' => $this->t('Test Value'),
    );
  }
}

记住这只是一个基本的实现,并没有缓存任何的数据。你可以在 Render API Overview文档里面获取更多的资料关于怎样添加缓存。

第三步:创建twig模板 在你的module 目录的templates文件夹里面创建twig模板,文件的名字必须跟你在hook_theme里面定义的一样,并且把用破折号代替下划线。在我们的这个例子里面,这个文件名应该是 test-twig.html.twig。下面是测试的文件:

<p>Test twig template!</p>
 <p>test_var: {{ test_var }}</p>

这样设计的优美在于,如果你的theme里面不存在你定义的twig模板,那么你在module里面定义的twig模板将会被调用。你可以把模块里面的twig模板移到你的theme\templates目录下面,然后清除缓存,那么theme里面的模板将会被调用。你可以把twig模板放到theme的任意嵌套子目录下面使项目更有组织。