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

Gre*_*orn 8 php symfony composer-php

我现在已经尝试了几个小时了 - 我似乎无法找到任何有用的帖子.我正在向Symfony2供应商目录添加自定义php类.

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

供应商/ MYLIB/MYLIB/SRC/MYLIB/LIB/Class.php

然后我通过添加以下内容更新了根composer.json:

"require": {
    "mylib/mylib": "@dev"
},
Run Code Online (Sandbox Code Playgroud)

我还在vendor/mylib/mylib中创建了一个composer.json,其中包含:

{
    "name": "mylib/mylib",
    "type": "library",
    "description": "My Libraty",
    "keywords": ["library"],
    "autoload": {
        "psr-0": { "Mylib\\": "src/" }
    },
    "minimum-stability": "dev"
}
Run Code Online (Sandbox Code Playgroud)

我在Class.php中添加了一个名称空间:

namespace MyLib\Lib;
Run Code Online (Sandbox Code Playgroud)

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

use MyLib\Lib\ClassName as ClassName;
class Cms extends ClassName
{}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

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

我究竟做错了什么?

Jas*_*son 10

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

原因如下:

  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).
Run Code Online (Sandbox Code Playgroud)

所以基本上symfony会在你的控制器中处理你的类的实例化.您需要做的就是以下内容:

在路径下添加一个名为Libraries - > src/AppBundle/Libraries的文件夹

将类添加到此文件夹,顶部带有命名空间.我的例子是:

    <?php

namespace AppBundle\Libraries;

class MyRecommendations{


    public function __construct(){

    }

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


}
Run Code Online (Sandbox Code Playgroud)

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

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

services:
    myrecommendations:
        class:        AppBundle\Libraries\MyRecommendations
        #arguments:    [specialparamhere]  #constructor parameters here
Run Code Online (Sandbox Code Playgroud)

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

imports:
    - { resource: parameters.yml }
    - { resource: security.yml }
    - { resource: services.yml }
Run Code Online (Sandbox Code Playgroud)

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

use AppBundle\Libraries\MyRecommendations;
Run Code Online (Sandbox Code Playgroud)

现在打电话给你的代码

$test = $this->get('myrecommendations');
            $test->init();
Run Code Online (Sandbox Code Playgroud)

回声消失了

init
Run Code Online (Sandbox Code Playgroud)


小智 4

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

Symfony 在它的类加载器中关心它,但实际上它的工作方式是相同的。没有后台扫描所有目录,因此您必须手动添加名称空间。

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

$loader->add('NAMESPACE','/path/to/vendor');
Run Code Online (Sandbox Code Playgroud)