在Zend Framework 2中为同一命名空间使用两个不同的目录 - howto?

时间:2014-09-12 20:39:44

标签: php namespaces zend-framework2 propel autoload

我有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;
}

我可以诉诸它吗?如何利用此选项?还有其他(更好的)选择吗?

1 个答案:

答案 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.phpAuthor.php自动生成的域实体,它们共享相同的命名空间,同时不会与ZF2或PSR-4自动加载机制发生冲突。< / p>