我有ZF2模块,同时我使用root-directory/generated-classes
中托管的Propel genereted模型。我可以让他们分享同名命名空间 - 比如Bookstore
左右吗?
从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;
}
我可以诉诸它吗?如何利用此选项?还有其他(更好的)选择吗?
答案 0 :(得分:3)
我不会将我的模型直接放在/your-application/root
中。这将是针对ZF2推荐的目录脚手架。取而代之的是,我创建了一个/FooModule/src/FooModule/Model
目录,并在模型类中使用namespace FooModule\Model
命名空间定义将所有模型放在此文件夹中。
另一个细节是;试图为同一命名空间指向两个不同的目录是绝对坏主意。这将反对PSR-4 Autoloading Standard和许多开源库&框架包括Zend Framework 2,它严重依赖于这个标准。
我会从不同的角度看问题。请问:为什么我需要将我的一个命名空间指向两个不同的目录?
我认为实际上你指的是域实体" Propel生成的模型"。如果这是正确的(我的意思是Bookstore
)是Entity而不是模型。您可能还想阅读this great answer。
因此,您可以尝试在Entity
(或其他)ZF2模块中创建Application
命名空间,并在其中的子命名空间下编写实体类。这完全有效。例如:
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是一个模块):
Bookstore\src\Entity\Book.php - namespace is Bookstore\Entity
Bookstore\src\Entity\Author.php - namespace is Bookstore\Entity
在两个示例方案中,Book.php
和Author.php
是自动生成的域实体,它们共享相同的命名空间,同时不会与ZF2或PSR-4自动加载机制发生冲突。< / p>