我已经尝试了几个小时了,似乎找不到任何有效的帖子。我正在将自定义php类添加到Symfony2供应商目录中。
例如(复制其他供应商结构):
vendor/mylb/mylib/src/Mylb/Lib/Class.php
然后我更新了根composer.json,添加了:
"require": {
"mylib/mylib": "@dev"
},
我还在vendor/mylib/mylib中创建了一个composer.json,其中包含:
{
"name": "mylib/mylib",
"type": "library",
"description": "My Libraty",
"keywords": ["library"],
"autoload": {
"psr-0": { "Mylib\": "src/" }
},
"minimum-stability": "dev"
}
我在Class.php中添加了一个名称空间:
namespace MyLibLib;
在我的一个捆绑包中,我添加了以下内容:
use MyLibLibClassName as ClassName;
class Cms extends ClassName
{}
我得到的错误是:
FatalErrorException:错误:在中找不到类"MyLib\Lib\MyClass"C: \examplep\htdocs\My_CMS\src\CMS\CmsBundle\Entity\CMS.php第13行
我做错了什么?
您确实应该使用服务容器,这基本上是加载类的符号方式。
原因如下:
- 也就是说,在需要服务之前,永远不会构建它
- 代码重用的最佳实践
- 分离应用程序中的每一项功能
- 由于每个服务只做一项工作,您可以轻松地访问每个服务服务,并在任何需要的地方使用其功能
- 每个服务也可以更容易地进行测试和配置,因为它与应用程序中的其他功能是分离的
- 这种想法被称为面向服务的体系结构,并不是唯一的到Symfony甚至PHP
http://symfony.com/doc/current/book/service_container.html
A Service Container (or dependency injection container) is simply a PHP object that manages the instantiation of services (i.e. objects).
因此,基本上symfony将在控制器中为您处理类的实例化。你所需要做的就是:
在您的路径下添加一个名为Libraries-->src/AppBundle/Libraries 的文件夹
将类添加到此文件夹中,并在顶部添加一个命名空间。我的例子是:
<?php
namespace AppBundleLibraries;
class MyRecommendations{
public function __construct(){
}
public function init(){
die("init");
}
}
然后将一个名为services.yml的文件添加到您的应用程序中。app/config/services.yml
将以下代码放入其中不要在yml文件中使用选项卡
services:
myrecommendations:
class: AppBundleLibrariesMyRecommendations
#arguments: [specialparamhere] #constructor parameters here
然后将第三行资源:services.yml添加到config.yml文件中。
imports:
- { resource: parameters.yml }
- { resource: security.yml }
- { resource: services.yml }
在您的控制器顶部使用时,只需添加使用语句
use AppBundleLibrariesMyRecommendations;
现在调用您的代码
$test = $this->get('myrecommendations');
$test->init();
回波输出
init
在php中,类通过__autoload 自动加载
Symfony在它的类加载器中处理它,但事实上它的工作方式是一样的。没有后台扫描所有目录,因此您必须手动添加命名空间。
您需要在autoload.php文件中添加:
$loader->add('NAMESPACE','/path/to/vendor');
如果有另一个项目使用自动加载器加载其类,例如SimpleSAML,并希望在另一个命名空间的类中使用它:
namespace StudyUserBundleService;
require_once "/full_path/simplesaml/lib/_autoload.php";
use SimpleSAML_Configuration;
use SimpleSAML_Auth_Simple;
use SimpleSAML_Auth_State;
class SimpleSAMLLogin {
最后一个答案是正确的:https://stackoverflow.com/a/27768442/2400373
不过,我为我工作很重要,补充一下这是正确的,但如果你在安装自动加载库之前。在Symfony 3.2.x中,我添加了我的库en composer.json:
"autoload": {
"psr-4": { "": "src/" },
"classmap": [ "app/AppKernel.php", "app/AppCache.php","**src/AppBundle/juanitourquiza/pagopayphone/library"** ]
在这个指令之后:
composer update
然后一切都好了。
问候