0

我一直在 localhost 上测试 Twig ...这里的代码与这个问题相同,但查询不同:

     <?php
// include and register Twig auto-loader
include 'Twig/Autoloader.php';
Twig_Autoloader::register();

// attempt a connection
try {
  $dbh = new PDO('mysql:dbname=world;host=localhost', 'root', 'mypass');
} catch (PDOException $e) {
  echo "Error: Could not connect. " . $e->getMessage();
}

// set error mode
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// attempt some queries
try {
  // execute SELECT query
  // store each row as an object
  $sql = "SELECT manufacturer, model, modelinfo FROM automobiles WHERE id = '4' ";
  $sth = $dbh->query($sql);
  while ($row = $sth->fetchObject()) {
    $data[] = $row;
  }

  // close connection, clean up
  unset($dbh); 

  // define template directory location
  $loader = new Twig_Loader_Filesystem('templates');

  // initialize Twig environment
  $twig = new Twig_Environment($loader);

  // load template
  $template = $twig->loadTemplate('cars.html');

  // set template variables
  // render template
  echo $template->render(array (
    'data' => $data
  ));

} catch (Exception $e) {
  die ('ERROR: ' . $e->getMessage());
}
?>

我有 3 条记录;我决定查询一条不存在的记录,看看 Twig 的错误处理是什么样的,因为我正在比较 Twig 和 Smarty - 出于兴趣,并且是为了一个项目。出现此错误消息:

Notice: Undefined variable: data in /Applications/MAMP/htdocs/mysite/twigtesting.php on line 42

肯定会出现“未找到数据”的通知,还是我在这里错了?未定义的变量数据是指:

      // set template variables
  // render template
  echo $template->render(array (
    'data' => $data
  ));

为什么会这样?我是 Twig 的新手,并且使用他们网站上的最新版本,这很重要。

4

1 回答 1

3

您不会收到 Twig 错误,因为该错误不存在于模板中,而是存在于生成这些模板的代码中。

PHP 在将值$data放入数组时遇到问题,因为该变量不存在。

如果您想查看 twig 如何处理错误,您需要访问模板中不存在的变量。例如,放入{{ notExisting }}您当前的模板。


我已经可以说 Twig 通过在 PHP 中抛出解析异常来处理错误。Twig 抛出的所有异常都在扩展Twig_Error。要捕获这些,请使用try { ... } catch (\Twig_Error $e) { ... }块。

此外,Twig 可以抛出 3 种不同类型的异常:

  • Twig_Error_Syntax当解析模板时发生错误(例如使用格式错误的标签)时抛出。
  • Twig_Error_Loader当 Twig 无法加载文件时抛出。render()使用方法或使用 Twig 中的某些文件功能(例如{% extends ... %})时,可能会发生这种情况。
  • Twig_Error_RunTime当运行时发生错误时抛出(例如扩展内的错误)。
于 2013-02-26T22:57:30.667 回答