将自定义供应商库添加到Symfony2 autoload

时间:2013-08-25 22:09:03

标签: php symfony composer-php

我一直在尝试这几个小时 - 我似乎无法找到任何有用的帖子。 我将自定义php类添加到Symfony2供应商目录。

例如(复制其他供应商结构)

供应商/ MYLIB / MYLIB / SRC / MYLIB / 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:\ xampp \ htdocs \ My_CMS \ src \ Cms \ CmsBundle \ Entity \ Cms.php第13行

我做错了什么?

4 个答案:

答案 0 :(得分:10)

你真的应该使用服务容器,这基本上是加载类的symfony方式。

这就是原因:

  1. 即,在需要之前永远不会构建服务。
  2. 重用代码的最佳做法。
  3. 分离应用程序中的每项功能。
  4. 由于每项服务只执行一项工作,因此您可以轻松访问每项服务 在任何需要的地方提供服务并使用其功能。
  5. 从那以后,每个服务也可以更容易地进行测试和配置 它与您应用程序中的其他功能分开。
  6. 这个想法被称为面向服务的架构,并不是唯一的 到Symfony甚至PHP。
  7. 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 /库

    将类添加到此文件夹,并在顶部添加名称空间。 我的例子是:

        <?php
    
    namespace AppBundle\Libraries;
    
    class MyRecommendations{
    
    
        public function __construct(){
    
        }
    
        public function init(){
            die("init");
        }
    
    
    }
    

    然后将名为services.yml的文件添加到您的应用中。 应用程序/配置/ services.yml

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

    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
    

答案 1 :(得分:4)

在php类中,通过__autoload

自动加载

Symfony在Class Loader中关注它,但实际上它的工作方式相同。没有后台扫描所有目录,因此您必须手动添加命名空间。

您需要添加autoload.php文件:

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

答案 2 :(得分:0)

如果有另一个项目使用自动加载器加载其类,例如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 {

答案 3 :(得分:0)

最后的答案是正确的: https://stackoverflow.com/a/27768442/2400373

我为我工作然而重要的是补充说这是正确的,但如果你在安装库en autoload之前。 就我在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

然后一切都很好。

此致