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

时间:2014-08-28 13:53:12

标签: php zend-framework zend-framework2

我正在尝试在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/"}
    }   
    

    composer.json

  4. Ran作曲家:

    `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 
    
  6. 我收到错误:

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

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

    提前致谢

3 个答案:

答案 0 :(得分:1)

简短的回答是您的mylibrary类位于mylibrary命名空间中,因此应更改use语句以反映...

use mylibrary\mylibrary;

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

$mylibrary = new \mylibrary\mylibrary();

答案 1 :(得分:1)

我建议你使用ZFTool创建一个新模块(这是在ZF2中调用库的方式), 假设您正在使用Git并且安装了Git bash,则可以执行以下操作

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

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

  

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

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

  

./ vendor / bin / zf.php -v

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

  • 要确保一切正常,您可以创建一个简单的路由和控制器,因此打开YourZFSkeleton / module / YourNewModule / config / module.config.php并添加以下内容

    namespace MyNewModule; 

    return array(
        'view_manager' => array(
            'template_path_stack' => array(
                __NAMESPACE__ => __DIR__ . '/../view',
            ),
        ),

        'controllers' => array(
            'invokables' => array(
                __NAMESPACE__ . '\Controller\Index' => __NAMESPACE__ . '\Controller\IndexController',
            ),
        ),

        'router' => array(
            'routes' => array(
                __NAMESPACE__ => array(
                    'type' => 'Literal',
                    'priority' => 1000,
                    'options' => array(
                        'route' => '/example',
                        'defaults' => array(
                            'controller' => __NAMESPACE__ . '\Controller\Index',
                            'action'     => 'index',
                        ),
                    ),
                ),
            ),
        ),
    );

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


    namespace MyNewModule\Controller;

    use Zend\Mvc\Controller\AbstractActionController,
        Zend\View\Model\ViewModel;

    class IndexController 
        extends AbstractActionController
    {
        public function indexAction() 
        {
            return new ViewModel();
        }
    }

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

  

Hello world!

您可以在访问

的行动中看到它
http://yourSiteUrlOrVhost/example

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

正如已经建议的那样,从不编辑供应商目录中的任何内容,它包含由作曲家自动下载的依赖项。

如果您愿意,可以为您的模块创建一个新的repo,然后使用composer将其添加到广告依赖项中。

希望这有帮助!

答案 2 :(得分:0)

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