__construct()必须是Post \ Model \ PostTable

时间:2018-01-06 19:54:02

标签: zend-framework3

尝试添加新模块?但得到的是错误:

  

参数1传递给Post \ Controller \ PostController :: __ construct()   必须是Post \ Model \ PostTable的一个实例,没有给出,调用   宽:\域\ zend_blog \骨架的应用\厂商\ zendframework \ Zend的-的ServiceManager \ SRC \厂\ InvokableFactory.php

namespace Post\Controller;    
use Post\Model\Post;
// Add the following import:
use Post\Model\PostTable;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;



class PostController extends AbstractActionController
{
    private $table;
    /**
     * Execute the request
     *
     * @param  MvcEvent $e
     * @return mixed
     */

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

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

邮政表:

<?php

namespace Post\Model;

use RuntimeException;
use Zend\Db\TableGateway\TableGatewayInterface;
use Zend\Db\TableGateway\TableGateway;
class PostTable
{
    private $tableGateway;

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

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

    public function getPost($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 savePodt(Post $album)
    {
        $data = [
            'artist' => $album->artist,
            'title'  => $album->title,
        ];

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

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

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

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

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

模块:

namespace Post;
use Zend\ModuleManager\Feature\ConfigProviderInterface;
use Zend\ModuleManager\Feature\ServiceProviderInterface;

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

    /**
     * Expected to return \Zend\ServiceManager\Config object or array to
     * seed such an object.
     *
     * @return array|\Zend\ServiceManager\Config
     */
    public function getServiceConfig()
    {
        return [
            'factories' => [
                Model\PostTable::class => function($container) {
                    $tableGateway = $container->get(Model\PostTableGateway::class);
                    return new Model\PostTable($tableGateway);
                },
                Model\PostTableGateway::class => function ($container) {
                    $dbAdapter = $container->get(AdapterInterface::class);
                    $resultSetPrototype = new ResultSet();
                    $resultSetPrototype->setArrayObjectPrototype(new Model\Post());
                    return new TableGateway('post', $dbAdapter, null, $resultSetPrototype);
                },
            ],
        ];
    }

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

1 个答案:

答案 0 :(得分:0)

很可能您在 module.config.php 中为控制器工厂设置了重复设置。检查:

<?php 
 function getVehiculesByAlpha(){
  try{
    $db = new PDO('mysql:host=localhost;dbname=ProjectRentcar;charset=utf8','root','root');
  }catch(Exception $e){
    die('Erreur : '.$e->getMessage());
  }
  $query = $db->query('
    SELECT nom, modele, km 
    FROM Vehicule V, Marque Ma 
    WHERE V.numMarque = Ma.numMarque
    ORDER BY nom, modele');
  return $query;
  }

function getVehiculesByModel(){
  //Same code with order differently
}
function getVehiculesByKm(){
  //Same here
}

删除行:

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

以便使用Module.php中的工厂方法。