创建工厂类?

时间:2018-10-04 00:31:59

标签: php model-view-controller zend-framework2

我找到了以下代码段:

class WebsitesTableFactory extends AbstractModelFactory
{
    public function __invoke(ContainerInterface $container)
    {
        $dbAdapter = $container->get('bc_db');
        $tableGateway = $this->initializeTableGateway('websites', $dbAdapter, null, $container->get(Websites::class));
        return new WebsitesTable($tableGateway);
    }
}

我已经习惯了:

  • 实现FactoryInterface而不是扩展AbstractModelFactory
  • 使用ServiceLocatorInterface作为createService函数的参数

这与该实现有何不同?

::class是什么意思?

Zend版本为2.5。

1 个答案:

答案 0 :(得分:1)

PHP Class Constants

::class返回FQCN(完全合格的类名),例如“ \ Namespace \ Path \ To \ Classname”。


ZF2-3工厂

在准备ZF3时,通常使用__invoke(ContainerInterface $container)代替createService(ServiceLocatorInterface $serviceManager)

它曾经被用作您习惯的默认工厂,而被另一个实现了另一个接口的工厂取代,尽管为ZF2到ZF3的过渡留有空间。

ZF3中的标准Factory类如下:

use Zend\ServiceManager\Factory\FactoryInterface;

class DemoFactory implements FactoryInterface
{
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
    {
        // Do your thing
    }
}

注意:与ZF2中不同的FactoryInterface使用声明!


升级所有内容

很显然,您仍在使用ZF2。我强烈建议您升级(或开始升级)到ZF3。您可以read the migration guide,但我建议您一次完成所有更新。

我的建议可能会导致您花费大量精力(可能取决于应用程序的大小),但是所有内容都是最新的。

我建议进入您的composer.json并删除所有版本限制,然后使用composer update将所有内容更新为最新版本。然后从那里去,由于过时的内容,您将遇到无尽的错误要修复。

(由于某些原因,某些软件包可能无法升级,请注意,如果您遵循上述建议,它们可能会导致意外的版本限制)。


您可能需要帮助

另一方面,您不知道关于::class返回FQCN的信息,这是非常基本和使用的标准,并且已经使用了很长时间(自PHP 5.6(发布{{3 }})(如果有记忆)。因此,以上内容可能会让人不知所措,建议您向同事或在Zend Framework开发方面有更多经验的人寻求帮助。