标签: zend-framework3

如何在ZF2/ZF3 url视图助手中添加查询参数

我正在尝试使用路由创建带有查询字符串的URL,如下所示:

$this->url('users') -> /users
$this->url('users', ['sort' => 'desc']) -> /users?sort=desc
Run Code Online (Sandbox Code Playgroud)

然而,这似乎不起作用(第二个助手实际输出/users).根据这个非官方的,过时的文档,曾经有一种方法可以通过附加/query到路由名称来实现,但是这会给出一个路由未找到的异常.

可以使用当前的url帮助程序完成吗?

php zend-framework2 zend-framework-routing zend-framework3

21
推荐指数
3
解决办法
3万
查看次数

如何在PHPUnit和ZF3中减少测试中的数据库连接数?

我正在使用.编写Zend Framework 3应用程序的集成/数据库测试

  • zendframework/zend-test 3.1.0,
  • phpunit/phpunit 6.2.2,和
  • PHPUnit的/ DbUnit的 3.0.0

我的测试由于失败而失败

Connect Error: SQLSTATE[HY000] [1040] Too many connections
Run Code Online (Sandbox Code Playgroud)

我设置了一些断点并查看了数据库:

SHOW STATUS WHERE `variable_name` = 'Threads_connected';
Run Code Online (Sandbox Code Playgroud)

我实际上已经看到了100打开的连接.

我通过断开连接来减少它们tearDown():

protected function tearDown()
{
    parent::tearDown();
    if ($this->dbAdapter && $this->dbAdapter instanceof Adapter) {
        $this->dbAdapter->getDriver()->getConnection()->disconnect();
    }
}
Run Code Online (Sandbox Code Playgroud)

但我仍然有过度80开放的联系.

如何将测试中的数据库连接数减少到可能的最小值?


更多信息

(1)我有很多测试,其中我dispatch是一个URI.每个此类请求都会导致至少一个数据库请求,从而导致新的数据库连接.这些连接似乎没有关闭.这可能会导致最多的连接.(但是我还没有找到一种方法让应用程序在处理请求后关闭连接.)

(2)其中一个问题可能是我对数据库的测试:

protected function retrieveActualData($table, $idColumn, $idValue)
{
    $sql = new Sql($this->dbAdapter);
    $select = $sql->select($table);
    $select->where([$table . '.' . $idColumn . ' = ?' => …
Run Code Online (Sandbox Code Playgroud)

php phpunit pdo unit-testing zend-framework3

16
推荐指数
1
解决办法
870
查看次数

Doctrine2更新导致Zend Framework 3中的AnnotationRegistry registerLoader错误

我正在使用基于Zend Framework 3.0的CMS来管理带有Doctrine的DB I. 使用composer管理包时我的问题是什么?最近,我将所有软件包更新到最新版本并将其发送到服务器,其他文件中没有更改.更新后,我的网站显示以下错误:

致命错误:未捕获TypeError:Doctrine\Common\Annotations\AnnotationRegistry :: registerLoader()的返回值必须是Doctrine\Common\Annotations\void的实例,无法在/ home/platne/serwer18346/vendor/doctrine/annotations /中返回lib/Doctrine/Common/Annotations/AnnotationRegistry.php:117堆栈跟踪:#0 /home/platne/serwer18346/vendor/doctrine/doctrine-module/src/DoctrineModule/Module.php(57):Doctrine\Common\Annotations\AnnotationRegistry :: registerLoader(Object(Closure))#1 /home/platne/serwer18346/vendor/zendframework/zend-modulemanager/src/Listener/InitTrigger.php(33):DoctrineModule\Module-> init(Object(Zend\ModuleManager)\ModuleManager))#2 /home/platne/serwer18346/vendor/zendframework/zend-eventmanager/src/EventManager.php(322):Zend\ModuleManager\Listener\InitTrigger - > __ invoke(Object(Zend\ModuleManager\ModuleEvent)) #3 /home/platne/serwer18346/vendor/zendframework/zend-eventmanager/src/EventManager.php(171):Zend\EventManager\EventManager-> triggerListeners(Object(Zend\M)oduleManager\ModuleEvent))#4/home/p in /home/platne/serwer18346/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationRegistry.php on 117

如果需要,有些应用程序的代码:
模块:

return [
    'Zend\Router',
    'Zend\Validator',
    'DoctrineModule',
    'DoctrineORMModule',
    'Core',
];
Run Code Online (Sandbox Code Playgroud)

development.local(开发者模式处于活动状态):

'doctrine' => [
        'connection' => [
            'orm_default' => [
                'driverClass' => Doctrine\DBAL\Driver\PDOMySql\Driver::class,
                'params' => [
                    'host' => '******',
                    'user' => '*******',
                    'password' => '******',
                    'dbname' => '*******',
                    'charset' => 'utf8'
                ]
            ]
        ]
    ]
Run Code Online (Sandbox Code Playgroud)

module.config:

'doctrine' => [
        'driver' => [
            __NAMESPACE__ …
Run Code Online (Sandbox Code Playgroud)

php zend-framework doctrine-orm zend-framework3

12
推荐指数
3
解决办法
2万
查看次数

不推荐使用:在功能系统中检索服务定位器 - ZF2

我正在开发一个ZF2系统并且它工作得非常好,但是在我在其他计算机中克隆存储库之后,这个已弃用的错误已经出现:

您正在从Module\Controller\Controller类中检索服务定位器.请注意,ServiceLocatorAwareInterface已弃用,将在3.0版中与ServiceLocatorAwareInitializer一起删除.您需要更新您的类以在创建时接受所有依赖项,通过构造函数参数或setter,并使用工厂执行注入.在第258行的/home/path/project/vendor/zendframework/zend-mvc/src/Controller/AbstractController.php中

composer.json:

"require": {
    "php": ">=5.5",
    "ext-curl": "*",
    "ext-json": "*",
    "ext-mbstring": "*",
    "zendframework/zendframework": "~2.5",
    "doctrine/doctrine-orm-module": "0.*",
    "hounddog/doctrine-data-fixture-module": "0.0.*",
    "imagine/Imagine": "~0.5.0"
Run Code Online (Sandbox Code Playgroud)

我在控制器中检索服务时出现错误(扩展Zend\Mvc\Controller\AbstractActionController):

$this->getServiceLocator()->get("Module\Service\Service");
Run Code Online (Sandbox Code Playgroud)

在Zend\Mvc\Controller\AbstractController的Zend核心中是这样的:

public function getServiceLocator()
{
    trigger_error(sprintf(
        'You are retrieving the service locator from within the class %s. Please be aware that '
        . 'ServiceLocatorAwareInterface is deprecated and will be removed in version 3.0, along '
        . 'with the ServiceLocatorAwareInitializer. You will need to update your class to accept '
        . 'all dependencies at creation, either via constructor …
Run Code Online (Sandbox Code Playgroud)

php zend-framework deprecated zend-framework2 zend-framework3

9
推荐指数
1
解决办法
4364
查看次数

如何将Zend Framework 1迁移到3

有没有人请描述Zend从Ver 1到3更改了多少架构.最近zend发布了ZF3,但没有提供如何从zf1迁移到zf3的信息.我有一个应用程序是在zf1中开发的,现在正在寻找将它升级为使用带有ZF3的PHP 7电源.我是否需要重写整个代码或需要多少努力才能转移到最新版本.

此外,ZF3声称它在PHP7下的速度提高了4倍.实际上它是PHP7本身更快,而不是ZF3.与Laravel框架相比,我不确定它们有多少改进,而Laravel框架是过去几年的顶级框架之一.

如果有人使用ZF3请分享他们的经验.

php zend-framework php-7 zend-framework3 zf3

9
推荐指数
2
解决办法
6227
查看次数

Dispatch错误事件未连接到AbstractController上的共享事件

我的错误页面未按计划运行.我有一个事件,我在我Application Module的内部使用onBootstrap处理填充我的设计资产的方法创建.它适用于除路由不匹配的页面之外的所有页面我认为它是因为当发生调度错误事件时它会执行除共享事件管理器附加的事件之外的所有事件Zend\Mvc\Controller\AbstractController

以下是我的设计活动的事件附件代码:

  public function attach(EventManagerInterface $events,$priority=10) {
      $events->getSharedManager()->attach('Zend\Mvc\Controller\AbstractController',
          MvcEvent::EVENT_DISPATCH,[$this,'initiateAssets'],1000);
      $events->getSharedManager()->attach('Zend\Mvc\Controller\AbstractController',
          MvcEvent::EVENT_DISPATCH,[$this,'changeLayout'],30);
      $events->getSharedManager()->attach('Zend\Mvc\Controller\AbstractController',
          MvcEvent::EVENT_DISPATCH,[$this,'loadJsAssets'],30);
      $events->getSharedManager()->attach('Zend\Mvc\Controller\AbstractController',
          MvcEvent::EVENT_DISPATCH,[$this,'loadCssAssets'],30);
      $events->getSharedManager()->attach('Zend\Mvc\Controller\AbstractController',
          MvcEvent::EVENT_DISPATCH,[$this,'loadMetatagAssets'],30);
      $events->getSharedManager()->attach('Zend\Mvc\Controller\AbstractController',
          MvcEvent::EVENT_DISPATCH,[$this,'setupNavigation'],30);
  }
Run Code Online (Sandbox Code Playgroud)

Application Module Bootstrap Function当路线不匹配时,这是我在for 内的事件附件.

      $eventManager->attach(
          \Zend\Mvc\MvcEvent::EVENT_DISPATCH_ERROR,
          function ($e) {
              $application    = $e->getApplication();
              $serviceLocator = $application->getServiceManager();
              $match          = $application->getMvcEvent()->getRouteMatch();
              if (null === $match) {
                  $uri = $e->getRequest()->getUri();
                  $params     = [
                      '__NAMESPACE__' => 'Application\Controller',
                      'controller'    => 'Application\Controller\IndexController',
                      'action'        => 'not-found',
                      'locale'        => 'en_US'
                      // Here you can add common params for your …
Run Code Online (Sandbox Code Playgroud)

events zend-framework zend-framework3

9
推荐指数
1
解决办法
105
查看次数

ZF3中的ServiceManager

我知道这已经在其他线程中得到了广泛的介绍,但是我很难弄清楚如何从ZF3控件中的ZF2控制器复制$ this-> getServiceLocator()的效果.

我尝试使用我在这里和其他地方找到的各种其他答案和教程来创建一个工厂,但最终却陷入了混乱,所以我粘贴了我的代码,就像我开始希望那样有人可以指出我正确的方向吗?

来自/module/Application/config/module.config.php

'controllers' => [
    'factories' => [
        Controller\IndexController::class => InvokableFactory::class,
    ],
],
Run Code Online (Sandbox Code Playgroud)

来自/module/Application/src/Controller/IndexController.php

public function __construct() {
    $this->objectManager = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager');
    $this->trust = new Trust;
}
Run Code Online (Sandbox Code Playgroud)

php zend-framework-mvc zend-framework3 zend-servicemanager

7
推荐指数
1
解决办法
4425
查看次数

ZF2不推荐使用:ServiceManagerAwareInterface

今天我更新了我的项目,我得到了这个警告:

不推荐使用:ServiceManagerAwareInterface已弃用,将在3.0版中与ServiceManagerAwareInitializer一起删除.请更新您的类X以删除实现,并开始通过工厂注入您的依赖项

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

那么为每个类创建额外的工厂类是一个好习惯吗?或者最好为每个模块使用1个AbstractFactory并在那里启动类?

使用AbstractFactory影响性能的剂量?

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

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

现在我允许每个服务/控制器利用其自身的需求和负载护理服务时,它需要它们.

这样我就不必启动我不会使用的多个服务,而且我不需要知道服务依赖项来使用它们.我知道这不是最佳实践,但代码很干净,我宁愿牺牲"最佳实践"来获得更好的表现.

感谢任何人对此的意见.

php dependency-injection zend-framework2 zend-framework3

6
推荐指数
1
解决办法
579
查看次数

Zend3中的控制台路由不匹配

我的module.config.php文件中有一个控制台路由

'console' => [
        'router' => [
            'routes' => [
                'remove' => [
                    'type'    => 'simple',
                    'options' => [
                        'route'    => 'remove [force] [init]',
                        'defaults' => [
                            'controller' => Controller\CliController::class,
                            'action'     => 'remove',
                        ],
                    ],
                ]
            ]
        ]
    ]
Run Code Online (Sandbox Code Playgroud)

我的控制器有方法removeAction()

namespace Controller;

class CliController extends AbstractActionController
{
    public function removeAction()
    {
        $this->logger->debug('I am in');
    }
}
Run Code Online (Sandbox Code Playgroud)

当我做命令php public/index.php remove forcephp public/index.php remove 我永远不会被发送到控制器,没有错误或任何输出.那我在做错配对吗?

这就像app没有意识到它是从终端调用的.有时它只是返回,html如果我getConfigModule.php我的内部删除方法module/MyModulefolder.

php zend-framework zend-framework3

5
推荐指数
1
解决办法
507
查看次数

Zend 框架 3 会话不起作用

我正在尝试设置一个 Zend 框架 3 MVC Web 应用程序来使用会话存储。根据本网站的信息——

https://olegkrivtsov.github.io/using-zend-framework-3-book/html/en/Working_with_Sessions/PHP_Sessions.html

这一切都很好。我在我的控制器中获得了会话变量,我可以将数据保存到会话容器中。问题是,我保存到容器的数据在后续调用中不存在。我正在从一个页面保存搜索条件并重定向到第二个页面以进行搜索并返回结果。当我进入第二页时,会话数据不存在。

在 config\global.php 我有——

return [
    'session_config' => [
        // Cookie expires in 1 hour
        'cookie_lifetime' => 60*60*1,
        // Stored on server for 30 days
        'gc_maxlifetime' => 60*60*24*30,
        ],
    'session_manager' => [
        'validators' => [
            RemoteAddr::class,
            HttpUserAgent::class,
            ],
        ],
    'session_storage' => [
        'type' => SessionArrayStorage::class,
    ],
];
Run Code Online (Sandbox Code Playgroud)

在 application\module.php 我修改了 onBoostrap

public function onBootstrap(MvcEvent $event)
{
    $application = $event->getApplication();
    $svcMgr = $application->getServiceManager();

    //  Instantiate the session manager and
    //  make it the …
Run Code Online (Sandbox Code Playgroud)

php session zend-framework zend-framework3

5
推荐指数
1
解决办法
3068
查看次数