什么是Zend Framework 2模块的正确或首选目录结构?

8
我希望通过在一个小项目中使用Zend Framework 2来掌握它。我已经阅读了各种博客文章、文档,当然还有Akrabat(Rob Allen)的绝妙教程。
然而,在我所有的阅读中,我没有找到任何关于Zend Framework 2期望的模块的正确或首选目录结构的解释。
Akrabat教程中,Rob Allen的示例模块使用单个模型和控制器。他选择的目录结构是:
/module
    /Album
        /config
        /src
            /Album
                /Controller
                /Form
                /Model
        /view
            /album
                /album

这一切都很好,但是如果一个模块有多个控制器和模型,就像在具有多个页面/部分的站点中所期望的那样,我应该把所有控制器放在/src/Album/Controller目录下,还是为每个附加模型和相关控制器和视图创建另一组/src/xxx/目录?
在/view目录中,我是否要将其分成子目录,用于各种控制器使用的每个视图集合?
我认为我困惑的原因在于,在Rob的示例中,他的主控制器/模型与模块名称相同。因此,他的Album模块有一个目录,并且有更多的Album目录,用于模型、控制器和视图。如果我将他的模块从Album重命名为,例如,MyModule,那么目录结构会变成什么样子?
/module
    /MyModule
        /config
        /src
            /Album
                /Controller
                /Form
                /Model
        /view
            /MyModule
                /album

那么,是否应该添加一个名为“Artist”的模型以及相关的控制器呢?其组织方式如下:
/module
    /MyModule
        /config
        /src
            /Album
                /Controller
                /Form
                /Model
            /Artist
                /Controller
                /Form
                /Model
        /view
            /MyModule
                /album
                /artist

如果不是上述情况,那么它将是什么结构?当然,这一切都是基于ZF2期望严格的结构。如果不是这种情况,那么显然我可以根据自己的意愿进行组织。
1个回答

15

快速回答你的最后一个问题 - ZF2确实不在意目录结构。或者更准确地说 - 它没有预定义的结构。这就是它具有自动加载器配置和类映射的原因(取决于您选择使用哪种方法)。

“默认”自动加载器(请参见Module.php),您可以在大多数示例中找到,只假定您的ModuleName类将在./src/ModuleName目录中找到:

// ./modules/ModuleName/Module.php
public function getAutoloaderConfig()
{
    return array(
        'Zend\Loader\StandardAutoloader' => array(
            'namespaces' => array(
                __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
            ),
        ),
    );
}

我假设你知道那些__NAMESPACE__部分的含义。

所以,如果你有一个名为Cat的模块,那么它的类应该被找到在./modules/Cat/src/Cat中。

如果你想要添加一些新功能到你的应用程序中,你可以添加另一个名为Dog的模块,并将其类文件放在./Dog/src/Dog中。

然而,这并不意味着你一定要这样做。你也可以把所有与动物相关的类都放在一个名为Animals的模块中。你需要修改自动加载器的内容如下:

// ./modules/Animals/Module.php
public function getAutoloaderConfig()
{
    return array(
        'Zend\Loader\StandardAutoloader' => array(
            'namespaces' => array(
                'Cat' => __DIR__ . '/src/Cat',
                'Dog' => __DIR__ . '/src/Dog',
            ),
        ),
    );
}

...将你的类放在文件中,例如 ./modules/Animal/src/Cat/Persian.php./modules/Animal/src/Dog/Collie.php

不过,我建议将模块视为各自独立的实体,不了解其他模块的任何特定信息。以“现实生活”为例,我有一个具有前端(html、css等)和API功能的应用程序。

我有3个模块:

  • Application - 包含数据库配置、数据库表类、映射器、模型、身份验证类等,基本上是任何其他模块可能需要的所有内容。
  • Api - 其中包含控制器,期望以特定格式接收请求并输出为JSON(即不需要视图)。该模块中的类使用来自Application模块的类,因为我仍然需要所有的数据库功能,但将其全部分离给我带来了应用程序逻辑与API逻辑的分离。如果我想要删除此模块,则不会影响任何其他模块。
  • Website - 仅负责呈现页面的模块。同样,它使用Application中的类,因为我希望能够从数据库中呈现数据并让用户编辑它,但我不希望这个功能仅在此模块中,因为API也需要它。

我的./config/application.config.php按照以下顺序加载它们:

return array(
    'modules' => array(
        'Application',
        'Api',
        'Website',
    ),
    // all other entries
);

这意味着我可以从所有其他模块访问应用程序类。如果我想出于某种原因禁用我的API,我只需删除Api目录,我的前端仍将正常工作。

希望这有所帮助! :)

总之,你可以按任何方式组织文件,只要不要忘记正确配置自动加载器即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接