2014-09-12 37 views
2

我有ZF2模块,同时我使用root-directory/generated-classes托管的Propel生成模型。我可以让它们共享同名的命名空间 - 比如Bookstore左右吗?在Zend Framework 2中对同一个命名空间使用两个不同的目录 - howto?

Zend\Loader\StandardAutoloader我看到:

public function registerNamespace($namespace, $directory) 
{ 
    $namespace = rtrim($namespace, self::NS_SEPARATOR) . self::NS_SEPARATOR; 
    $this->namespaces[$namespace] = $this->normalizeDirectory($directory); 
    return $this; 
} 

,所以如果我在Module.php提供两个目录,最后将占上风。

还有:

public function setFallbackAutoloader($flag) 
{ 
    $this->fallbackAutoloaderFlag = (bool) $flag; 
    return $this; 
} 

我可以求助于它,我该如何利用这个选项?任何其他(更好)的选择?

回答

3

我不会把我的模型直接放在/your-application/root。这将违背ZF2推荐的目录脚手架。取而代之的是,我会创建一个/FooModule/src/FooModule/Model目录,并使用模型类中的namespace FooModule\Model名称空间定义将所有模型放入此文件夹中。

另一个细节是;试图将两个不同的目录指向相同的命名空间是绝对不好的主意。这将违反PSR-4 Autoloading Standard和许多开源库&框架,包括严重依赖于此标准的Zend Framework 2。

我会从不同的角度来看问题。请问:为什么我需要将我的一个命名空间指向两个不同的目录?

我觉得其实你的意思是域名实体作者:“Propel generated models”。如果这是正确的(我的意思是Bookstore)是Entity而不是模型。您也可以阅读this great answer。因此,您可以尝试在Application(或其他)ZF2模块中创建一个Entity名称空间,并将您的实体类写入其中的子名称空间下。这是完全有效的。例如:

Application\src\Entity\Bookstore.php - namespace is Application\Entity 
Application\src\Entity\Book.php - namespace is Application\Entity 
Application\src\Entity\Author.php - namespace is Application\Entity 

或者,这也是有效的情景太(书店是一个模块):

Bookstore\src\Entity\Book.php - namespace is Bookstore\Entity 
Bookstore\src\Entity\Author.php - namespace is Bookstore\Entity 

在这两个示例场景,Book.phpAuthor.php是你自动生成域实体他们共享相同的命名空间,而不会冲突ZF2或PSR-4自动加载机制。

+0

**日Thnx!** 我使用的Propel针对极少数的时间,所以没有找到任何配置选项改变目的地文件夹输出之后,我决定这样的“符号链接”生成的类到ZF2目录脚手架通过自动加载“黑魔法”。到目前为止,这是错误的。幸运的是,有令人敬畏的'[--output-dir =“...”]'选项支持命令行'propel model:build' – iVenGO 2014-09-15 11:22:23

+0

顺便说一句,ZF2支持一个模块的多个命名空间,因此 - 应该不是应用程序/src/**Application**/Entity/Book.php和Bookstore/src/**书店**/Entity/Book.php分别? – iVenGO 2014-09-15 11:27:17

相关问题