Php 将外部脚本与Zend框架集成

Php 将外部脚本与Zend框架集成,php,zend-framework,Php,Zend Framework,将外部脚本集成到Zend框架中的最佳方式是什么?让我解释一下,因为我可能问错了。我有一个脚本可以下载和解析XML文件。此脚本作为日常cron作业运行,需要将其数据转储到数据库中 我正在为使用此脚本的站点使用Zend Framework,在我看来,最好使用我的Zend_Db_Abstract子类模型来添加和更新数据库。一个人如何着手做这件事?我的脚本是否放在Zend组件(即library/Mine/Xmlparse.php)旁边的库中,从而可以访问各种ZF组件?我是否只需要在文件本身中包含正确的模

将外部脚本集成到Zend框架中的最佳方式是什么?让我解释一下,因为我可能问错了。我有一个脚本可以下载和解析XML文件。此脚本作为日常cron作业运行,需要将其数据转储到数据库中


我正在为使用此脚本的站点使用Zend Framework,在我看来,最好使用我的
Zend_Db_Abstract
子类模型来添加和更新数据库。一个人如何着手做这件事?我的脚本是否放在Zend组件(即library/Mine/Xmlparse.php)旁边的库中,从而可以访问各种ZF组件?我是否只需要在文件本身中包含正确的模型文件和Zend DB组件?处理这种集成的最佳方法是什么?

我刚刚遇到了一些可能与这个问题密切相关的东西


作者建议只需在ZF层次结构中创建一个scripts文件夹,并像通常在ZF中一样使用它(尽管他设置了ini路径并调用autoload)。有那么简单吗?仅仅是在框架的层次结构中,包括路径和自动加载程序,就可以让脚本访问所有的好东西吗

我不是100%确定你想问什么,但我会尽力帮助你。如果在任何时候向php include路径中添加对“/path/to/zend/framework”的引用,那么本质上启用了zend框架。从那里开始,如果您这样做:

require_once('Zend/Loader.php');
Zend_Loader::registerAutoload();
然后,在脚本中的任何时候,您都可以创建新的Zend Framework对象,Zend_Loader将处理其余部分


但是,Zend框架的一个重要特点是不强迫您以某种方式做事。这就是为什么有时有几种方法来完成同一件事。因此,如果您觉得需要让您的脚本使用Zend框架只是为了这样做,那么这并不是真正必要的。但是,如果你认为它可以在某种程度上改进你的脚本,那就去做吧。

我通常把我认为可以跨项目使用的自定义内容放在库中的自定义文件夹中。因此,我有一个library/Ak33m文件夹,其中包含可能在框架之外的脚本。

是的,您应该将自己的类放在library中Zend framework文件夹旁边的文件夹中,这些类可能继承Zend framework类,或者将更多的类添加到自己的文件夹中

启用Zend_Loader的自动加载后,类名将自动映射到您创建的类,例如:

My_Db_Abstract will map to My/Db/Abstract.php .

作为ZF noob的一员,我想我理解OP想要弄明白的一些事情。所以,我只想解释一下我的理解,希望它对OP有帮助(或者更可能对未来的读者有帮助,因为最初的问题太老了,我想OP现在是ZF大师)

我知道ZF声称在很大程度上是“随意使用”,因此您无需购买整个结构,如Zend_应用程序、Zend_引导类、整个MVC方法等

此外,我了解支持轻松自动加载的类命名和文件位置的约定。例如:
class-App\u-Model\u-User
位于文件夹
App/Model/User.php

我认为可能令人困惑的是,在脚本上下文中,您还没有

  • 完成了将所有请求推送到
    public/index.php
  • 设置
    应用程序的路径
    并将路径包含在
    public/index.php
  • 创建了绑定到配置文件的
    应用程序
    引导
    对象
我们可能有点不清楚如何最好地利用我们在那个环境中得到的ZF优势,以及我们在另一个环境中想要的优势

我想我对原始问题的答案是

http请求->.htaccess->index.php->config

为我们设置了很多环境,我们需要为不同的入口路径复制一些环境

因此,对于您的脚本,我的第一反应是创建一个通用的include文件,该文件反映index.php中发生的大部分内容-设置include路径、应用程序路径、实例化和调用引导,然后执行特定于脚本的处理

更好的是,可能需要为所有脚本创建一个单一的入口点,就像我们在http/web上下文中所做的那样。为了自己的脚本目的扩展Zend_应用程序,以便
$Application->run()不再启动MVC路由器控制器调度处理,而是启动您自己的东西。这样,这个单一脚本入口点看起来与web入口点几乎相同,唯一的区别是实例化了哪个应用程序对象。然后将所需应用程序类的名称作为命令行参数传递给脚本

但在这里,我承认自己不够自信,只是抛出了一些想法

希望这一切能帮助别人。它实际上帮助我把这一切写下来。谢谢,干杯

更新2009-09-29:刚刚看到这篇文章:

更新2009-11-20:和另一篇文章:


更新2010-02-25:

在您的库目录中,Zend library文件夹旁边应该有您自己的库。无论您如何称呼它(Mylib、Project等等),您都应该将其包含到Zend Autoloader中,具体操作如下:

require_once 'Zend/Loader/Autoloader.php';
$loader = Zend_Loader_Autoloader::getInstance();
$loader->registerNamespace('Project_');
$loader->setFallbackAutoloader(true);
if ($configSection == 'development')
{
    $loader->suppressNotFoundWarnings(false);
}
为了使您的库与ZF和Autoloader很好地集成,您应该遵守ZF命名约定。这意味着两件事:

  • 如果扩展现有的ZF类,请复制ZF文件夹结构,以便文件除库名称外具有相同的路径和名称。例如/library/Zend/Db/Abstract.php=>/library/Project/Db/Abstract.php
  • 如果您编写自己的类,仍然要遵循ZF命名约定,以便自动加载程序找到它们。