将自定义供应商库添加到Symfony2自动加载中


Adding a custom vendor lib to Symfony2 autoload

我已经尝试了几个小时了,似乎找不到任何有效的帖子。我正在将自定义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 MyLib'Lib;

在我的一个捆绑包中,我添加了以下内容:

use MyLib'Lib'ClassName as ClassName;
class Cms extends ClassName
{}

我得到的错误是:

FatalErrorException:错误:在中找不到类"MyLib''Lib''MyClass"C: ''examplep''htdocs''My_CMS''src''CMS''CmsBundle''Entity''CMS.php第13行

我做错了什么?

您确实应该使用服务容器,这基本上是加载类的符号方式。

原因如下:

  1. 也就是说,在需要服务之前,永远不会构建它
  2. 代码重用的最佳实践
  3. 分离应用程序中的每一项功能
  4. 由于每个服务只做一项工作,您可以轻松地访问每个服务服务,并在任何需要的地方使用其功能
  5. 每个服务也可以更容易地进行测试和配置,因为它与应用程序中的其他功能是分离的
  6. 这种想法被称为面向服务的体系结构,并不是唯一的到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 AppBundle'Libraries;
class MyRecommendations{

    public function __construct(){
    }
    public function init(){
        die("init");
    }

}

然后将一个名为services.yml的文件添加到您的应用程序中。app/config/services.yml

将以下代码放入其中不要在yml文件中使用选项卡

services:
    myrecommendations:
        class:        AppBundle'Libraries'MyRecommendations
        #arguments:    [specialparamhere]  #constructor parameters here

然后将第三行资源:services.yml添加到config.yml文件中。

imports:
    - { resource: parameters.yml }
    - { resource: security.yml }
    - { resource: services.yml }

在您的控制器顶部使用时,只需添加使用语句

use AppBundle'Libraries'MyRecommendations;

现在调用您的代码

$test = $this->get('myrecommendations');
            $test->init();

回波输出

init

在php中,类通过__autoload 自动加载

Symfony在它的类加载器中处理它,但事实上它的工作方式是一样的。没有后台扫描所有目录,因此您必须手动添加命名空间。

您需要在autoload.php文件中添加:

$loader->add('NAMESPACE','/path/to/vendor');

如果有另一个项目使用自动加载器加载其类,例如SimpleSAML,并希望在另一个命名空间的类中使用它:

namespace Study'UserBundle'Service;
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

然后一切都好了。

问候