【问题标题】:How to include autoload in module in drupal 7如何在drupal 7的模块中包含自动加载
【发布时间】:2017-07-20 20:22:06
【问题描述】:
我想在drupal 的自定义模块中使用aws-sdk 作为php 客户端。我需要在模块中包含vendor/autoload.php。但是当我包含它时,它给了我错误。我尝试了很多方法,但没有成功。我将其添加为:
require __DIR__.'/vendor/autoload.php'; 在.module 文件的顶部。然后网站就崩溃了。请你告诉我应该如何使用require __DIR__.'/vendor/autoload.php';
【问题讨论】:
标签:
php
drupal
drupal-7
composer-php
【解决方案1】:
我不确定 drupal 如何处理外部 php 模块的自动加载。但是,凭借使用 laravel、cakephp 和 composer 等框架的经验,我确信目标文件 index.php 路由到根目录中的多个不同控制器已经包含 vendor/autoload.php。如果不包含,则添加相对于 index.php 或绝对路径指向 autoload.php 的 require 语句。然后在php中使用namespaces,你可以使用外部的php模块,然后自动加载。
require __DIR__.'/vendor/autoload.php'; // Incase vendor directory is in same level as index.php file
require dirname(__DIR__).'/vendor/autoload.php'; // Incase vendor directory is in parent level as index.php file
【解决方案2】:
如果没有实际的错误消息,很难知道。如果出现白屏,则需要启用完整错误的显示 (admin/config/development/logging),这样您就可以看到实际发生的情况,以及您所依赖的类是否一开始就没有包含在内,或者有某种冲突(请记住在更改任何重要内容后清除缓存)。
以下是我在自定义 D7 模块中添加 3rd 方包的方法:
- 生成一个 composer.json 文件,将其安装在
vendor/
- 需要来自
[modulename].module的vendor/autoload.php
详细说明:
-
切换到模块目录
-
运行composer init
-
按照提示(它会询问“您想以交互方式定义您的依赖项” - 选择“是”然后您可以按名称搜索)
-
使用drupal-module 作为类型
-
如果您不希望其他人使用您的代码,您可以使用“专有”获得许可,这是 composer.json 干净地验证 (composer validate)
-
完成后,您应该有一个供应商目录,其中包括一个autoload.php 文件和/composer 目录。从您的 .module 文件中“要求”此内容,例如:
require 'vendor/autoload.php';
您现在应该可以使用您的代码了。
请注意,有一个名为 xautoload 的 Drupal 模块 - (在我看来)这样做有点矫枉过正。
我想知道 [modulename].info 中的 autoload.php 的简单 files[] = 行是否可行 - 无论顺序如何,它都行不通。