草庐IT

php - ZF2 弃用 : ServiceManagerAwareInterface

coder 2024-01-03 原文

今天我更新了我的项目并收到了这个警告:

Deprecated: ServiceManagerAwareInterface is deprecated and will be removed in version 3.0, along with the ServiceManagerAwareInitializer. Please update your class X to remove the implementation, and start injecting your dependencies via factory instead

我有一些实现 ServiceManagerAwareInterface 的主要 Base 类和扩展这些基类的多个类。

那么为这些类中的每一个创建额外的工厂类是一个好习惯吗?还是为每个模块使用 1 AbstractFactory 并在其中启动类更好?

使用 AbstractFactory 会影响性能吗?

在多个类中注入(inject)单个(或 2 个)共享依赖项的最佳实践是什么?

更新: 即使我接受了@AlexP 的回答,但我对提供依赖项抛出构造函数有一些担忧。想象一下这个场景:我有一个带有几个 Action 的 Controller ,以免说 ActionA 需要 ServiceZ 而 ActionB 需要 ServiceY 和 ServiceX,而 ServiceX 也依赖于 ServiceM 和 ServiceN。现在每次我调用 ActionA 时,我的 Controller 都会启动所有这些服务,但 ActionA 只需要 1 项服务,而我的 Controller 加载了 5 项服务....这是一个好习惯吗?这是正确的方法吗?这不会有糟糕的性能吗,因为在每次请求时都会启动我们在该请求期间根本不会使用的服务?

现在我允许每个服务/ Controller 处理自己的需求,并在需要时加载服务。

这样我就不必启动多个我不会使用的服务,也不需要知道服务依赖关系就可以使用它们。我知道这不被接受为最佳实践,但代码很干净,我宁愿牺牲“最佳实践”以获得更好的性能。

感谢任何人对此的投入。

最佳答案

每个服务一个工厂通常是一个理想的目标;然而,在许多情况下,当您拥有具有相似依赖关系的相似类时,为每个类创建那么多的工厂是不必要的,而且难以维护。

抽象工厂通过匹配每个它可以创建的服务来解决多工厂问题,然后使用一些自定义配置返回一个新实例。

这引入了一些问题。

  • 调用 $serviceManager->get()$serviceManager->has() 将要求抽象工厂检查它是否可以使用创建服务它的 canCreateServiceWithName() 方法;对于多个抽象工厂,这可能会增加相当大的性能开销。

  • 抽象工厂没有服务“别名”的概念;服务管理器提供的功能。该实现要求您匹配服务的 $requestedName。如果您使用完整服务名称和别名调用服务,就会出现问题。

  • 抽象工厂与 ZF2 框架紧密耦合。

框架的路线图非常注重解决这些问题,ZF3 仍然提供抽象工厂,但它也 introduces some improvements in factory design to encourage reusability你已经可以利用它了。

Note that the factory now accepts an additional required argument, $requestedName; v2 already passed this argument, but it was not specified in the interface itself. Because factories now can expect to receive the service name, they may be re-used for multiple services, largely replacing abstract factories in version 3.

因此我们已经可以多次使用标准工厂来提供类似的服务(在 ZF2 中)。

关于如何使用一个工厂创建类似服务的一个非常简单的示例。

'service_manager' => [
    'factories' => [
        'My\Service\Foo' => 'My\Factory\SharedFactory',
        'My\Service\Bar' => 'My\Factory\SharedFactory',
        'My\Service\Baz' => 'My\Factory\SharedFactory',
    ],
],

namespace My\Factory;

class SharedFactory
{
    public function __invoke($serviceLocator, $name, $requestedName)
    {
        if (! class_exists($requestedName)) {
            throw new ServiceNotCreatedException("$requestedName could not be found!");
        }

        return new $requestedName(
            $serviceLocator->get('SomeDependacy1'),
            $serviceLocator->get('SomeDependacy2')
        );
    }
}

您可以使用 $requestedName 参数轻松扩展它以加载自定义服务配置,以增加更大的灵 active 。

关于php - ZF2 弃用 : ServiceManagerAwareInterface,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36100447/

有关php - ZF2 弃用 : ServiceManagerAwareInterface的更多相关文章

  1. ruby-on-rails - 我更新了 ruby​​ gems,现在到处都收到解析树错误和弃用警告! - 2

    简而言之错误:NOTE:Gem::SourceIndex#add_specisdeprecated,useSpecification.add_spec.Itwillberemovedonorafter2011-11-01.Gem::SourceIndex#add_speccalledfrom/opt/local/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:91./opt/local/lib/ruby/gems/1.8/gems/rails-2.3.8/lib/rails/gem_dependency.rb:275:in`==':und

  2. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  3. ruby - 有没有办法让 2.4.0 中的 Ruby 弃用警告静音? - 2

    从Ruby2.4.0开始,对于使用某些已弃用的功能,会出现弃用警告。例如,Bignum、Fixnum、TRUE和FALSE都会触发弃用警告。当我修复我的代码时,有相当多的代码我希望它保持沉默,尤其是在Rails中。我该怎么做? 最佳答案 moduleKerneldefsuppress_warningsoriginal_verbosity=$VERBOSE$VERBOSE=nilresult=yield$VERBOSE=original_verbosityreturnresultendend>>X=:foo=>:foo>>X=:bar

  4. ruby-on-rails - 从 gem 生成的静音弃用警告 - 2

    我正在使用unscoped_associations我的Rails5.0.0.1应用程序中的gem。我收到这个弃用警告:DEPRECATIONWARNING:alias_method_chainisdeprecated.Please,useModule#prependinstead.Frommodule,youcanaccesstheoriginalmethodusingsuper.(calledfromat/home/rhl/myapp/config/application.rb:8)DEPRECATIONWARNING:alias_method_chainisdeprecated.

  5. ruby-on-rails - Rails group_by 是否已弃用? - 2

    我有一个要分组的数组,“group_by”函数似乎适合我的情况。http://apidock.com/rails/Enumerable/group_by我在Rails3.2.13中使用它。grouped_array=my_array.group_by(&:my_function)#Assumerun'my_function'haveresult1onelement1,element3andresult2onelement2,element4,then:#grouped_array={#result1=>[element1,element3],#result2=>[element2,el

  6. ruby-on-rails - Rails 还是 Sinatra? PHP程序员入门学习哪个好? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我使用PHP的时间太长了,对它感到厌倦了。我也想学习一门新语言。我一直在使用Ruby并且喜欢它。我必须在Rails和Sinatra之间做出选择,那么您会推荐哪一个?Sinatra真的不能用来构建复杂的应用程序,它只能用于简单的应用程序吗?

  7. ruby-on-rails - 验证事件连接!在 Rails 4 中已弃用,我们应该如何处理该功能? - 2

    我一直在关注这篇文章以与工头一起设置puma:https://www.digitalocean.com/community/articles/how-to-set-up-zero-downtime-rails-deploys-using-puma-and-foremanpuma脚本在连接后告诉verify_active_connections!但它在rails4中不可用。注释掉方法调用将使脚本运行但我不确定这是否会泄漏资源.关于这个问题,我能看到的唯一文档是:https://github.com/socialcast/resque-ensure-connected/issues/3但是

  8. ruby - 带 compass 的 ruby 弃用警告 - 2

    当我尝试像往常一样在项目上运行“bundleexeccompasswatch”时,我现在收到此警告:DEPRECATIONWARNINGonline87of/home/hedy/Sites/mywebsite.fr/src/vendor/bundle/ruby/2.3.0/gems/compass-core-1.0.3/stylesheets/compass/css3/_deprecated-support.scss:#{}interpolationnearoperatorswillbesimplifiedinafutureversionofSass.Topreservethecurr

  9. ruby-on-rails - PHP 魔术方法 __call、__get 和 __set 的 Ruby 等价物 - 2

    我很确定Ruby有这些(等同于__call、__get和__set),否则find_by将如何在Rails中工作?也许有人可以举一个简单的例子来说明如何定义与find_by相同的方法?谢谢 最佳答案 简而言之你可以映射__调用带有参数的method_missing调用__设置为方法名称以'='结尾的method_missing调用__获取不带任何参数的method_missing调用__调用PHPclassMethodTest{publicfunction__call($name,$arguments){echo"Callingob

  10. ruby - Lisp - 是否适合网络编程/应用程序(交互式)? ruby 的方式是? php的方式是? - 2

    Lisp是否适合Web编程/应用程序(交互式),就像ruby​​和php一样?需要考虑的事情是:易于使用可部署性难度(尤其是对于编程初学者而言)(编辑)在阅读PaulGraham'sessay之后,我特别提到了CommonLisp.将是我的第一门编程语言。在这方面。这样做合适吗?我听说Clojure的宏功能不如CommonLisp的强大,这就是我尝试学习Clojure的原因。它教授编程并且非常强大。 最佳答案 Lisp是一个语系,而不是单一的语言。为了稍微回答您的问题,是的,存在用于各种Lisp方言的Web框架,例如用于Common

随机推荐