Zend Framework 2使用了我自己的库和名称空间混淆


Zend Framework 2 use my own Library and namespace confusion

我试图在ZF2中创建一个库,但发现它非常乏味和困难。我的库将用于对图像执行任务,没有前端输出。在尽可能多地阅读之后,我完成了以下过程。

  1. 创建:

    vendor/mycompany/mylibrary/library/mylibrary/mylibrary.php
    
  2. mylibrary.php:的内容

    <?php
    namespace mylibrary;
    class mylibrary {
    }
    
  3. 添加:

    "autoload": {
        "psr-0":  {"mylibrary''":"vendor/mycompany/mylibrary/library/mylibrary/"}
    }   
    

    至CCD_ 2。

  4. 冉作曲:

    `sudo php composer.phar update`
    

    并且没有错误,并且autoload_namespaces.php被更新为新的名称空间:

    return array(
        'mylibrary''' => array($vendorDir . '/mycompany/mylibrary/library/mylibrary'),
        'Zend''' => array($vendorDir . '/zendframework/zendframework/library'),
        'ZendXml' => array($vendorDir . '/zendframework/zendxml/library'),
        'ZendPdf''' => array($vendorDir . '/zendframework/zendpdf/library'),
    );
    
  5. 添加:

    use mylibrary;

    IndexController.php

    并尝试实例化类:

    public function indexAction()
    {
        $mylibrary = new mylibrary();
        // .... etc etc 
    

我得到一个错误:

Fatal error: Class 'mylibrary' not found in /the/root/to/my/site/module/Application/src/Application/Controller/IndexController.php on line 22

请有人看看我做了什么,也许告诉我如何在没有这个错误的情况下实例化我的类?

提前感谢

简单的答案是您的mylibrary类在mylibrary命名空间中,因此您的use语句应该更改以反映。。。

use mylibrary'mylibrary;

另一种选择是在实例化类时省略use语句并使用FQCN

$mylibrary = new 'mylibrary'mylibrary();

我建议您使用ZFTool创建一个新模块(ZF2中就是这样调用库的),假设您使用的是Git,并且安装了Gitbash,则可以执行以下

  • 克隆ZF2骨架,您将在此处获得说明https://github.com/zendframework/ZendSkeletonApplication

  • 将ZFTool依赖项添加到composer.json文件

"require": {
    "php": ">=5.3.3",
    "zendframework/zendframework": "2.3.*",
    "zendframework/zftool": "dev-master",
},
  • 运行php composer.phar更新。

  • 要在项目中创建一个新模块,请从控制台,cd到项目根目录并运行

/vendor/bin/zf.php创建模块MyModule

或键入-v查看所有可用选项

/vendor/bin/zf.php-v

这样,您的模块将以正确的结构创建,并自动注册到应用程序中。它将在应用程序模块目录中创建

  • 为了确保一切正常,您可以创建一个简单的路由和控制器,因此打开YourZFSkeleton/module/YourNewModule/config/module.config.php并添加以下内容
命名空间MyNewModule;返回数组('view_manager'=>数组('template_path_stack'=>数组(__NAMESPACE__=>__DIR__.'//视图',),),"控制器"=>阵列("invokables"=>数组(__NAMESPACE__'''控制器''索引'=>__NAMESPACE__'''控制器''索引控制器',),),"路由器"=>阵列("routes"=>数组(__NAMESPACE__=>数组('type'=>'Literal',"优先级"=>1000,"options"=>数组('route'=>'/example','defaults'=>数组('控制器'=>__NAMESPACE__'''控制器''索引','action'=>'index',),),),),),);

以及模块的控制器目录中的IndexController.php

命名空间MyNewModule''Controller;使用Zend''Mvc''Controller''AbstractActionController,Zend''View''Model''ViewModel;类IndexController扩展AbstractActionController{公共函数indexAction(){返回new ViewModel();}}

和视图脚本MyNewModule/view/my-new module/index/index.phtml

你好,世界!

你可以在访问时看到它的作用

http://yourSiteUrlOrVhost/example

我没有测试这个代码,可能包含错误或遗漏:/

如前所述,从不编辑供应商目录中的任何内容,它包含由composer自动下载的依赖项。

如果你愿意,你可以为你的模块创建一个新的repo,然后使用composer添加它的广告依赖性。

希望这能有所帮助!

您不应该在vendor中手动创建文件。如果您希望能够与其他应用程序共享库,请创建文件以及相应的composer.json。将库放在自己的源代码管理存储库中,然后使用composer将其安装到主应用程序中。