如何在ZF2中加载自己的库?

时间:2016-04-08 16:52:33

标签: php zend-framework2

我想在ZF2中开发自己的库,但是当我尝试使用自己的类时,我遇到了问题。

我在这个文件夹结构中创建了自己的类(SistemaData.php)

enter image description here

SistemasData.class

namespace Data;

class SistemasData{
    public function __construct($log){
        $log->info("Hola desde dentro del constructor!!!");
    }
}

/Vendor/composer/autoload_namespaces.php

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'phpDocumentor' => array($vendorDir . '/phpdocumentor/reflection-docblock/src'),
    'ZendXml' => array($vendorDir . '/zendframework/zendxml/library'),
    'ZendDeveloperTools' => array($vendorDir . '/zendframework/zend-developer-tools/src'),
    'Prophecy\\' => array($vendorDir . '/phpspec/prophecy/src'),
    'PHPExcel' => array($vendorDir . '/phpoffice/phpexcel/Classes'),
    'Doctrine\\ORM\\' => array($vendorDir . '/doctrine/orm/lib'),
    'Doctrine\\Instantiator\\' => array($vendorDir . '/doctrine/instantiator/src'),
    'Doctrine\\DBAL\\' => array($vendorDir . '/doctrine/dbal/lib'),
    'Doctrine\\Common\\Lexer\\' => array($vendorDir . '/doctrine/lexer/lib'),
    'Doctrine\\Common\\Inflector\\' => array($vendorDir . '/doctrine/inflector/lib'),
    'Doctrine\\Common\\Collections\\' => array($vendorDir . '/doctrine/collections/lib'),
    'Doctrine\\Common\\Cache\\' => array($vendorDir . '/doctrine/cache/lib'),
    'Doctrine\\Common\\Annotations\\' => array($vendorDir . '/doctrine/annotations/lib'),
    'Doctrine\\Common\\' => array($vendorDir . '/doctrine/common/lib'),
    'DoctrineORMModule\\' => array($vendorDir . '/doctrine/doctrine-orm-module/src'),
    'DoctrineModule\\' => array($vendorDir . '/doctrine/doctrine-module/src'),
    'Demo31\\'  => array($vendorDir . '/Demo31')
);

FooController.php

use Data\SistemasData;

class FooController{
  public function indexAction(){
      $sistemas = new SistemasData($log);
  }
}

错误

  

Class' Data \ SistemasData'找不到   /var/www/html/gnsys/module/Publico/src/Publico/Controller/ActividadesController.php

我做错了什么?

修改1:

按照Alex P的指示,我做了这些修改:

  1. 我更改了名称空间Demo31 - >演示
  2. enter image description here

    1. 我为此示例创建了一个新类
    2. BubbleSort.class

      namespace Sort;
      
      class BubbleSort{
          public function __construct($log){
              $log->info("Hola desde dentro del constructor de BubbleSort!!!");
          }
      }
      
      1. 我修改了autoload_namespaces.php
      2. /Vendor/composer/autoload_namespaces.php

        $vendorDir = dirname(dirname(__FILE__));
        $baseDir = dirname($vendorDir);
        
        return array(
            'phpDocumentor' => array($vendorDir . '/phpdocumentor/reflection-docblock/src'),
            'ZendXml' => array($vendorDir . '/zendframework/zendxml/library'),
            'ZendDeveloperTools' => array($vendorDir . '/zendframework/zend-developer-tools/src'),
            'Prophecy\\' => array($vendorDir . '/phpspec/prophecy/src'),
            'PHPExcel' => array($vendorDir . '/phpoffice/phpexcel/Classes'),
            'Doctrine\\ORM\\' => array($vendorDir . '/doctrine/orm/lib'),
            'Doctrine\\Instantiator\\' => array($vendorDir . '/doctrine/instantiator/src'),
            'Doctrine\\DBAL\\' => array($vendorDir . '/doctrine/dbal/lib'),
            'Doctrine\\Common\\Lexer\\' => array($vendorDir . '/doctrine/lexer/lib'),
            'Doctrine\\Common\\Inflector\\' => array($vendorDir . '/doctrine/inflector/lib'),
            'Doctrine\\Common\\Collections\\' => array($vendorDir . '/doctrine/collections/lib'),
            'Doctrine\\Common\\Cache\\' => array($vendorDir . '/doctrine/cache/lib'),
            'Doctrine\\Common\\Annotations\\' => array($vendorDir . '/doctrine/annotations/lib'),
            'Doctrine\\Common\\' => array($vendorDir . '/doctrine/common/lib'),
            'DoctrineORMModule\\' => array($vendorDir . '/doctrine/doctrine-orm-module/src'),
            'DoctrineModule\\' => array($vendorDir . '/doctrine/doctrine-module/src'),
            'Demo\\'    => array($vendorDir . '/Demo/library')
        );
        

        结果是......

          

        致命错误:Class' Sort \ BubbleSort'找不到   /var/www/html/gnsys/module/Publico/src/Publico/Controller/ActividadesController.php   在第31行

        编辑2:

        我已经运行了php composer.phar dumpautoload但它没有工作,但是这个过程删除了我添加的行。现在,我的autoload_namespaces.php:

        $vendorDir = dirname(dirname(__FILE__));
        $baseDir = dirname($vendorDir);
        
        return array(
            'phpDocumentor' => array($vendorDir . '/phpdocumentor/reflection-docblock/src'),
            'ZendXml' => array($vendorDir . '/zendframework/zendxml/library'),
            'ZendDeveloperTools' => array($vendorDir . '/zendframework/zend-developer-tools/src'),
            'Prophecy\\' => array($vendorDir . '/phpspec/prophecy/src'),
            'PHPExcel' => array($vendorDir . '/phpoffice/phpexcel/Classes'),
            'Doctrine\\ORM\\' => array($vendorDir . '/doctrine/orm/lib'),
            'Doctrine\\Instantiator\\' => array($vendorDir . '/doctrine/instantiator/src'),
            'Doctrine\\DBAL\\' => array($vendorDir . '/doctrine/dbal/lib'),
            'Doctrine\\Common\\Lexer\\' => array($vendorDir . '/doctrine/lexer/lib'),
            'Doctrine\\Common\\Inflector\\' => array($vendorDir . '/doctrine/inflector/lib'),
            'Doctrine\\Common\\Collections\\' => array($vendorDir . '/doctrine/collections/lib'),
            'Doctrine\\Common\\Cache\\' => array($vendorDir . '/doctrine/cache/lib'),
            'Doctrine\\Common\\Annotations\\' => array($vendorDir . '/doctrine/annotations/lib'),
            'Doctrine\\Common\\' => array($vendorDir . '/doctrine/common/lib'),
            'DoctrineORMModule\\' => array($vendorDir . '/doctrine/doctrine-orm-module/src'),
            'DoctrineModule\\' => array($vendorDir . '/doctrine/doctrine-module/src'),
        );
        

        这条线怎么了?

        'Demo\\'    => array($vendorDir . '/Demo/library')
        

        编辑3:

        我不知道原因,但文件没有更改。现在是22h19'并且文件有一个不同的小时。

        enter image description here

        解决方案

        我找到了解决方案。这些是要遵循的步骤:

        创建所需的文件夹结构,例如:

        enter image description here

        创建我们的对象BubbleSort.php,例如:

        namespace Sort;
        
        class BubbleSort{
            public function __construct($log){
                $log->info("Hola desde dentro del constructor de BubbleSort!!!");
            }
        }
        

        编辑项目内部的composer.json文件,并附加以下代码块:

        "autoload":{
            "classmap": ["vendor/Demo/library"]
        }
        

        在档案的最后。

        componser.json

        {
            "name": "zendframework/skeleton-application",
            "description": "Skeleton Application for ZF2",
            "license": "BSD-3-Clause",
            "keywords": [
                "framework",
                "zf2"
            ],
            "homepage": "http://framework.zend.com/",
            "require": {
                "php": ">=5.5",
                "zendframework/zendframework": "~2.5",
                "zendframework/zend-developer-tools": "dev-master",
                "doctrine/doctrine-module": "^0.9.0",
                "doctrine/doctrine-orm-module": "^0.9.2",
                "phpoffice/phpexcel": "^1.8"
            },
            "autoload":{
                "classmap": ["vendor/Demo/library"]
            }
        }
        

        下一步是运行php composer.phar dumpautoload。重要" dumpautoload"不更新项目的所有库!!!

        最后,您可以进行一些测试,在控制器的indexAction中创建对象的实例,例如

        FooController.php

        use Sort\BubbleSort;
        
        class FooController{
        public function indexAction(){
        
                $log = $this->getServiceLocator()->get("Zend/Log");
                $a = new BubbleSort($log);
        
                return new ViewModel();
            }
        }
        

0 个答案:

没有答案