Heim  >  Artikel  >  php教程  >  Ausführliche Erläuterung der Anwendungsbeispiele von Zend Framework+smarty

Ausführliche Erläuterung der Anwendungsbeispiele von Zend Framework+smarty

高洛峰
高洛峰Original
2016-12-26 16:01:331110Durchsuche

Die Beispiele in diesem Artikel beschreiben die Verwendung von Zend Framework+smarty. Teilen Sie es wie folgt mit allen als Referenz:

1. Einführung in Zend Framework

Zend Framework verwendet die Model-View-Controller (MVC)-Struktur. Dies wird verwendet, um Ihr Programm in verschiedene Teile zu unterteilen, was die Entwicklung und Wartung erleichtert.

Das Ausführen von Zend Framework erfordert: PHP 5.1.4 (oder höher), der Webserver unterstützt die Funktion mod_rewrite und dieses Beispiel verwendet Apache. Laden Sie Zend Framework hier herunter: http://framework.zend.com/download. Es gibt zwei Formate: .zip oder .tar.gz.

2. Zend Framework-Konfiguration

1. Verzeichnisstruktur

Obwohl Zend Framework nicht auf der Verwendung einer Standardverzeichnisstruktur besteht, gibt es dennoch einige gängige Verzeichnisstrukturen. Bei dieser Verzeichnisstruktur wird davon ausgegangen, dass Sie die vollständige Kontrolle über die Konfiguration von Apache haben. (Im Folgenden wird dieser Computer als Beispiel verwendet. Sie müssen Änderungen entsprechend Ihrer eigenen Situation vornehmen. Das Stammverzeichnis meines Servers verweist auf den Webordner.)

Zitat:

Web/
test /
/webapp
/controllers
/models
/templates
/templates_c
/library
/webroot
/images
/js
/css

Wir haben die Modell-, Ansichts- und Controller-Dateien im Programm in verschiedene Unterverzeichnisse unterteilt. Unterstützte Bilder, Skripte und CSS-Dateien werden in verschiedenen Unterverzeichnissen im Webroot-Verzeichnis gespeichert. Die heruntergeladenen Zend Framework-Dateien werden im Bibliotheksverzeichnis abgelegt. Wenn wir weitere Bibliotheksdateien benötigen, können diese hier abgelegt werden. In diesem Beispiel verwenden wir die Smarty-Vorlagentechnologie, daher sollten wir auch die Smarty-Bibliotheksdateien unter der Bibliotheksdatei ablegen!

2. Startdatei

1) Configuration.htaccess

Wir verwenden eine einzige Eintragsdatei index.php, um auf unser Programm zuzugreifen, das uns den zentralen Punkt des Programms bietet Öffnen Sie alle Seiten und stellen Sie sicher, dass die laufende Umgebung korrekt konfiguriert ist. Um diesen Zweck zu erreichen, verwenden wir .htaccess-Dateien. Fügen Sie die .htaccess-Datei im Stammverzeichnis von test mit dem folgenden Inhalt hinzu:

RewriteEngine on
RewriteRule !".(js|ico|gif|jpg|png|css)$ index.php

2) Konfigurieren Apache
Gleichzeitig müssen wir auch einige Einstellungen für Apache vornehmen und die Apache-Konfigurationsdatei httpd.conf öffnen.

1. Suchen Sie den Satz „#LoadModule rewrite_modules/mod_rewrite.so“ und entfernen Sie das # davor!

2. Suchen Sie dann „AllowOverride None“ und ändern Sie ihn in „AllowOverride All“, starten Sie Apache neu Es.

3. Die Startdatei index.php
index.php wird im Stammverzeichnis von test abgelegt. Das Folgende ist der Inhalt von index.php:

<?php
//打开错误提示
error_reporting(E_ALL|E_STRICT);
//设定时区
date_default_timezone_set(&#39;Asia/Shanghai&#39;);
//指明引用文件的路径
set_include_path(&#39;.&#39; .
PATH_SEPARATOR . &#39;./library/&#39;.
PATH_SEPARATOR . &#39;./webapp/models/&#39;.
PATH_SEPARATOR . get_include_path());
//必须手动加载Loader.php
include "Zend/Loader.php";
//自动加载类,使用时,直接实例化使用
function __autoload($class){
Zend_Loader::loadClass($class);
}
//getInstance()方法用来获取前端控制器实例
$frontController = Zend_Controller_Front::getInstance();
//设定前端路由器的工作目录
$frontController->setControllerDirectory(array("default"=>&#39;./webapp/controllers&#39;));
//抛出异常
$frontController->throwExceptions(true);
//设置基地址,方便以后url的跳转用户,.注意,区分大小写!
$frontController->setBaseUrl(&#39;/test&#39;);
//使用smarty模版需关闭本身的视图助手.
$frontController->setParam(&#39;noViewRenderer&#39;, true);
// 关闭错误提示,发生请求错误时候,转到ErrorController的errorAction控制器
//$frontController->throwExceptions(false);
//对。。进行注册
Zend_Registry::set(&#39;font&#39;, $frontController);
//------------配置Smarty模版 ----------------
include &#39;Smarty/Smarty.class.php&#39;;
/**
* 对smarty模版进行初始化
**/
$views = new Smarty();
//$views->left_delimiter = "{{";
//$views->right_delimiter = "}}";
$views->compile_dir = &#39;./webapp/templates_c&#39;;
$views->cache_dir = &#39;./webapp/templates_c/cache_c&#39;;
$views->template_dir = "./webapp/templates";
function smarty_block_dynamic($param,$content,&$views)
{
return $content;
}
$views->register_block(&#39;dynamic&#39;,&#39;smarty_block_dynamic&#39;,false);
Zend_Registry::set(&#39;views&#39;, $views);
//开始运行程序
$frontController->dispatch();
?>

4) Beschreibung der Startdatei

Zend Framework ist so konzipiert, dass alle Dateien in include_path enthalten sein müssen. Wir fügen auch unser Modellverzeichnis in den Include-Pfad ein, damit wir unsere Modellklassen später problemlos laden können. Zuerst müssen wir Zend/Loader.php einbinden, damit wir Zugriff auf die Zend_Loader-Klasse haben. In der Zend_Loader-Klasse gibt es statische Methoden, die es uns ermöglichen, andere Zend Framework-Klassen zu laden, zum Beispiel:

Zend_Loader::loadClass(&#39;Zend_Controller_Front&#39;);

Zend_Loader::loadClass lädt die benannte Klasse. Dies wird durch die Umwandlung von Unterstrichen in Pfadtrennzeichen und das Hinzufügen des Suffixes .php am Ende implementiert. Auf diese Weise wird die Klasse Zend_Controller_Front aus Zend/Controller/font.php geladen. Wenn Sie dieselbe Namenskonvention in Ihrer Klassenbibliothek verwenden, können Sie Zend_Loader::loadCass() verwenden, um sie zu laden. Wir müssen die Controller-Klasse und die Routing-Klasse laden.

Der Front-Controller verwendet Routing-Klassen, um die angeforderte URL der richtigen PHP-Funktion zuzuordnen und zeigt dann die Seite an. Damit das Routing funktioniert, muss es auflösen, welcher Teil der URL der Pfad zu index.php ist, damit es nach diesem Punkt nach dem URL-Element suchen kann.

Wir müssen den Frontend-Router konfigurieren, damit er weiß, in welchem ​​Verzeichnis er nach unseren Controllern suchen muss.

$frontController = Zend_Controller_Front::getInstance();
$frontController->setControllerDirectory(&#39;./application/controllers&#39;);

Die Einstellung löst eine Ausnahme aus, aber nachdem der Server tatsächlich funktioniert, sollten wir dem Benutzer keine Fehlermeldungen anzeigen.

 
$frontController->throwExceptions(true);

Weil wir in diesem Beispiel die Smarty-Vorlagentechnologie verwenden. Wir schließen also die Sichtweise, die ZF selbst mit sich bringt. $frontController->setParam('noViewRenderer', true); Legen Sie die Basisadresse fest, um das Festlegen der URL für den späteren Sprung zu erleichtern. $frontController->setBaseUrl('/test');Zend_Registry::set('font', $frontController);Als nächstes richten wir Smarty ein. Zuerst haben wir in der Klassenbibliothek auf die Klasse Smarty.class.php verwiesen. Und sein Weg ist so festgelegt, dass die Regierung seinen Standort kennt. :

include &#39;Smarty/Smarty.class.php&#39;;
/**
* 对smarty模版进行初始化
**/
$views = new Smarty();
//$views->left_delimiter = "{{";
//$views->right_delimiter = "}}";
$views->compile_dir = &#39;./webapp/templates_c&#39;;
$views->cache_dir = &#39;./webapp/templates_c/cache_c&#39;;
$views->template_dir = "./webapp/templates";
function smarty_block_dynamic($param,$content,&$views)
{
return $content;
}
$views->register_block(&#39;dynamic&#39;,&#39;smarty_block_dynamic&#39;,false);

Hier verwenden wir die Objektregistrierung (Registry) von ZF, um $view zu speichern, sodass wir an jedem Punkt im Programm miteinander kommunizieren können Alle rufen es auf, um Operationen auszuführen. Zend_Registry::set('views', $views); Führen Sie nach dem Festlegen das Programm aus. $frontController->dispatch();

Zu diesem Zeitpunkt, wenn Sie zum Testen http://127.0.0.1/test ausführen. Sie werden einen Fehler ähnlich dem Schwerwiegenden Fehler: Nicht abgefangene Ausnahme 'Zend_Controller_Dispatcher_Exception' mit der Meldung 'Ungültiger Controller angegeben (Index)' in ... finden. Dies liegt daran, dass wir unser Programm noch nicht eingerichtet haben.

3. Setup-Programm

在设置文件以前,理解Zend Framework 如何组织页面很重要。每个应用程序的页面叫做 action ,许多 action 组成控制器。例如,对于这样一个格式的 URL http://localhost/test/news/view/id/1 来说,控制器是news, action 是view,后面的id和1,分别是往这个actionView传递的参数和值。

Zend Framework 控制器把 index 作为一个缺省的action 而保留为特别的action。这样,对于http://localhost/test/news/ 这样的url,在news控制器里的 index action将被执行。Zend Framework 也保留了一个缺省的控制器,也叫做index。这样,http://localhost/test/ 将执行 index控制器下的 action index。

4、设置控制器

现在可以设置控制器了。在Zend Framework 里,控制器是一个必需被叫做{Controller name}Controller 的类。注意{Controller name}必需以大写字母开头。并且,这个类必须在叫做{Controller name}Controller.php这样的文件中,这个文件还必需在特定的控制器目录中。强调一下,{Controller name}必需以大写字母开头并其他字母一定是小写。每个action是在控制器类里的public 函数,名字必需是{action name}Action。在这里,{action name}应该以小写字母开头。这样在文件 test/webapp/controllers/IndexController.php 里我们的控制器类叫做 IndexController,位置:test/webapp/controllers/IndexController.php:

<?php
class IndexController extends Zend_Controller_Action
{
function init()
{
}
function indexAction()
{
}
function addAction()
{
}
}
?>

   

我们现在有三个我们想使用的action,直到我们设置好视图,它们才工作。其中function init是个特殊的函数,简单的说,它就是在controller中的构造函数时调用的函数。

每个action的 URL 如下:

http://localhost/test/ in IndexController::indexAction() 
http://localhost/test/index/add in IndexController::addAction()

现在,我们在程序里有个能工作的路由器和每个页面的 action。

5、设置视图

因为本实例使用的的是Smarty模版,所以和ZF本身的View视图在实现过程中,稍微有点区别!下面我直接介绍在ZF里是任何使用Smarty的。在使用Smarty之前,我们应该先取出在index.php里定义的$view,并且定义好,需要在模版显示的变量。:

class IndexController extends Zend_Controller_Action
{
var $views; /*模板对象*/
var $data; /*传递模版变量的对象*/
function init()
{
//拿回注册过的对象
$this->views = Zend_Registry::get(&#39;views&#39;);
}
function indexAction()
{
//定义模版显示的变量
$data[`title′]=〞hello world〞;
//传递变量到模版
$this->views->assign($data);
//显示模版
$this->views->display(&#39;index/index.tpl&#39;);
}
function addAction()
{
}
}

   

下面我们开始做视图文件,它们的位置是test/webapp/templates/index/index.tpl:

代码:

{$title}

   

这个时候,输入http://127.0.0.1/test看看。应该会出现“hello world 了。

这样,一个简单的实例就完成了。下面我们结合Xmlrpc技术来实现一个稍微复杂一点的实例!

三、XMLRPC

1、什么是XMLRPC

XMLRPC,顾名思义,就是应用了XML技术的RPC。那么什么是XML和RPC了?

RPC是Remote Procedure Call的缩写,翻译成中文就是远程过程调用,是一种在本地的机器上调用远端机器上的一个过程(方法)的技术,这个过程也被大家称为“分布式计算 ,是为了提高各个分立机器的“互操作性 而发明出来的技术。

XML和RPC一样也是一个东西的缩写,这个东西就是eXtensible Markup Language,中文意思就是可扩展标记语言,标记语言就是那种用尖括号(a8093152e673feb7aba1828c43532094)括来括去的那种语言,比如说HTML。XML的可扩展性也体现在它只定义了语言的格式,而并没有定义过多的关键字,也就是通常所说的标记(Tag),所以用户可以自由地选择定义标记。它的这种自由和简单的语法规则也使得它广为流传,用来表示各种数据。

2、在ZF中使用XMLRPC

1)创建IndexController.php

下面我们来完成一个实例,为了方便起见,就不建立新的Controller,把刚才我们建立的IndexController修改一下,就能使用了!另外我们还需要建立一个XMLRPC的服务端程序。位置在WEB服务器的根目录上(在本机中,也就是在test文件的上级目录中,取名为1.php),由于XMLRPC使用到了类库,我们还需要下载libphpxmlrpc放在library文件夹下!

文件位置:test/webapp/controller/IndexController.php:

class IndexController extends Zend_Controller_Action
{
var $views; /*模板对象*/
var $data; /*传递模版变量的对象*/
public function init()
{
//拿回注册过的对象
$this->views = Zend_Registry::get(&#39;views&#39;);
$this->font = Zend_Registry::get(&#39;font&#39;);
//得到基地址
$this->baseurl=$this->font->getBaseUrl();
}
function indexAction()
{
@include "libphpxmlrpc/xmlrpc.inc";
@include "libphpxmlrpc/xmlrpcs.inc";
if (isset($_POST[&#39;var1&#39;]) && isset($_POST[&#39;var2&#39;]))
{
//创建客户端
$client = new xmlrpc_client(&#39;http://127.0.0.1/1.php&#39;);
//创建一个实例
@ $msg = new xmlrpcmsg("add", array(
new xmlrpcval($_POST[&#39;var1&#39;], "int"),
new xmlrpcval($_POST[&#39;var2&#39;], "int")));
//发送信息,
$response=$client->send($xmlrpc_message);,服务器返回xmlrpcresp的一个实例
$retval = $client->send($msg);
if ($retval->faultCode())
{
print_r("发生一个错误: ");
print_r("原因: " . htmlspecialchars($retval->faultString()));
}
else
{
//$retval->value()获取应答的xmlrpcval(也就是服务器端返回的结果),
$retval->value()->scalarval();得到描述应答结果的PHP变量
$sum = $retval->value()->scalarval();
}
}
@$data[&#39;var1&#39;]=$_POST[&#39;var1&#39;];
@$data[&#39;var2&#39;]=$_POST[&#39;var2&#39;];
@$data[&#39;sum&#39;]=$sum;
@$data[`action′]= "$this->baseurl/index/";
//构造完整的url给模版
$time=date("Y-m-d H:i:s")
@$data[&#39;url&#39;]="$this->baseurl/index/add/id/$sum/time/$time";
/传递变量到模版
$this->views->assign($data);
//显示模版
$this->views->display(&#39;index/index.tpl&#39;);
}
function addAction()
{
$data[&#39;title&#39;]="实验一下";
//得到传递的值
$id=$this->_request->getParam("id");
$time=$this->_request->getParam("time");
$data[&#39;id&#39;]="$id";
$data[&#39;time&#39;]="$time";
$this->views->assign($data);
$this->views->display(&#39;index/add.tpl&#39;);
}
}

   

2)创建显示模版文件

位置:test/webapp/templates/index/index.tpl:

hello,下面演示的是利用Xmlrpc调用远程服务器方法的实例!并且我们把得到的结果传递到另外的一个函数中去!

代码:

{if $sum}
点一下看看!
{/if}

   

位置: test/webapp/templates/index/add.tpl:

现在是{$time}
{$title}你刚才传递的是 {$id}

   

3)创建XMLRPC服务器端程序

位置:web/1.php:

<?php
@include ("libphpxmlrpc/xmlrpc.inc");
@include ("libphpxmlrpc/xmlrpcs.inc");
if ($_SERVER[&#39;REQUEST_METHOD&#39;] != &#39;POST&#39;)
{
exit(0);
}
$add_sig = array(array($xmlrpcString, $xmlrpcInt, $xmlrpcInt));
$add_doc = "Add the two integer together";
function add($params)
{
//引入用户错误代码值
global $xmlrpcerruser;
//返回一个PHP数组
$val = php_xmlrpc_decode($params);
$ret = $val[0] + $val[1];
return new xmlrpcresp(new xmlrpcval($ret, "int"));
}
//创建一个xmlrpc_server的实例:
$server = new xmlrpc_server(array(
"add" => array(
"function" => "add",
"signature" => $add_sig,
"docstring" => $add_doc
)));
?>

   

OK,现在打开http;//127.0.0.1/test/看看。刚才建立的那个XMLRPC应该已经建立起来了,输入数字,测试一下吧!

希望本文所述对大家基于zend framework框架的PHP程序设计有所帮助。

Weitere Anwendungsbeispiele für Zend Framework+smarty und verwandte Artikel finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
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