2017-07-18 31 views
0

我刚刚通过文档安装了该项目;和我收到此错误:可捕捉的致命错误:传递给Album Controller AlbumController :: __ construct()的参数1必须是Album Model AlbumTable的一个实例,没有给出

错误

Catchable fatal error: Argument 1 passed to Album\Controller\AlbumController::__construct() must be an instance of Album\Model\AlbumTable, none given, called in C:\wamp64\www\myalbums\vendor\zendframework\zend-servicemanager\src\Factory\InvokableFactory.php on line 30 and defined in C:\wamp64\www\myalbums\module\Album\src\Controller\AlbumController.php on line 15

module.config.php

<?php 
namespace Album; 

use Zend\Router\Http\Segment; 
use Zend\ServiceManager\Factory\InvokableFactory; 

return [ 
    'controllers' => [ 
     'factories' => [ 
      Controller\AlbumController::class => InvokableFactory::class, 
     ], 
    ], 


    // The following section is new and should be added to your file: 
    'router' => [ 
     'routes' => [ 
      'album' => [ 
       'type' => Segment::class, 
       'options' => [ 
        'route' => '/album[/:action[/:id]]', 
        'constraints' => [ 
         'action' => '[a-zA-Z][a-zA-Z0-9_-]*', 
         'id'  => '[0-9]+', 
        ], 
        'defaults' => [ 
         'controller' => Controller\AlbumController::class, 
         'action'  => 'index', 
        ], 
       ], 
      ], 
     ], 
    ], 

    'view_manager' => [ 
     'template_path_stack' => [ 
      'album' => __DIR__ . '/../view', 
     ], 
    ], 
]; 

AlbumTable.php

namespace Album\Model; 

use RuntimeException; 
use Zend\Db\TableGateway\TableGatewayInterface; 

class AlbumTable 
{ 
    private $tableGateway; 

    public function __construct(TableGatewayInterface $tableGateway) 
    { 
     $this->tableGateway = $tableGateway; 
    } 

    public function fetchAll() 
    { 
     return $this->tableGateway->select(); 
    } 

    public function getAlbum($id) 
    { 
     $id = (int) $id; 
     $rowset = $this->tableGateway->select(['id' => $id]); 
     $row = $rowset->current(); 
     if (! $row) { 
      throw new RuntimeException(sprintf(
       'Could not find row with identifier %d', 
       $id 
      )); 
     } 

     return $row; 
    } 

    public function saveAlbum(Album $album) 
    { 
     $data = [ 
      'artist' => $album->artist, 
      'title' => $album->title, 
     ]; 

     $id = (int) $album->id; 

     if ($id === 0) { 
      $this->tableGateway->insert($data); 
      return; 
     } 

     if (! $this->getAlbum($id)) { 
      throw new RuntimeException(sprintf(
       'Cannot update album with identifier %d; does not exist', 
       $id 
      )); 
     } 

     $this->tableGateway->update($data, ['id' => $id]); 
    } 

    public function deleteAlbum($id) 
    { 
     $this->tableGateway->delete(['id' => (int) $id]); 
    } 
} 

AlbumController.php

namespace Album\Controller; 

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

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() 
    { 
    } 
} 
+0

也请把你的'Module.php'放在这里 –

回答

1

的错误来自AlbumController构造,其预期在创建前当待注入的AlbumTable对象。

该控制器在

Controller\AlbumController::class => InvokableFactory::class, 

使用标准工厂没有构造参数创建。

您需要此更改为:使本厂提供的扶养(AlbumTable)

Controller\AlbumController::class => function($container) { 
    return new Controller\AlbumController(
     $container->get(\Album\Model\AlbumTable::class) 
    ); 
}, 

而且AlbumTable应该有自己的工厂(也许你已经有这个在你的配置)。

use Zend\Db\ResultSet\ResultSet; 
use Zend\Db\TableGateway\TableGateway; 

'service_manager' => [ 
     'factories' => [ 
      \Album\Model\AlbumTable::class => function($sm) { 
       $tableGateway = $sm->get('AlbumTableGateway'); 
       $table = new \Album\Model\AlbumTable($tableGateway); 
       return $table; 
      }, 
      'AlbumTableGateway' => function ($sm) { 
       $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
       $resultSetPrototype = new ResultSet(); 
       return new TableGateway('album', $dbAdapter, null, $resultSetPrototype); 
      }, 
     ] 
    ], 

其中TableGateway“专辑”(“专辑”是你的数据库表名

0
Controller\AlbumController::class => InvokableFactory::class, 

变化

Controller\AlbumController::class => Controller\AlbumControllerFactory::class, 

然后在控制器DIR生成AlbumControllerFactory类

namespace Album\Controller; 

use Album\Controller\AlbumController; 
use Zend\ServiceManager\Factory\FactoryInterface; 
use Interop\Container\ContainerInterface; 
use Album\Model\AlbumTable; 

class AlbumControllerFactory implements FactoryInterface { 
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null){ 
     $model = $container->get(AlbumTable::class); 
     return new AlbumController($model); 
    } 
} 

另外,如果你没有工厂AlbumModel可以创建一个同样的方式 所以你modlue.config.php看起来像如。

.... 
'controllers' => [ 
    'factories' => [ 
     Controller\AlbumController::class => Controller\AlbumControllerFactory::class, 
    ], 
], 
'service_manager' => [ 
    'factories' => [ 
     Model\AlbumModel::class => Model\AlbumModelFactory::class, 
    ], 
], 
.... 
相关问题