How to load a custom library in Zend Framework 2?

心已入冬 提交于 2020-01-29 04:25:05

问题


I've been following this guide (http://socialsemanticweb.blogspot.com.au/2012/11/zend-framework-2-create-custom-library.html) but I can't get Zend to see my library (error message below).

Any ideas what could be wrong? thanks

my folder structure

my MyLibraryController.php

<?php

namespace MyLibrary\Mvc\Controller;

use Zend\Mvc\Controller\AbstractActionController;

class MyLibraryController extends AbstractActionController {
    public function __construct() {
    }

    public function doSomething() {
        //instantiate your model here and return result
     $result = "test";
     return $result;
    }
}

my autoload_namespaces.php (inside vendor\composer)

<?php

// autoload_namespaces.php generated by Composer

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

return array(
    'Zend\\' => $vendorDir . '/zendframework/zendframework/library/',
    'ZendTest\\' => $vendorDir . '/zendframework/zendframework/tests/',
    'Symfony\\Component\\Console\\' => $vendorDir . '/symfony/console/',
    'Doctrine\\ORM' => $vendorDir . '/doctrine/orm/lib/',
    'Doctrine\\DBAL' => $vendorDir . '/doctrine/dbal/lib/',
    'Doctrine\\Common' => $vendorDir . '/doctrine/common/lib/',
    'DoctrineORMModule\\' => $vendorDir . '/doctrine/doctrine-orm-module/src/',
    'DoctrineORMModuleTest\\' => $vendorDir . '/doctrine/doctrine-orm-module/tests/',
    'DoctrineModule\\' => $vendorDir . '/doctrine/doctrine-module/src/',
    'DoctrineModuleTest\\' => $vendorDir . '/doctrine/doctrine-module/tests/',
    'MyLibrary\\' => $vendorDir . '/MyLibrary/library/',
);

my application.config.php (I've only added the MyLibrary entry. I've tried with and without it)

<?php
return array(
    // This should be an array of module namespaces used in the application.
    'modules' => array(
        'Application',
        'DoctrineModule',
        'DoctrineORMModule',
        'Directory',
        'Helpers',
    'MyLibrary',

error message without adding MyLibrary module in application.config.php

Fatal error: Class 'Directory\Controller\MyLibaryController' not found in D:\work\eclipse\htdocs\directory\module\Directory\src\Directory\Controller\DirectoryController.php on line 17

error message with MyLibrary module entry in application.config.php

Fatal error: Uncaught exception 'Zend\ModuleManager\Exception\RuntimeException' with message 'Module (MyLibrary) could not be initialized.' in D:\work\eclipse\htdocs\directory\vendor\zendframework\zendframework\library\Zend\ModuleManager\ModuleManager.php:175 Stack trace: #0 D:\work\eclipse\htdocs\directory\vendor\zendframework\zendframework\library\Zend\ModuleManager\ModuleManager.php(149): Zend\ModuleManager\ModuleManager->loadModuleByName(Object(Zend\ModuleManager\ModuleEvent)) #1 D:\work\eclipse\htdocs\directory\vendor\zendframework\zendframework\library\Zend\ModuleManager\ModuleManager.php(90): Zend\ModuleManager\ModuleManager->loadModule('MyLibrary') #2 [internal function]: Zend\ModuleManager\ModuleManager->onLoadModules(Object(Zend\ModuleManager\ModuleEvent)) #3 D:\work\eclipse\htdocs\directory\vendor\zendframework\zendframework\library\Zend\EventManager\EventManager.php(468): call_user_func(Array, Object(Zend\ModuleManager\ModuleEvent)) #4 D:\work\eclipse\htdocs\directory\vendor\zendframework\zendframework\library in D:\work\eclipse\htdocs\directory\vendor\zendframework\zendframework\library\Zend\ModuleManager\ModuleManager.php on line 175

回答1:


First off, it's not a module, so the error message you get by adding it to the modules array of app config is to be expected.

Editing autoload_namespaces.php to add your library (as you already have) should work.

That said, a more correct way is to add the autoload key to your root composer.json file and do the mapping there

{
    "require": {
        "php": ">=5.3.3",
        "zendframework/zendframework": ">2.2.0rc1"
    },
    "autoload": {
        "psr-0": {"MyLibrary\\": "vendor/MyLibrary/library/"}
    }
}

After doing that, from the command line run composer.phar update, and it will automatically add your library to the autoload_namespaces file for you. Doing it that way means you don't have to manually edit the file every time you update your other libraries with composer.

To the error itself

Fatal error: Class 'Directory\Controller\MyLibaryController' not found in D:\work\eclipse\htdocs\directory\module\Directory\src\Directory\Controller\DirectoryController.php on line 17

I'm guessing that with autoloading taken care of, you're just missing a use statement in your DirectoryController class

<?php
namespace Directory\Controller;

// be sure to use your library controller
use MyLibrary\Mvc\Controller\MyLibraryController;

class DirectoryController extends MyLibraryController
{
    //..
}


来源:https://stackoverflow.com/questions/17291600/how-to-load-a-custom-library-in-zend-framework-2

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!