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

16

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

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

所以我需要在CakePHP 3x中复制相同的内容(我没有使用composer)。
有任何参考资料吗?


1
加入我的两分钱。理想情况下,供应商文件应该使用Composer自动加载,如果您有无法使用Composer自动加载或安装的供应商文件,则需要使用require来加载它们。因此,@Ayman-b的答案应该被接受,因为它适用于CakePHP-3.0。 - Diomedes Andreou
如果可能的话,最好使用Composer。这样生活会更轻松,其他需要保持所有依赖项最新的开发人员也会更容易。 - Leo Galleguillos
5个回答

25

如果不能使用Composer,你需要自己加载它。你可以使用基本的require方法,并且自己创建一个vendor类的新实例。参考链接: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();

1
我更喜欢你的评论方式,它提供了更多的上下文信息 :) - ndm
笑 :) 同意...已将其添加到答案中。 - Ayman Bedair
2
应用程序提供了CakePHP3源文件夹的路径,现在“vendor”不再是“src”文件夹的子文件夹,因此您的代码中require_once将无法正常工作。 - Dashrath
你说得对,@Dashrath。我刚刚编辑了我的答案,并将它替换为ROOT。 - Ayman Bedair
我可以使用这个 require_once(ROOT . 'vendor/Facebook/src/facebook.php'); 吗? - Pradeepta

20
在CakePHP3中,如果要添加一个新的供应商库,可以按照以下步骤进行:
  1. 将库文件夹放置在 your_project/vendor/
  2. 使用 require_once(ROOT . DS . 'vendor' . DS . "my_library_folder" . DS . "my_library_base_class.php") 导入库文件,这样就可以在我们的代码中使用库了。
  3. 在控制器顶部包含类名,例如:

namespace App\Controller; use MyLibraryBaseClass;

这会将库文件引入我们的命名空间以便使用。

  1. 创建加载的类对象,如下所示:
  2. $my_obj= new MyLibraryBaseClass();


如果这仍然对您无效,请尝试添加反斜杠,例如 $my_obj= new \MyLibraryBaseClass(); - Cellydy
它向我显示了2个错误:1 /PHP注意:在C:\xampp\htdocs\ProjectX\webroot\classX.php的第6行中假定使用未定义的常量ROOT为“ROOT”。 2 /注意:在C:\xampp\htdocs\ProjectX\webroot\classX.php的第6行中假定使用未定义的常量DS为“DS”。 - Wajdi Gharsalli
这应该是答案! - Shah Abaz Khan

2
Ayman B.提供的答案并不能像预期的那样完成任务,我自己尝试后发现以下原因:
- 在cakephp3中,vendor文件夹不在APP命名空间下的src文件夹中,而是移动到了ROOT文件夹中,这样做会导致您无法像预期的那样加载Facebook类,请自行尝试并查看结果... - 加载供应商文件并不会自动加载类名本身,如果您的供应商库不遵循PSR-0规则:\VENDOR\PACKAGE\TEST.CLASS.PHP,并且test.class.php中没有必须被调用或在此脚本的开头导入的类定义,如下所示:namespace,则上述代码将无法工作。
要更正答案,您需要执行以下几个步骤:
1-在bootstrap.php中定义一个新的cakephp常量,例如: define('VENDOR', ROOT . DS . 'vendor' .DS);由于VENDOR常量在cakephp 3.x中已删除,因此您可以自己定义它 2-之后,您必须在供应商常量中指定供应商名称、包名称和类名称,例如: define('_', VENDOR . 'facebook/php-sdk-v4/src/Facebook/'); 然后您可以使用 $facebookApi = new \_Facebook\Facebook();
这将按照问题的预期为您工作。
如果您有问题,请与我联系,我将向您展示如何使用。

1
我在使用CakePHP 3.0时也遇到了同样的问题。按照Composer的指示进行安装。
然后,您需要在控制器中使用use语句正确加载插件。像这样: use Ghunti\HighchartsPHP\Highchart; 如果您在大多数页面中使用插件,而不是在每个控制器中加载,可以将相同的行添加到bootstrap.php文件中,在其他use语句下方。
这将解决使用插件的问题。

0

这不是问题的答案。如果这是针对Ayman B.的回答的评论:您必须先获得50分的声望才能留下评论。您可以通过提问或回答问题来提高您的声望:https://stackoverflow.com/questions。 - Leviathan
它向我显示错误:1 /PHP 注意:C:\xampp\htdocs\ProjectX\webroot\classX.php 的第6行中使用了未定义的常量ROOT,假定为'ROOT'。 - Wajdi Gharsalli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接