2016-09-22 55 views
2

我收到提示:ZF 3 __construct()必須是...沒有一個實例給出

Catchable fatal error: Argument 1 passed to Application\Controller\IndexController::__construct() must be an instance of Application\Model\PlatnosciTable, none given, called in /var/www/Paczucha_pl/vendor/zendframework/zend-servicemanager/src/Factory/InvokableFactory.php on line 32 and defined in /var/www/Paczucha_pl/module/Application/src/Controller/IndexController.php on line 21 

我試圖弄清楚發生了什麼我做錯了我的代碼。姓名只是從相冊更改爲Platnosci。

有我的文件:

Platnosci.php

namespace Application\Model; 

class Platnosci 
{ 
    public $id; 
    public $artist; 
    public $title; 

    public function exchangeArray($data) 
    { 
     $this->id  = (!empty($data['id'])) ? $data['id'] : null; 
     $this->artist = (!empty($data['artist'])) ? $data['artist'] : null; 
     $this->title = (!empty($data['title'])) ? $data['title'] : null; 
    } 
} 

PlatnosciTable.php

namespace Application\Model; 

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

class PlatnosciTable 
{ 
    protected $tableGateway; 

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

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

    public function getAlbum($id) { 
     $id = (int) $id; 
     $rowset = $this->tableGateway->select(array('id' => $id)); 
     $row = $rowset->current(); 
     if (!$row) { 
      throw new \Exception("Could not find row $id"); 
     } 
     return $row; 
    } 

    public function saveAlbum(Platnosci $album) { 
     $data = array(
      'artist' => $album->artist, 
      'title' => $album->title, 
     ); 

     $id = (int) $album->id; 
     if ($id == 0) { 
      $this->tableGateway->insert($data); 
     } else { 
      if ($this->getAlbum($id)) { 
       $this->tableGateway->update($data, array('id' => $id)); 
      } else { 
       throw new \Exception('Album id does not exist'); 
      } 
     } 
    } 

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

IndexController.php

namespace Application\Controller; 

use Application\Model\Przesylki; 
use Application\Model\PlatnosciTable; 
use Zend\Mvc\Controller\AbstractActionController; 
use Zend\Db\Adapter\AdapterInterface; 
use Zend\View\Model\ViewModel; 


class IndexController extends AbstractActionController 
{ 
    private $table; 

    public function __construct(PlatnosciTable $table) 
    { 
     $this->table = $table; 
    } 

    public function indexAction() 
    { 
     $this->layout('layout/layout'); 
    } 

    public function counterAction() { 
     $this->layout('layout/counter'); 
    } 
    public function cennikAction() { 
     return new ViewModel([ 
      'albums' => $this->table->fetchAll(), 
     ]); 
    } 
} 

Module.php

namespace Application; 

use Application\Model\PlatnosciTable; 
use Zend\Db\Adapter\AdapterInterface; 
use Zend\Db\ResultSet\ResultSet; 
use Zend\Db\TableGateway\TableGateway; 
use Zend\ModuleManager\Feature\ConfigProviderInterface; 

class Module 
{ 
    const VERSION = '3.0.2dev'; 

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

    public function getServiceConfig() { 
     return [ 
      'factories' => [ 
       Model\PlatnosciTable::class => function($container) { 
        $tableGateway = $container->get(Model\PlatnosciTableGateway::class); 
        return new Model\PlatnosciTable($tableGateway); 
       }, 
       Model\PlatnosciTableGateway::class => function ($container) { 
        $dbAdapter = $container->get(AdapterInterface::class); 
        $resultSetPrototype = new ResultSet(); 
        $resultSetPrototype->setArrayObjectPrototype(new Platnosci()); 
        return new TableGateway('album', $dbAdapter, null, $resultSetPrototype); 
       }, 
      ], 
     ]; 
    } 

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

module.config.php

namespace Application; 

use Application\Controller\IndexController; 
use Application\Model\PlatnosciTable; 
use Interop\Container\ContainerInterface; 
use Zend\Router\Http\Literal; 
use Zend\Router\Http\Segment; 
use Zend\ServiceManager\Factory\InvokableFactory; 

return [ 
    'router' => [ 
     'routes' => [ 
      // Strona glowna 
      'home' => [ 
       'type' => Literal::class, 
       'options' => [ 
        'route' => '/', 
        'defaults' => [ 
         'controller' => Controller\IndexController::class, 
         'action'  => 'counter', 
        ], 
       ], 
      ], 
      'work' => [ 
       'type' => Literal::class, 
       'options' => [ 
        'route' => '/work', 
        'defaults' => [ 
         'controller' => Controller\IndexController::class, 
         'action'  => 'index', 
        ], 
       ], 
      ], 
      'cennik' => [ 
       'type' => Literal::class, 
       'options' => [ 
        'route' => '/cennik', 
        'defaults' => [ 
         'controller' => Controller\IndexController::class, 
         'action'  => 'cennik', 
        ], 
       ], 
      ], 
      // Panel 
      'panel' => [ 
       'type' => Segment::class, 
       'options' => [ 
        'route' => '/panel', 
        'defaults' => [ 
         'controller' => Controller\PanelController::class, 
         'action'  => 'index', 
        ], 
       ], 
      ], 
      'test' => [ 
       'type' => Segment::class, 
       'options' => [ 
        'route' => '/panel/test', 
        'defaults' => [ 
         'controller' => Controller\PanelController::class, 
         'action'  => 'test', 
        ], 
       ], 
      ], 
     ], 
    ], 
    'controllers' => [ 
     'factories' => [ 
//   Controller\IndexController::class => function(ContainerInterface $serviceMaganer, $controller) { 
//    $repository = $serviceMaganer->get(PlatnosciTable::class); 
//    return new IndexController($repository); 
//   } 
// that up there is just a try, now is like this one below. 
      Controller\PanelController::class => InvokableFactory::class, 
     ], 
    ], 
    'view_manager' => [ 
     'display_not_found_reason' => true, 
     'display_exceptions'  => true, 
     'doctype'     => 'HTML5', 
     'not_found_template'  => 'error/404', 
     'exception_template'  => 'error/index', 
     'template_map' => [ 
      'layout/layout'   => __DIR__ . '/../view/layout/layout.phtml', 
      'layout/panel'   => __DIR__ . '/../view/layout/panel_layout.phtml', 
      'layout/counter'   => __DIR__ . '/../view/layout/counter.phtml', 
      'layout/pusty'   => __DIR__ . '/../view/layout/pusty.phtml', 
      'application/index/index' => __DIR__ . '/../view/application/index/index.phtml', 
      'error/404'    => __DIR__ . '/../view/error/404.phtml', 
      'error/index'    => __DIR__ . '/../view/error/index.phtml', 
     ], 
     'template_path_stack' => [ 
      __DIR__ . '/../view', 
     ], 
    ], 
]; 
+0

阿呆緩存....現在它的__construct()必須應用\型號\ TableGateway,Zend的\ DB的實例的實例\ TableGateway \ TableGateway給出 –

+1

'PlatnosciTable.php' - 沒有'use'指令的'TableGateway'構造函數參數,它連接到錯誤的文件名稱空間。它應該是'Zend \ Db \ TableGateway \ TableGateway',所以將它指向那裏。 – Nevertheless

回答

1

TableGateway預計在構造函數聲明不正確的類的use。默認情況下,它看起來它在Application\Model命名空間,而類應該是Zend\Db\TableGateway\TableGateway

namespace Application\Model; 

// Add this to point TableGateway in __construct() 
use Zend\Db\TableGateway\TableGateway; 

// ... 

class PlatnosciTable 
{ 
    protected $tableGateway; 

    // Now it should use a correct hinting 
    public function __construct(TableGateway $tableGateway) { 
     $this->tableGateway = $tableGateway; 
    } 

    // ... 
} 
+0

謝謝!工作:) –

+1

不客氣:) – Nevertheless

1

還有一兩件事,有2個工廠,在module.config.php和Module.php。

如果我們Module.php

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

都使得它不能在module.config.php像

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

,因爲它會覆蓋。

2
  1. 在 「PlatnosciTable.php」,構造函數應該讀 -

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

  • 並刪除從以下 「module.config.php」 文件部分 -
  • 'controllers' => [ 'factories' => [ Controller\PanelController::class => InvokableFactory::class, ], ],

    相關問題