Zend Framework 2:传递给Album \ Controller \ AlbumController :: __ construct()的参数1必须是Album \ Controller \ AlbumTable的实例

问题描述 投票:2回答:1

我得到一个错误;

Argument 1 passed to Album\Controller\AlbumController::__construct() must be an instance of Album\Controller\AlbumTable, instance of Album\Model\AlbumTable given,, called in /var/www/html/zf/module/Album/src/Module.php on line 43

我的Module.php是;

<?php
  namespace Album;

  use Zend\ModuleManager\Feature\ConfigProviderInterface;
  use Zend\Db\Adapter\AdapterInterface;
  use Zend\Db\ResultSet\ResultSet;
  use Zend\Mvc\ModuleRouteListener;
  use Zend\Mvc\MvcEvent;
  use Zend\Db\TableGateway\TableGateway;

class Module implements ConfigProviderInterface
{
public function getConfig()
{
    return include __DIR__ . '/../config/module.config.php';
}

// Add this method:
public function getServiceConfig()
{
    return [
        'factories' => [
            Model\AlbumTable::class => function($container) {
                $tableGateway = $container->get(Model\AlbumTableGateway::class);
                return new Model\AlbumTable($tableGateway);
            },
            Model\AlbumTableGateway::class => function ($container) {
                $dbAdapter = $container->get(AdapterInterface::class);
                $resultSetPrototype = new ResultSet();
                $resultSetPrototype->setArrayObjectPrototype(new Model\Album());
                return new TableGateway('album', $dbAdapter, null, $resultSetPrototype);
            },
        ],
    ];
}

public function getControllerConfig()
{
   return [
           'factories' => [
           Controller\AlbumController::class => function($container) {
                 return new Controller\AlbumController(
                     $container->get(Model\AlbumTable::class)
                 );
             },
          ],
      ];
   }
}

我的AlbumController就像;

<?php
namespace Album\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

use Album\Model;

class AlbumController extends AbstractActionController
{
// Add this property:
private $table;

// Add this constructor:
public function __construct(AlbumTable $table)
{
    $this->table = $table;
}

public function indexAction()
{
  return new ViewModel([
        'albums' => $this->table->fetchAll(),
    ]);
}

public function addAction()
{
}

public function editAction()
{
}

public function deleteAction()
{
}
}

你能告诉我我做错了什么吗?我是Zend Framework的新手。这是我试图运行的教程应用程序。我遵循了所有步骤,但是有很多问题,我逐一解决了所有问题,现在我被困在这里。

php zend-framework
1个回答
2
投票

你正在使用非法依赖,可以这么说

// Here you are returning Model\AlbumTable object
// while your Controller\AlbumController needs a Controller\AlbumTable instance
return new Controller\AlbumController(
    $container->get(Model\AlbumTable::class)
);

所以解决这个问题:

return new Controller\AlbumController(
    $container->get(Controller\AlbumTable::class)
);

如果您需要使用Model \ AlbumTable作为依赖项,那么您需要在控制器中设置它,如下所示:

use Model\AlbumTable as AlbumTableModel;

...
...

public function __construct(AlbumTableModel $table)
{
    $this->table = $table;
}
© www.soinside.com 2019 - 2024. All rights reserved.