1

Zend 3 を使用していますが、データベース テーブルからすべてのアルバムを一覧表示しようとすると、このエラーを解決できません。エラーは

キャッチ可能な致命的なエラー: Album\Controller\AlbumController::__construct() に渡される引数 1 は、C:\xampp\htdocs\zftutorial\vendor\zendframework\zend-servicemanager で呼び出される Album\Model\AlbumTable のインスタンスである必要があります。 \src\Factory\InvokableFactory.php

これらは私のファイルです: AlbumController.php

<?php
namespace Album\Controller;

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


 class AlbumController extends AbstractActionController
 {


    private $table;

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


 }

AlbumTable.php

<?php
namespace Album\Model;

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

class AlbumTable
{
    protected $tableGateway;

    public function __construct(TableGateway $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]);
    }
}

Module.php

<?php
namespace Album;

 use Zend\ModuleManager\Feature\AutoloaderProviderInterface;
 use Album\Model\Album;
 use Album\Model\AlbumTable;
 use Zend\Db\Adapter\AdapterInterface;
 use Zend\Db\ResultSet\ResultSet;
 use Zend\Db\TableGateway\TableGateway;
 use Zend\ModuleManager\Feature\ConfigProviderInterface;

 //use \Zend\Mvc\Controller\ControllerManager;


 class Module implements AutoloaderProviderInterface, ConfigProviderInterface

 {
     public function getAutoloaderConfig()
     {
         return array(
             'Zend\Loader\ClassMapAutoloader' => array(
                 __DIR__ . '/autoload_classmap.php',
             ),
             'Zend\Loader\StandardAutoloader' => array(
                 'namespaces' => array(
                     __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
                 ),
             ),
         );
     }

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




 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 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)
                    );
                },
            ],
        ];
    } 
}

module.config.php

<?php
namespace Album;
return array(
     'controllers' => array(
         'invokables' => array(
             'Album\Controller\Album' => 'Album\Controller\AlbumController',
         ),    

      ), 


     'router' => array(
         'routes' => array(
             'album' => array(
                 'type'    => 'segment',
                 'options' => array(
                     'route'    =>'/album[/][:action][/:id]',

                     'constraints' => array(
                         'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                         'id'     => '[0-9]+',
                     ),
                     'defaults' => array(
                         'controller' => 'Album\Controller\Album',
                         'action'     => 'index',
                     ),
                 ),
             ),
         ),
     ),
     'view_manager' => array(
         'template_path_stack' => array(
             'album' => __DIR__ . '/../view',
         ),
     ),
 );
4

2 に答える 2

0

以下のコードを置き換える必要があります

   'controllers' => array(
     'invokables' => array(
         'Album\Controller\Album' => 'Album\Controller\AlbumController',
      ),    

   ),

コードで

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

ドキュメントからのように

invokables は zf3 には存在しなくなりました。

于 2016-11-18T10:00:07.253 に答える
0

あなたのmodule.config.phpには次のものがあります:

 'controllers' => array(
     'invokables' => array(
         'Album\Controller\Album' => 'Album\Controller\AlbumController',
     ),    
  ),

ここでいくつかの概念を混同しているようです。invokable は、コンストラクターにパラメーターを持たないクラスです。また、ZF2 の場合とは異なり、ZF3 には呼び出し可能オブジェクトが存在しなくなりました。

コントローラーは AlbumTable オブジェクトを必要とするため、それを呼び出し可能オブジェクトとして使用することはできず、それを注入するためのファクトリーを作成する必要があります。Module.php ですでに行っていること。

コードを見ると、これらの行を module.config.php から削除するとうまくいくかもしれません。

getAutoloaderConfig()Module.php からも削除する必要があります。しばらくの間、zend ローダーは非推奨になり、composer オートローダーが優先されました。

于 2016-11-02T06:13:58.383 に答える