如何在控制器类中使用服务类?

时间:2011-12-09 02:23:35

标签: php oop zend-framework class zend-framework-mvc

我正在尝试将this amazing calendar集成到我的项目中。我遇到服务问题。我正在使用这种结构:

application/
    modules/
        agenda/
            controllers/
                CalendarController.php
            models/
            services/
                CalendarService.php
            views/
                filters/
                helpers/
                scripts/
                calendar/
                    view-calendar.php
    module2/
    module3/

我以这种方式在我的application.ini中路由它:

resources.router.routes.agenda.route = /apps/agenda/
resources.router.routes.agenda.defaults.module = agenda
resources.router.routes.agenda.defaults.controller = calendar
resources.router.routes.agenda.defaults.action = view

我指着我的浏览器,我收到了这条消息:

Message: Invalid controller class ("Agenda_CalendarController") 

我用我的Agenda_后缀修复了它并刷新了我的浏览器。获得了这个:

Message: Controller "Agenda_CalendarController" is not an instance of Zend_Controller_Action_Interface

所以我用“extends Zend_Controller_Action”实例化它。获得了这个: - )

Fatal error: Class 'Service_Calendar' not found in /home/[PATH TO MY APP FOLDER]/application/modules/agenda/controllers/CalendarController.php on line 30

我无法弄清楚出了什么问题。有人给我一两个暗示: - )

注意:我不知道这是否意味着什么,但是我使用NetBeans,如果我在控制器类中悬停类的服务方法时按CTRL;相关的弹出信息是正确的。

解决方案: 谢谢你们,你们给了我更进一步的道路。我的模块bootstraping设置不正确。根据你的提示,我从Bob Allen那里找到了这篇文章,他描述了同样的问题。

当你知道你在寻找什么......: - )

谢谢,我的问题已修复,我知道了一点!

1 个答案:

答案 0 :(得分:1)

对于模型/服务/视图等,控制器的命名约定是不一样的,因为您不需要像控制器那样在文件名中添加类型。它们必须遵循基本的自动加载名称到路径架构。

因此,您服务的声明为:Agenda_Service_CalendarService,因为它映射到modules/agenda/services/CalendarService.php(请注意变形 - 从services文件夹到_Service_单数 - 那是ZF的工作,它也适用于模型。)

还要确保已正确初始化模块(具有自己的Bootstrap.php文件,在application.ini中设置)。

PS:NetBeans知道你的类在哪里,因为它扫描文件并查看声明,而不是该类的逻辑包含。