4

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

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

4

6 回答 6

3

是的,您应该放置您自己的类,这些类可能继承 Zend Framework 类,或者将更多类添加到您自己的文件夹中,靠近库中 Zend Framework 文件夹。

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

My_Db_Abstract will map to My/Db/Abstract.php .
于 2008-11-20T15:52:54.513 回答
2

在您的库目录中,您应该在 Zend 库文件夹旁边有您自己的库。无论你怎么称呼它(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 命名约定,以便自动加载器找到它们。
于 2009-09-28T06:25:17.877 回答
1

我刚刚遇到了一些可能与这个问题密切相关的东西。这篇 IBM developerWorks 文章。

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

于 2008-11-20T04:34:31.747 回答
1

我不是 100% 确定您要问什么,但我会尽力提供帮助。如果在任何时候您将“/path/to/zend/framework”的引用添加到您的 php 包含路径中,那么您实质上已经启用了 Zend 框架。如果你这样做,从那里开始:

require_once('Zend/Loader.php');
Zend_Loader::registerAutoload();

然后在您的脚本中的任何一点,您几乎都可以创建新的 Zend Framework 对象,而 Zend_Loader 将处理其余的。

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

于 2008-11-20T10:06:56.570 回答
1

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

于 2008-11-20T13:59:02.263 回答
1

作为一个 ZF 菜鸟,我想我理解 OP 试图弄清楚的一些内容。所以,我只是解释一下我的理解,希望它对 OP 有帮助(或者更有可能对未来的读者有帮助,因为原来的问题太老了,我想 OP 现在是 ZF大师)。

我了解 ZF 声称主要是“随意使用”,因此您无需购买整个结构,例如 Zend_Application、Zend_Bootstrap 类、整个 MVC 方法等。

此外,我了解能够轻松自动加载的类命名和文件位置的约定。例如:class App_Model_User驻留在文件夹中App/Model/User.php

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

  • 完成了将所有请求推送到的 .htaccess 魔术public/index.php
  • 设置您的APPLICATION_PATH并包含路径public/index.php
  • 创建了绑定到配置文件的Application或对象Bootstrap

可能有点不清楚如何最好地利用我们在这种情况下获得的大部分 ZF 优点,并在另一种情况下想要。

我想我对原始问题的回答是通常的入口点序列

http 请求 -> .htaccess -> index.php -> 配置

为我们设置了大部分环境,我们需要为不同的入口路径复制其中的一些。

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

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

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

希望这一切对某人有所帮助。它实际上帮助我把它写下来。谢谢和欢呼!

2009-09-29 更新:刚刚看到这篇文章:从命令行使用 Zend Framework

2009-11-20 更新:另一篇文章:Zend 框架中的 Cron 作业 | GS设计

2010-02-25 更新: 使用 Zend 应用程序的简单命令行脚本 - David Caunt

于 2009-09-28T06:11:33.333 回答