Zend framework2 ZF 2.4-控制器-init()的替代方案?

Zend framework2 ZF 2.4-控制器-init()的替代方案?,zend-framework2,Zend Framework2,我在控制器中的所有action()上都有这两行代码,所以我想把它移到init(),这样每次都会调用它。它不起作用,所以我尝试了_构造,但它不起作用,因为它说“PHP致命错误:未捕获错误:调用null上的成员函数get()” 也许这可以在工厂中完成,而您仍然在工厂类中调用getServiceLocator?若我能在控制器内完成,那个将会更好,因为这是一个更少的步骤,那个么在控制器内完成是否可能,所以每个动作都会有那个么多 $view_helper = $this->getServic

我在控制器中的所有action()上都有这两行代码,所以我想把它移到init(),这样每次都会调用它。它不起作用,所以我尝试了_构造,但它不起作用,因为它说“PHP致命错误:未捕获错误:调用null上的成员函数get()”

也许这可以在工厂中完成,而您仍然在工厂类中调用getServiceLocator?若我能在控制器内完成,那个将会更好,因为这是一个更少的步骤,那个么在控制器内完成是否可能,所以每个动作都会有那个么多

    $view_helper = $this->getServiceLocator()->get('viewhelpermanager');
    $view_helper->get('headScript')->appendFile(....);

只有两种解决方案:

  • 您可以创建一个抽象控制器,并在构造函数中使用
    viewhelpermanager
    作为依赖项。这意味着您需要在所有子类工厂中传递
    viewhelpermanager
    ,并且在创建对象时不要忘记调用父构造等等

  • 您可以在服务管理器中使用一个委托器和一个包含
    setViewHelperManager
    方法和
    viewhelpermanager
    (或者最糟糕的是,一个trait:)以及一个viewHelperManagerAreInterface和一个初始值设定项)的抽象控制器,并执行“软依赖”,但从维护的角度来看,这是一种错误的方法(代码可读性)


  • 为什么不编写自己的view helper并使其包含js文件。然后可以在需要这些文件的所有view.phtml文件中使用它。如果需要更改/添加/删除js文件,只需在view helper中执行此操作,显然,此更改将反映在所有使用它的视图中

    这会使视图内容远离控制器


    希望这能有所帮助。

    那么,为什么您要从控制器中而不是从布局或其他视图文件中添加headscript文件。在添加文件之前,需要检查一些内容,创建一个viewHelper,帮助您保持视图干净整洁?因为我有许多控制器,每个控制器都有任何操作。我有js文件,并非所有控制器都需要,因此不应该将其放在布局中。然后,我有许多操作使用相同的js文件。如果我需要更改一个js文件,那么我可以在一个位置更改它,而不是在多个视图文件中更改它,这会更好。我正在寻找一个解决方案,我可以按照我所说的做,而不是将相同的js文件放在在不同的视图上重复。如果我需要指向不同的js文件,这将需要时间。在这种情况下,请继续执行您在问题中提出的建议。并将该文件注入ControllerFactory。ViewHelper是一个容器实例,因此它应该是可能的,但您可能需要检查是否要附加或使用偏移量,如果它有任何其他依赖项,例如jQuery。不确定布局中的文件基本上是首先加载的,还是您的文件将是第一个文件。但简单的尝试和错误即可。注意:如果您想要整个模块,也可以在模块的引导中执行此操作。