如何在 CakePHP 3x 中导入供应商文件

Posted

技术标签:

【中文标题】如何在 CakePHP 3x 中导入供应商文件【英文标题】:How to import vendor files in CakePHP 3x 【发布时间】:2014-12-21 04:15:51 【问题描述】:

我正在使用最近推出的 Cakephp 3(beta 2) 版本。我需要使用 PHP SDK 集成 Facebook 登录,我不清楚在这个版本中导入供应商文件。 在 CakePHP 2x 中,我使用过

App::import('Vendor', 'Facebook', array('file' => 'Facebook' . DS . 'src'. DS. 'facebook.php'));

所以我需要在 CakePHP 3x 中重现相同的内容(我没有使用 composer)。 有这方面的参考吗?

【问题讨论】:

加我的两分钱。理想情况下,应使用 Composer 自动加载供应商文件,如果您有无法使用 Composer 自动加载或安装的供应商文件,则需要使用 require 来加载它们。因此,应该接受 @Ayman-b 的答案,因为它适用于 CakePHP-3.0。 如果可能的话,使用 Composer 会更好。对于您自己和其他需要使所有依赖项保持最新的开发人员来说,生活将会变得更加轻松。 【参考方案1】:

如果不能选择作曲家,您将不得不自己加载它。您始终可以使用非常基本的 require 方法并自己创建供应商类的新实例。参考:http://book.cakephp.org/3.0/en/core-libraries/app.html#loading-vendor-files

用途:

 //The following line should do the same like App::import() in the older version of cakePHP
 require_once(ROOT . 'vendor' . DS  . 'Facebook' . DS . 'src' . DS . 'facebook.php');

 $facebookApi = new facebook();

【讨论】:

我更喜欢你的评论,它提供了更多的上下文信息:) Lool :) 同意...已将其添加到答案中 APP 给出 cakephp3 的 src 文件夹的路径。并且“供应商”不再是“src”文件夹的子文件夹。因此 require_once 将无法在您的代码中使用。 你是对的@Dashrath 我刚刚编辑了我的答案并将其替换为 ROOT 我可以使用这个 require_once(ROOT . 'vendor/Facebook/src/facebook.php'); ?【参考方案2】:

在 cakephp3 中,要添加新的供应商库,您可以按照以下步骤操作:

    将库文件夹放在your_project/vendor/ 下 使用require_once(ROOT . DS . 'vendor' . DS . "my_library_folder" . DS . "my_library_base_class.php")包含库文件 ,这包括我们代码中的库代码文件。 在控制器顶部包含类名,例如:

namespace App\Controller; use MyLibraryBaseClass; ,

这会在我们的命名空间中导入要使用的库代码文件。

    创建加载类的对象

    $my_obj= new MyLibraryBaseClass();

【讨论】:

如果这仍然不适合您,请尝试添加反斜杠,例如。 $my_obj= new \MyLibraryBaseClass();. 它显示了 2 个错误:1 /PHP 注意:使用未定义的常量 ROOT - 在第 6 行的 C:\xampp\htdocs\ProjectX\webroot\classX.php 中假定为“ROOT”。 2/注意:使用未定义的常量 DS - 在第 6 行的 C:\xampp\htdocs\ProjectX\webroot\classX.php 中假定为“DS” 这应该是答案!【参考方案3】:

在我自己尝试之后,Ayman B. 提供的答案看起来不像问题中预期的那样工作,原因如下:

cakephp3 中的vendor 文件夹不在APP 命名空间下的src 文件夹中,它被移动到ROOT 文件夹,这样做你将无法按预期加载你的Facebook 类,你自己试试看结果... 如果您的供应商库不遵循 PSR-0 规则的以下规则,则通过加载供应商文件不会自动加载类名本身: \VENDOR\PACKAGE\TEST.CLASS.PHP 和 test.class.php 中没有必须在脚本中调用或导入的类定义,并在此脚本的开头使用定义的命名空间关键字,如下所示:命名空间 那么上面的代码就不行了

要纠正答案,您必须执行以下几个步骤:

1 - 在 bootstrap.php 中定义一个新的 cakephp 常量,如下所示: 定义('供应商',根。DS。'供应商'.DS);由于在 cakephp 3.x 中删除了 VENDOR constante,您可以自己定义它 2 - 之后,您必须在供应商常量中指定供应商名称、包名称和类名称,例如: define('_',; 然后你可以做 $facebookApi = new \\();

这将按问题中的预期为您工作

如果您有问题请联系我,我将向您展示此处所述的使用示例...

【讨论】:

【参考方案4】:

我在使用 CakePHP 3.0 时也遇到了同样的问题。

使用 Composer 按照说明进行安装。

然后您必须使用use 语句将插件正确加载到控制器中。像这样:

使用 Ghunti\HighchartsPHP\Highchart;

如果您在大多数页面中使用插件,而不是在每个控制器中加载,您可以在 bootstrap.php 文件中添加相同的行,就在其他使用语句的下方。

这样就解决了使用插件的问题。

【讨论】:

【参考方案5】:

从 CakePhp 3.x 开始,推荐的代码标准是使用不带括号“()”的 require_once。

require_once(ROOT.'文件夹'.DIRECTORY_SEPARATOR.'requiredfile.ph');

变成

require_once ROOT.'Folder'.DIRECTORY_SEPARATOR.'requiredfile.ph';

https://book.cakephp.org/3.0/en/contributing/cakephp-coding-conventions.html

希望对未来的人有所帮助。

【讨论】:

这不是问题的答案。如果这是对 Ayman B. 答案的评论:您必须首先获得 50 分的声誉才能离开 cmets。您可以通过提问或回答问题来提高您的声誉:***.com/questions。 它显示错误:1 /PHP 注意:使用未定义的常量 ROOT - 在第 6 行的 C:\xampp\htdocs\ProjectX\webroot\classX.php 中假定为“ROOT”。

以上是关于如何在 CakePHP 3x 中导入供应商文件的主要内容,如果未能解决你的问题,请参考以下文章

在 Cocoapod 中导入 Kotlin/Native 框架

无法将供应商类导入 CakePHP 2.5.1 中的组件

PHP 在Cakephp中导入/加载模型

在Cakephp中导入/加载模型

Mac App Sandboxed:如何导入没有扩展名、没有图标的文件

CakePHP - 在我的应用程序结构中放置自定义实用程序类的最佳位置在哪里?