【问题标题】:Separate layouts and namespaces for frontend/backend in Zend applicationZend 应用程序中前端/后端的单独布局和命名空间
【发布时间】:2011-09-20 11:24:34
【问题描述】:

我必须使用 Zend Framework 开发一个 CMS,并且我使用了在我的 boostrap 中定义的默认命名空间作为我的后端:

autoloaderNamespaces[] = "Application_"

现在我想开发前端,但我不知道怎么做,因为我可以从/public/ 目录访问我的后端。

然后我想为我的前端使用不同的布局,而不是用于后端访问的布局。所以我找到了this post,但我不知道我是否必须更改/添加(然后如何更改)我的后端模块,或者我是否必须创建第二个用于我的前端的模块

我的文件树是这样的:

那么如果我创建一个frontend 模块,我应该在application 目录旁边创建一个frontend 目录吗?

编辑:我在应用程序目录旁边创建了两个目录pubfrontend。在pub/index.php 中,我使用application/configs/application.ini 文件和不同的APPLICATION_FRONT_ENV 实例化了引导程序:

[frontprod : production]

bootstrap.path = APPLICATION_FRONT_PATH "/bootstrap.php"
bootstrap.class = "Bootstrap"
resources.frontController.controllerDirectory = APPLICATION_FRONT_PATH "/controllers"
autoloaderNamespaces[] = "Frontend_"
resources.layout.layout = "layout"
resources.layout.layoutPath = APPLICATION_FRONT_PATH "/layouts/scripts"

[frontdev: frontprod]

phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1

frontend/bootstrap.php 中,我从applicationdirectory 加载了模型:

public function _initAutoloader(){

        $baseAutoload = new Zend_Loader_Autoloader_Resource(array(
                                    'namespace' => 'Application',
                                    'basePath' => realpath(dirname(__FILE__).'/../application')
                                )
                            );

}

而且它似乎工作正常 =) 谢谢!

【问题讨论】:

    标签: model-view-controller zend-framework layout frontend backend


    【解决方案1】:

    在 Zend Framework 中,您可以在模块中组织您的应用程序,这非常适合您的需求。不幸的是,该文档没有足够强调这个概念的重要性,以及从第一天起您应该如何实施它。

    Modules 允许您将仅与该模块相关的所有内容重新组合到同一个模块文件夹下,从而将应用程序的“部分”隔离在逻辑组中。 在您的情况下,它将是“后”和“前”,但您也可以有一个“论坛”模块,或者说一个“商店”模块。

    从 urls 的角度来看,模块化结构的默认路由是 example.com/module/controller/action,但是using hostname routes 你也可以让 www.example.com 指向你的“前端”模块和管理员.example.com 指向您的后端。

    看看poor documentation section about modules,不要惊慌,如果您在“默认”模块中移动当前的控制器、视图和模型,则不必重命名所有内容。

    还有另一种替代方案非常适合后端/前端逻辑,但如果您想将代码拆分为更多逻辑部分(论坛、博客、商店......),则不适用。您只需在“应用程序”文件夹旁边创建第二个应用程序文件夹(您将命名为“前端”)和第二个公共目录(如果您使用相同的文件夹,您可以在其中符号链接您的资产文件夹)和不同的命名空间。

    为了能够在前端代码中自动加载“Application_”类,只需在前端引导程序中添加和配置Module Autoloader。代码很简单:

    //in your frontend/Bootstrap.php
    public function _initAutoloader(){
         new Zend_Loader_Autoloader_Resource( array(
                 'namespace' => 'Application_',
                 'path' => realpath(dirname(__FILE__).'/../application'
             )
         );
    }
    

    对于application.ini 配置文件,我建议不要复制它,而是创建一个[frontprod : production] 部分来覆盖后端设置(以及匹配的[frontdev: frontprod] 用于本地设置)。

    我希望这会有所帮助。关于这里介绍的所有主题有很多话要说,你应该先看看这个,然后评论这个答案,就你可能遇到的问题提出更具体的问题,我会扩展答案。

    【讨论】:

    • 非常感谢您的回答。我做了一些研究,我更喜欢你的第二个解决方案,虽然我没有找到关于实现它的太多信息,但我阅读了 Weier O'Phinney 关于模块的帖子link
    • 所以在我的pub/ 目录中的index.php 中(public/ 目录的副本)我应该包含application/models 路径以及前端特定模型,然后实例化前端@987654333 @ 并运行它的引导程序?在这种情况下,我应该使用 application/config/application.ini 还是应该创建第二个 conf 文件?
    • 是的,就是这样,但您不需要包含应用程序文件夹中的任何内容,模块自动加载器会很好地处理这个问题。我刚刚扩展了我的答案
    • 非常感谢您的帮助!
    猜你喜欢
    • 2017-07-11
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-13
    相关资源
    最近更新 更多