8

我已经尝试了几个小时 - 我似乎找不到任何有效的帖子。我正在将自定义 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:错误:在 C:\xampp\htdocs\My_CMS\src\Cms\CmsBundle\Entity\Cms.php 第 13 行中找不到类“MyLib\Lib\MyClass”

我究竟做错了什么?

4

4 回答 4

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).

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

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

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

    <?php

namespace AppBundle\Libraries;

class MyRecommendations{


    public function __construct(){

    }

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


}

然后将一个名为 services.yml 的文件添加到您的应用程序中。应用程序/配置/服务.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 语句

use AppBundle\Libraries\MyRecommendations;

现在调用您的代码

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

回声出来了

init
于 2015-01-04T17:44:57.180 回答
4

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

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

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

$loader->add('NAMESPACE','/path/to/vendor');
于 2013-08-25T22:43:24.077 回答
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 {
于 2015-06-30T17:51:17.860 回答
0

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

我为我工作但重要的是添加这是正确的但如果您在安装库之前自动加载。在 Symfony 3.2.x 中,我在 composer.json 中添加了我的库:

"autoload": {
    "psr-4": { "": "src/" },
    "classmap": [ "app/AppKernel.php", "app/AppCache.php","**src/AppBundle/juanitourquiza/pagopayphone/library"** ]

在此指令之后:

composer update

那么一切都很好。

问候

于 2017-06-16T14:47:32.677 回答