【问题标题】:Loading base packages in xPDO在 xPDO 中加载基础包
【发布时间】:2014-01-14 09:42:43
【问题描述】:

我曾经花了一个多小时对xPDO 构造函数进行逆向工程,以弄清楚如何在实例化时加载基础包。

不幸的是,我丢失了那段小sn-p 代码!我只剩下这个了。

$this->database = new xPDO(
    "mysql:host=" . $this->config->item('hostname', XPDO) . 
    ";dbname="  . $this->config->item('database', XPDO), 
    $this->config->item('username', XPDO), 
    $this->config->item('password', XPDO), 
    $this->config->item('dbprefix', XPDO)
);

// This is line I would like to pass to the constructor.
$this->database->addPackage('packageName', $this->config->item('core_path') . "components/package/model/", '_packagePrefix');

我在documentation 的任何地方都找不到这个。

编辑 使用 xPDO,您必须专门添加默认情况下未加载的包。默认情况下,xPDO 不会在实例化时加载任何包。

不过,我确实曾经花费了相当多的时间,解构xPDO的构造函数,发现有一个可选参数可以让你定义一个将在实例化时加载的包数组。

我的问题是我不记得该怎么做。

【问题讨论】:

  • 您能否将其表述为一个问题,并提供更多关于您所追求的内容的详细信息。

标签: php xpdo


【解决方案1】:

您可以加载基础包,将正确的选项传递给 xPDO 构造函数。这是构造函数定义:

$xpdo= new xPDO($dsn, $username= '', $password= '', $options= array(), $driverOptions= null) 

options 数组支持许多不同的配置,您正在寻找的是 xPDO::OPT_BASE_PACKAGES:

xPDO::OPT_BASE_PACKAGES — 以逗号分隔的包字符串 实例化时要加载的名称/路径(用冒号分隔)。

基本上,您可以通过这种方式修改代码:

$this->database = new xPDO(
    "mysql:host=" . $this->config->item('hostname', XPDO) . 
    ";dbname="  . $this->config->item('database', XPDO), 
    $this->config->item('username', XPDO), 
    $this->config->item('password', XPDO), 
    array(xPDO::OPT_BASE_PACKAGES => "package1:path1;prefix, package2:path2, ...")
);

这里是文档的链接,您可以在其中找到有关选项数组的更多详细信息:http://rtfm.modx.com/xpdo/2.x/getting-started/fundamentals/xpdo,-the-class/the-xpdo-constructor

编辑

字符串的格式如下:

"package_name:absolute_path;prefix"

前缀是可选的。我已经用这个格式字符串更新了上面的代码。

【讨论】:

  • 这是我不确定的字符串的格式。因为它被拆分以创建addPackage 的参数。我将不得不再次查看构造函数。我认为它类似于'package_name;package_path;package_prefix'
  • @IanBrindley 我已经用正确的格式字符串更新了我的答案。
  • 顺便问一下@IanBrindley,您能否将答案标记为已接受以供将来参考?或者,如果它需要一些修改,请告诉我应该添加什么或进行您认为必要的任何编辑。谢谢!
【解决方案2】:

虽然我不完全确定您要的是什么,但我怀疑您在问是否有一些已知的方法可以为具有相同路径的包传递一组包名。 假设这是正确的,我有以下可能的解决方案(如果不是,请按照scragar 的要求澄清您的要求):

查看了类 xPDO 中的文件 xpdo.class.php 和方法 addPackage() 我看到它专门验证包名称是一个字符串,如果不是,则会产生错误。 因此,addPackage() 这个方法当然不允许将数组传递给它。

但是,我怀疑您可能还记得,如果您在包含多个 xPDO 类 & 映射文件 & 架构的包/额外目录上使用 addPackage()... 表示的所有数据库表都将能够被实例化并用于执行 CRUD 操作。

例如,我有两个包(来自单独的附加组件),它们具有以下路径 core/components/[packageName]/ (括号中的内容是特定包的实际名称)。 此外,模型文件位于 core/components/[packageName]/model/[packageName]/ 以及子目录 /mysql。 在这两种情况下,当我添加包 [packageName] 时,所有类都可以实例化,因为我没有包含/需要任何文件,所以 addPackage() 似乎包含它们,因此使它们可用作 xPDO 对象使用 modx 方法 newQuery()

(所以在代码中:

$modx->newQuery(nameOfxPDOClassToBeInstantiated);

)

(注意:我的两个包的所有必要类都是使用 Bob Ray here 提供的非常方便的工具从自定义数据库表生成的,并由他在简单的教程 here 中进行了解释)。

希望对您有所帮助。

作为事后的想法,这是关于 addPackage 的 xPDO 文档: http://rtfm.modx.com/xpdo/2.x/class-reference/xpdo/xpdo.addpackage 这是有关使用对象的文档... http://rtfm.modx.com/xpdo/2.x/getting-started/using-your-xpdo-model/retrieving-objects

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 2015-05-28
    • 2019-05-14
    • 1970-01-01
    相关资源
    最近更新 更多