Inhaltsverzeichnis
{#$title#}
Heim Backend-Entwicklung PHP-Tutorial yii,CI,yaf框架+smarty模板使用方法_PHP

yii,CI,yaf框架+smarty模板使用方法_PHP

May 28, 2016 am 11:49 AM
ci smarty yaf yii 框架 模板

本文实例讲述了yii,CI,yaf框架+smarty模板使用方法。分享给大家供大家参考,具体如下:

最近折腾了框架的性能测试,其中需要测试各个模板跟smarty配合的性能,所以折腾了一桶,现总结一下。之前已经写过kohana框架+smarty模板,这里不再重复了。

一、yii框架+smarty模板

yii是覆盖了viewRenderer组件。

1.1,下载yii框架并解压,下载smarty框架并解压,将smarty/libs文件夹拷到yii框架application/protected/vendors下面,并重命名smarty。

1.2,yii配置文件main.php

'components'=>array(
 'viewRenderer' => array(
  'class'=>'batman.protected.extensions.SmartyViewRender',
  // 这里为Smarty支持的属性
  'config' => array (
    'left_delimiter' => "{#",
    'right_delimiter' => "#}",
    'template_dir' => APP_DIR . "/views/",
    'config_dir' => APP_DIR . "/views/conf/",
    'debugging' => false,
    'compile_dir' => 'D:/temp/runtime',
  )
)

Nach dem Login kopieren

其中batman是我已经在index.php定义好的别名。

Yii::setPathOfAlias('batman', dirname(__FILE__));
Yii::import("batman.protected.vendors.*");
define('APP_DIR', dirname(__FILE__).'/protected/');

Nach dem Login kopieren

1.3,在protected/extensions/下面新建SmartyViewRender.php

<&#63;php
class SmartyViewRender extends CApplicationComponent implements IViewRenderer {
 public $fileExtension = '.html';
 private $_smarty = null;
 public $config = array();
 public function init() {
  $smartyPath = Yii::getPathOfAlias('batman.protected.vendors.smarty');
  Yii::$classMap['Smarty'] = $smartyPath . '/Smarty.class.php';
  Yii::$classMap['Smarty_Internal_Data'] = $smartyPath . '/sysplugins/smarty_internal_data.php';
  $this->_smarty = new Smarty();
  // configure smarty
  if (is_array ( $this->config )) {
   foreach ( $this->config as $key => $value ) {
    if ($key {0} != '_') { // not setting semi-private properties
     $this->_smarty->$key = $value;
    }
   }
  }
  Yii::registerAutoloader('smartyAutoload');
 }
 public function renderFile($context, $file, $data, $return) {
   foreach ($data as $key => $value)
    $this->_smarty->assign($key, $value);
  $return = $this->_smarty->fetch($file);
  if ($return)
    return $return;
  else
    echo $return;
 }
}

Nach dem Login kopieren

1.4,验证

新建一个HelloController.php

<&#63;php
class HelloController extends Controller {
 public function actionWorld() {
  $this->render('world', array('content'=>'hello world'));
 }
}

Nach dem Login kopieren

新建一个word.html

<body>
{#$content#}
</body>

Nach dem Login kopieren

二、CI框架+smarty模板

网上很多方法,将smarty作为一个普通的library,在使用的时候,controller代码类似于下面:

public function index()
{
  $this->load->library('smarty/Ci_smarty', '', 'smarty');
  $this->smarty->assign("title","恭喜你smarty安装成功!");
  $this->smarty->assign("body","欢迎使用smarty模板引擎");
  $arr = array(1=>'zhang',2=>'xing',3=>'wang');
  $this->smarty->assign("myarray",$arr);
  $this->smarty->display('index_2.html');
}

Nach dem Login kopieren

这种方法跟CI自带的使用模板的方法

代码如下:

$this->load->view();


不和谐,而且要一系列的

代码如下:

$this->smarty->assign();


语句,麻烦不说,还破坏了原本CI的简洁美,所以果断唾弃之。

那怎么保持CI加载view时的简洁美呢,答案就是覆盖Loader类的view()方法。好吧,let's begin。

2.1,条件:

到官网上现在CI框架和smarty模板。

2.2,确保CI已经能跑起来

将CI框架解压到网站跟目录下,先写一个不带smarty模板的controller输出“hello world”。

2.3,引入smarty

将smarty解压,将libs文件夹考到application/third_paty下面,并将libs重命名smarty,重命名取什么都ok了,这里就叫smarty吧。

2.4,覆盖loader类的view()方法

因为view()方法在Loader类里,所以我要覆盖Loader的view()方法。

先看看$this->load->view()是怎么工作的?CI_Controller类的构造函数里有这么一行

代码如下:

$this->load =& load_class('Loader', 'core');


load_class函数会先在application/core下面找config_item('subclass_prefix').Loader.php文件,找不到再到system/core下面找Loader.php。config_item('subclass_prefix')就是在配置文件里写的你要继承CI核心类的子类的前缀。我使用的是默认值'MY_'。找到文件后,require该文件,然后new MY_Loader(如果application/core/MY_Loader.php存在),或者是new Loader,赋值给$this->load。

在application/core下面新建一个MY_Loader.php文件

<&#63;php
define('DS', DIRECTORY_SEPARATOR);
class MY_Loader extends CI_Loader {
 public $smarty;
 public function __construct() {
  parent::__construct();
  require APPPATH.'third_party'.DS.'smarty'.DS.'smarty.class.php';
  $this->smarty = new Smarty ();
  // smarty 配置
  $this->smarty->template_dir= APPPATH.'views'.DS;//smarty模板文件指向ci的views文件夹
  $this->smarty->compile_dir = 'd:/temp/tpl_c/';
  $this->smarty->config_dir = APPPATH.'libraries/smarty/configs/';
  $this->smarty->cache_dir  = 'd:/temp/cache';
  $this->smarty->left_delimiter = '{#';
  $this->smarty->right_delimiter = '#}';
 }
 public function view($view, $vars = array(), $return = FALSE)
 {
  // check if view file exists
  $view .= config_item('templates_ext');
  $file = APPPATH.'views'.DS.$view;
  if (! file_exists ( $file ) || realpath ( $file ) === false) {
   exit( __FILE__.' '.__LINE__."<br/>View file {$file} does not exist, <br/>{$file} => {$view}");
  }
  // changed by simeng in order to use smarty debug
  foreach ( $vars as $key => $value ) {
   $this->smarty->assign ( $key, $value );
  }
  // render or return
  if ($return) {
   ob_start ();
  }
  $this->smarty->display ( $view );
  if ($return) {
   $res = ob_get_contents ();
   ob_end_clean ();
   return $res;
  }
 }
}

Nach dem Login kopieren

我把template_ext配置成了".html",这样就ok了。我们来验证一下吧。

2.5,验证

在controller下面建一个home.php

class Home extends CI_Controller {
 public function index() {
  $data['todo_list'] = array('Clean House', 'Call Mom', 'Run Errands');
  $data['title'] = "恭喜你smarty安装成功!";
  $data['body'] = "欢迎使用smarty模板引";
  $arr = array(1=>'zhang',2=>'xing',3=>'wang');
  $data['myarray'] = $arr;
  $this->load->view('index_2', $data);
 }
}

Nach dem Login kopieren

在views下面建一个index_2.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <script src='<!--{$base_url}-->js/jquery.min.js' type='text/javascript' ></script>
 <link href="<!--{$base_url}-->css/login.css" rel="stylesheet" type="text/css" />
 <title>smarty安装测试</title>
</head>
<body>
<h1 id="title">{#$title#}</h1>
<p>{#$body#}</p>
<ul>
  {#foreach from=$myarray item=v#}
  <li>{#$v#}</li>
  {#/foreach#}
</ul>
</body>
</html>

Nach dem Login kopieren

好了,可以试试你的成果了。

三、yaf框架+smarty模板

yaf是利用引导文件Bootstrap.php来加载smarty。

3.1,使用Bootstrap

在index.php中用

代码如下:

$app->bootstrap()->run();

引入Bootstrap.php文件

3.2,在application/Bootstrap.php文件中导入smarty。

<&#63;php
class Bootstrap extends Yaf_Bootstrap_Abstract {
 public function _initSmarty(Yaf_Dispatcher $dispatcher) {
  $smarty = new Smarty_Adapter(null, Yaf_Application::app()->getConfig()->smarty);
  Yaf_Dispatcher::getInstance()->setView($smarty);
 }
}

Nach dem Login kopieren

3.3,添加Smarty_Adapter类

将smarty解压后放到application/library文件夹下,重命名为Smarty。在Smarty下新建Adapter.php,确保Smarty.class.php在Smarty/libs/下。Adapter.php内容:

<&#63;php
Yaf_Loader::import( "Smarty/libs/Smarty.class.php");
Yaf_Loader::import( "Smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php");
Yaf_Loader::import( "Smarty/libs/sysplugins/smarty_internal_templatelexer.php");
Yaf_Loader::import( "Smarty/libs/sysplugins/smarty_internal_templateparser.php");
Yaf_Loader::import( "Smarty/libs/sysplugins/smarty_internal_compilebase.php");
Yaf_Loader::import( "Smarty/libs/sysplugins/smarty_internal_write_file.php");
class Smarty_Adapter implements Yaf_View_Interface
{
 /**
  * Smarty object
  * @var Smarty
  */
 public $_smarty;
 /**
  * Constructor
  *
  * @param string $tmplPath
  * @param array $extraParams
  * @return void
  */
 public function __construct($tmplPath = null, $extraParams = array()) {
  $this->_smarty = new Smarty;
  if (null !== $tmplPath) {
   $this->setScriptPath($tmplPath);
  }
  foreach ($extraParams as $key => $value) {
   $this->_smarty->$key = $value;
  }
 }
 /**
  * Return the template engine object
  *
  * @return Smarty
  */
 public function getEngine() {
  return $this->_smarty;
 }
 /**
  * Set the path to the templates
  *
  * @param string $path The directory to set as the path.
  * @return void
  */
 public function setScriptPath($path)
 {
  if (is_readable($path)) {
   $this->_smarty->template_dir = $path;
   return;
  }
  throw new Exception('Invalid path provided');
 }
 /**
  * Retrieve the current template directory
  *
  * @return string
  */
 public function getScriptPath()
 {
  return $this->_smarty->template_dir;
 }
 /**
  * Alias for setScriptPath
  *
  * @param string $path
  * @param string $prefix Unused
  * @return void
  */
 public function setBasePath($path, $prefix = 'Zend_View')
 {
  return $this->setScriptPath($path);
 }
 /**
  * Alias for setScriptPath
  *
  * @param string $path
  * @param string $prefix Unused
  * @return void
  */
 public function addBasePath($path, $prefix = 'Zend_View')
 {
  return $this->setScriptPath($path);
 }
 /**
  * Assign a variable to the template
  *
  * @param string $key The variable name.
  * @param mixed $val The variable value.
  * @return void
  */
 public function __set($key, $val)
 {
  $this->_smarty->assign($key, $val);
 }
 /**
  * Allows testing with empty() and isset() to work
  *
  * @param string $key
  * @return boolean
  */
 public function __isset($key)
 {
  return (null !== $this->_smarty->get_template_vars($key));
 }
 /**
  * Allows unset() on object properties to work
  *
  * @param string $key
  * @return void
  */
 public function __unset($key)
 {
  $this->_smarty->clear_assign($key);
 }
 /**
  * Assign variables to the template
  *
  * Allows setting a specific key to the specified value, OR passing
  * an array of key => value pairs to set en masse.
  *
  * @see __set()
  * @param string|array $spec The assignment strategy to use (key or
  * array of key => value pairs)
  * @param mixed $value (Optional) If assigning a named variable,
  * use this as the value.
  * @return void
  */
 public function assign($spec, $value = null) {
  if (is_array($spec)) {
   $this->_smarty->assign($spec);
   return;
  }
  $this->_smarty->assign($spec, $value);
 }
 /**
  * Clear all assigned variables
  *
  * Clears all variables assigned to Zend_View either via
  * {@link assign()} or property overloading
  * ({@link __get()}/{@link __set()}).
  *
  * @return void
  */
 public function clearVars() {
  $this->_smarty->clear_all_assign();
 }
 /**
  * Processes a template and returns the output.
  *
  * @param string $name The template to process.
  * @return string The output.
  */
 public function render($name, $value = NULL) {
  return $this->_smarty->fetch($name);
 }
 public function display($name, $value = NULL) {
  echo $this->_smarty->fetch($name);
 }
}

Nach dem Login kopieren

3.4,smarty配置文件。

再来看看我们的conf/application.ini文件

[common]
application.directory = APP_PATH "/application"
application.dispatcher.catchException = TRUE
application.view.ext="tpl"
[smarty : common]
;configures for smarty
smarty.left_delimiter = "{#"
smarty.right_delimiter = "#}"
smarty.template_dir  = APP_PATH "/application/views/"
smarty.compile_dir  = '/data1/www/cache/'
smarty.cache_dir  = '/data1/www/cache/'
[product : smarty]

Nach dem Login kopieren

3.5,验证

新建一个controller,添加方法:

public function twoAction() {
  $this->getView()->assign('content', 'hello World');
}

Nach dem Login kopieren

新建一个模板two.tpl

<html>
<head>
<title>A Smarty Adapter Example</title>
</head>
<body>
{#$content#}
</body>
</html>

Nach dem Login kopieren

希望本文所述对大家PHP程序设计有所帮助。

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat -Befehle und wie man sie benutzt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So bewerten Sie die Kosteneffizienz der kommerziellen Unterstützung für Java-Frameworks So bewerten Sie die Kosteneffizienz der kommerziellen Unterstützung für Java-Frameworks Jun 05, 2024 pm 05:25 PM

Die Bewertung des Kosten-/Leistungsverhältnisses des kommerziellen Supports für ein Java-Framework umfasst die folgenden Schritte: Bestimmen Sie das erforderliche Maß an Sicherheit und Service-Level-Agreement-Garantien (SLA). Die Erfahrung und das Fachwissen des Forschungsunterstützungsteams. Erwägen Sie zusätzliche Services wie Upgrades, Fehlerbehebung und Leistungsoptimierung. Wägen Sie die Kosten für die Geschäftsunterstützung gegen Risikominderung und Effizienzsteigerung ab.

Wie ist die Lernkurve von PHP-Frameworks im Vergleich zu anderen Sprach-Frameworks? Wie ist die Lernkurve von PHP-Frameworks im Vergleich zu anderen Sprach-Frameworks? Jun 06, 2024 pm 12:41 PM

Die Lernkurve eines PHP-Frameworks hängt von Sprachkenntnissen, Framework-Komplexität, Dokumentationsqualität und Community-Unterstützung ab. Die Lernkurve von PHP-Frameworks ist im Vergleich zu Python-Frameworks höher und im Vergleich zu Ruby-Frameworks niedriger. Im Vergleich zu Java-Frameworks haben PHP-Frameworks eine moderate Lernkurve, aber eine kürzere Einstiegszeit.

Wie wirken sich die Lightweight-Optionen von PHP-Frameworks auf die Anwendungsleistung aus? Wie wirken sich die Lightweight-Optionen von PHP-Frameworks auf die Anwendungsleistung aus? Jun 06, 2024 am 10:53 AM

Das leichte PHP-Framework verbessert die Anwendungsleistung durch geringe Größe und geringen Ressourcenverbrauch. Zu seinen Merkmalen gehören: geringe Größe, schneller Start, geringer Speicherverbrauch, verbesserte Reaktionsgeschwindigkeit und Durchsatz sowie reduzierter Ressourcenverbrauch. Praktischer Fall: SlimFramework erstellt eine REST-API, nur 500 KB, hohe Reaktionsfähigkeit und hoher Durchsatz

Was sind die häufigsten Anwendungen von C++-Vorlagen in der tatsächlichen Entwicklung? Was sind die häufigsten Anwendungen von C++-Vorlagen in der tatsächlichen Entwicklung? Jun 05, 2024 pm 05:09 PM

C++-Vorlagen werden in der tatsächlichen Entwicklung häufig verwendet, einschließlich Containerklassenvorlagen, Algorithmusvorlagen, generischen Funktionsvorlagen und Metaprogrammierungsvorlagen. Beispielsweise kann ein generischer Sortieralgorithmus Arrays verschiedener Datentypen sortieren.

So wählen Sie das beste Golang-Framework für verschiedene Anwendungsszenarien aus So wählen Sie das beste Golang-Framework für verschiedene Anwendungsszenarien aus Jun 05, 2024 pm 04:05 PM

Wählen Sie das beste Go-Framework basierend auf Anwendungsszenarien aus: Berücksichtigen Sie Anwendungstyp, Sprachfunktionen, Leistungsanforderungen und Ökosystem. Gängige Go-Frameworks: Gin (Webanwendung), Echo (Webdienst), Fiber (hoher Durchsatz), gorm (ORM), fasthttp (Geschwindigkeit). Praktischer Fall: Erstellen einer REST-API (Fiber) und Interaktion mit der Datenbank (gorm). Wählen Sie ein Framework: Wählen Sie fasthttp für die Schlüsselleistung, Gin/Echo für flexible Webanwendungen und gorm für die Datenbankinteraktion.

Detaillierte praktische Erklärung der Golang-Framework-Entwicklung: Fragen und Antworten Detaillierte praktische Erklärung der Golang-Framework-Entwicklung: Fragen und Antworten Jun 06, 2024 am 10:57 AM

Bei der Go-Framework-Entwicklung treten häufige Herausforderungen und deren Lösungen auf: Fehlerbehandlung: Verwenden Sie das Fehlerpaket für die Verwaltung und Middleware zur zentralen Fehlerbehandlung. Authentifizierung und Autorisierung: Integrieren Sie Bibliotheken von Drittanbietern und erstellen Sie benutzerdefinierte Middleware zur Überprüfung von Anmeldeinformationen. Parallelitätsverarbeitung: Verwenden Sie Goroutinen, Mutexe und Kanäle, um den Ressourcenzugriff zu steuern. Unit-Tests: Verwenden Sie Gotest-Pakete, Mocks und Stubs zur Isolierung sowie Code-Coverage-Tools, um die Angemessenheit sicherzustellen. Bereitstellung und Überwachung: Verwenden Sie Docker-Container, um Bereitstellungen zu verpacken, Datensicherungen einzurichten und Leistung und Fehler mit Protokollierungs- und Überwachungstools zu verfolgen.

Was sind die häufigsten Missverständnisse im Lernprozess des Golang-Frameworks? Was sind die häufigsten Missverständnisse im Lernprozess des Golang-Frameworks? Jun 05, 2024 pm 09:59 PM

Beim Go-Framework-Lernen gibt es fünf Missverständnisse: übermäßiges Vertrauen in das Framework und eingeschränkte Flexibilität. Wenn Sie die Framework-Konventionen nicht befolgen, wird es schwierig, den Code zu warten. Die Verwendung veralteter Bibliotheken kann zu Sicherheits- und Kompatibilitätsproblemen führen. Die übermäßige Verwendung von Paketen verschleiert die Codestruktur. Das Ignorieren der Fehlerbehandlung führt zu unerwartetem Verhalten und Abstürzen.

Leistungsvergleich des Golang-Frameworks: Metriken für kluge Entscheidungen Leistungsvergleich des Golang-Frameworks: Metriken für kluge Entscheidungen Jun 05, 2024 pm 10:02 PM

Zu den wichtigsten Leistungsindikatoren (KPIs) bei der Auswahl eines Go-Frameworks gehören: Antwortzeit, Durchsatz, Parallelität und Ressourcennutzung. Durch Benchmarking und Vergleich der KPIs der Frameworks können Entwickler fundierte Entscheidungen auf der Grundlage der Anwendungsanforderungen treffen und dabei die erwartete Auslastung, leistungskritische Abschnitte und Ressourcenbeschränkungen berücksichtigen.

See all articles