首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP-DI没有与ZendFramework2集成。

PHP-DI没有与ZendFramework2集成。
EN

Stack Overflow用户
提问于 2015-02-23 13:00:29
回答 3查看 300关注 0票数 0

请给出一个提示,为什么PHP与Zend 2的集成不适合我(转载于Apache/2.4.9 (Win64) PHP/5.5.12和Apache2.2.22 (Win32) PHP/5.3.13)。

composer.json

代码语言:javascript
复制
{
    "require": {
        "php": ">=5.3.3",
        "zendframework/zendframework": "2.3.5",
        "mnapoli/php-di": "4.4.6",
        "mnapoli/php-di-zf2": "0.3.0",
       ...
},
    ...

config\application.config.php

代码语言:javascript
复制
<?php
return array(
    'modules' => array(
        'Morpho',
        'DI\ZendFramework2',
    ),
    'module_listener_options' => array(
        'module_paths' => array(
            './module',
            './vendor',
        ),
    ),
);
?>

module/Morpho/config.module.config.php

代码语言:javascript
复制
<?php
return array(
    'service_manager' => array(
        'factories' => array(
            'DI\Container' => function() {
                $builder = new DI\ContainerBuilder();
                $builder->addDefinitionsFromFile("config/di.yml");
                return $builder->build();
            },
        ),
    ),
    'router' => array(
        ...
    ),
    'controllers' => array(
        ...
    ),
    'view_manager' => array(
        ...
    ),
);

config/di.yml

代码语言:javascript
复制
Morpho\Service\PartOfSpeechService:
    class: Morpho\Service\PhpMorphyPartOfSpeechService

module/Morpho/src/Morpho/Controller/PartOfSpeechController

代码语言:javascript
复制
class PartOfSpeechController extends AbstractRestfulController {
    ...
    /**
     * @Inject
     * @var PartOfSpeechService
     */
    public $partOfSpeechService;

    public function processPostData(Request $request) {
        $partsOfSpeech = $this->partOfSpeechService->getPartsOfSpeech("test", "en_EN");
        return new JsonModel($partsOfSpeech);
    }
}

每次在apache下运行此代码时:

代码语言:javascript
复制
PHP Fatal error:  Uncaught exception 'Zend\ModuleManager\Exception\RuntimeException'
with message 'Module (DI\ZendFramework2) could not be initialized.' in \vendor\zendframework\zendframework\library\Zend\ModuleManager\ModuleManager.php:195
Stack trace:
0 \vendor\zendframework\zendframework\library\Zend\ModuleManager\ModuleManager.php(169): Zend\ModuleManager\ModuleManager->loadModuleByName(Object(Zend\ModuleManager\ModuleEvent))
1 \vendor\zendframework\zendframework\library\Zend\ModuleManager\ModuleManager.php(96): Zend\ModuleManager\ModuleManager->loadModule('DI\ZendFramewor...')
2 [internal function]: Zend\ModuleManager\ModuleManager->onLoadModules(Object(Zend\ModuleManager\ModuleEvent))
3 \vendor\zendframework\zendframework\library\Zend\EventManager\EventManager.php(468):
call_user_func(Array, Object(Zend\ModuleManager\ModuleEvent))
4 \vendor\zendframework\zendframework\library\Zend\EventManager\EventManager.php(207): Zend\EventM in \vendor\zendframework\zendframework\library\Zend\ModuleManager\ModuleManager.php on line 195

任何你的想法都会很感激的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-23 15:58:37

服务的

工厂配置:

代码语言:javascript
复制
        'factories' => array(
            'MyService' => 'Application\Factory\MyService',
        ),

工厂级:

代码语言:javascript
复制
class MyService implements FactoryInterface
{

    public function createService(ServiceLocatorInterface $serviceManager)
    {
        $purifier = new MyService($serviceManager->get('MyAwesomeDependency'));
        return $purifier;
    }
}

控制器的

ControllerFactory.php:

代码语言:javascript
复制
class PartOfSpeechControllerFactory
{
    public function __invoke($serviceLocator)
    {
        // Service locator here is the ControllerManager so get ServiceManager 
        $serviceManager = $serviceLocator->getServiceLocator();

        $controller = new PartOfSpeechController($serviceManager->get('PartOfSpeechService'));

        return $controller;
    }
}

类PartOfSpeechController.php

代码语言:javascript
复制
class PartOfSpeechController extends AbstractRestfulController {


    protected $partOfSpeechService;

    public function __construct(PartOfSpeechService $partOfSpeechService)
    {
         $this->partOfSpeechService = $partOfSpeechService;
    }


    public function processPostData(Request $request) {
         $var = $this->partOfSpeechService->serviceMethod();   
    }
}

控制器的配置:

代码语言:javascript
复制
'factories' => array(
                'Application\Controller\PartOfSpeechController' => 'Application\Factory\PartOfSpeechControllerFactory'
        ),
票数 0
EN

Stack Overflow用户

发布于 2015-02-25 04:15:19

它不能工作,因为您使用的是旧的YAML语法,而是因为PHP v4.0语法现在是PHP

转到文档中学习语法:http://php-di.org/doc/definition.html

票数 1
EN

Stack Overflow用户

发布于 2015-02-23 15:54:52

我遵循了紫色六角的建议,下面是一个使用服务管理器的工作实现:

module/Morpho/config

代码语言:javascript
复制
...
'service_manager' => array(
    'services' => array(
        "PartOfSpeechService" => new Morpho\Service\PhpMorphyPartOfSpeechService(),
    ),
),
...

module/Morpho/src/Morpho/Controller/PartOfSpeechController.php

代码语言:javascript
复制
class PartOfSpeechController extends AbstractRestfulController {
    ...
    public function processPostData(Request $request) {
        $serviceManager = $this->getServiceLocator();
        $partsOfSpeech = $serviceManager->get("PartOfSpeechService")->getPartsOfSpeech($request->getPost("phrase"),
                $request->getPost("language"));
        return new JsonModel($partsOfSpeech);
    }
}

为什么我不喜欢这样:

  1. 我必须使用“虚拟”代码来获得serviceManager。这是“虚拟的”,因为这与我的应用程序的业务逻辑完全无关。
  2. ServiceManager提供的依赖注入方法使我的代码依赖于ServiceManager本身。通常,我不应该关心bean/对象是如何注入的,因此不应该在代码中引用任何类型的容器或ServiceManager。

我认为PHP-DI更接近Java使用的bean注入模型(我认为它很好)。不幸的是,它仍然对我不起作用。最后,从容器中获取对象的方法也在PHP中工作.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28674410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档