2017-09-07 1 views
0

J'ai créé un module avec le nom Commerce dans zend 3 qui fonctionne très bien. Maintenant, quand j'injecte une dépendance par __construct() il jette une erreurZF3 __construct() ne fonctionne pas

Trop peu d'arguments pour fonctionner Commerce \ Controller \ IndexController :: __ construct(), 0 passé dans /var/www/html/ZF3/fournisseur/zendframework /zend-servicemanager/src/Factory/InvokableFactory.php en ligne 30 et exactement 1 devrait

Voici le code du contrôleur.

<?php 

namespace Commerce\Controller; 

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

class IndexController extends AbstractActionController 
{ 
    private $commerce; 

    /** 
    * IndexController constructor. 
    * @param Commerce $commerce 
    */ 
    public function __construct(Commerce $commerce) 
    { 
     $this->commerceModel = $commerce; 
    } 


    public function indexAction() 
    { 
    return new ViewModel(); 
    } 

} 

module.config.php Code

<?php 

namespace Commerce; 

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

return [ 
    'router' => [ 
     'routes' => [ 
      'home' => [ 
       'type' => Literal::class, 
       'options' => [ 
        'route' => '/', 
        'defaults' => [ 
         'controller' => Controller\IndexController::class, 
         'action'  => 'index', 
        ], 
       ], 
      ], 
      'commerce' => [ 
       'type' => Segment::class, 
       'options' => [ 
        'route' => '/commerce[/:action][/:id]', 
        'defaults' => [ 
         'controller' => Controller\IndexController::class, 
         'action'  => 'index', 
        ], 
       ], 
      ], 
     ], 
    ], 
    'controllers' => [ 
     'factories' => [ 
      Controller\IndexController::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', 
      'commerce/index/index' => __DIR__ . '/../view/commerce/index/index.phtml', 
      'error/404'    => __DIR__ . '/../view/error/404.phtml', 
      'error/index'    => __DIR__ . '/../view/error/index.phtml', 
     ], 
     'template_path_stack' => [ 
      __DIR__ . '/../view', 
     ], 
    ], 
]; 

Où est le problème? zend-di est déjà installé.

Répondre

1

Votre erreur est due à la ligne

Controller\IndexController::class => InvokableFactory::class 

cela ne fournit pas un "Commerce \ Model \ Commerce" au constructeur de votre IndexController. Vous devez changer pour fournir la dépendance:

'controllers' => [ 
    'factories' => [ 
     Controller\IndexController::class => function($container) { 
      return new Controller\IndexController(
       $container->get(\Commerce\Model\Commerce::class) 
      ); 
     }, 
    ], 
], 
'service_manager' => [ 
    'factories' => [ 
     \Commerce\Model\Commerce::class => function($sm) { 
      /* provide any dependencies if needed */ 
      /* Create the model here. */ 
      return new \Commerce\Model\Commerce($dependencies); 
     }, 
    ] 
], 

La meilleure approche est de fournir sa propre usine pour votre commerce \ Modèle \ class Commerce, comme on le voit ci-dessus dans le cadre « usines » de « service_manager ».

EDIT: comme demande, si vous voulez faire tout à l'intérieur du contrôleur d'usine, voici un exemple simple:

'controllers' => [ 
    'factories' => [ 
     Controller\IndexController::class => function($container) { 
      $dbAdapter = $container->get('Zend\Db\Adapter\Adapter'); 
      $resultSetPrototype = new ResultSet(); 
      $tableGateway = new TableGateway('commerceTableName', $dbAdapter, null, $resultSetPrototype); 

      return new Controller\IndexController(
       new \Commerce\Model\Commerce($tableGateway) 
      ); 
     }, 
    ], 
], 
+0

Il fonctionne, mais il semble que beaucoup de travail parce que je dois les définir à 2 places (à la fois dans le fichier controller et le fichier module.config.php). Y a-t-il un moyen par lequel je dois les définir dans le contrôleur seulement? – amitshree

+0

Oui, il y a. Vous pouvez ignorer la définition d'une fabrique pour "\ Commerce \ Modèle \ Commerce", il suffit de la créer dans la fabrique de contrôleurs: return new Controller \ IndexController (nouveau \ Commerce \ Modèle \ Commerce ($ dépendances)); –

+0

Pouvez-vous s'il vous plaît ajouter cette alternative dans votre réponse avec un exemple? – amitshree