2016-11-25 9 views
1

私は私のコントローラのために工場を実装しようとしています:Zendの3工場インタフェース

class NumberControllerFactory implements FactoryInterface{ 
public function __invoke(ContainerInterface $container, $requestedName, array $options = null) 
{ 
    return new NumberController($container->get(Bar::class)); 
} 

public function createService(ServiceLocatorInterface $services) 
{ 
    return $this($services, NumberController::class); 
} 

}

なったIエラー:私は注入したいので、私は、これを必要と

Fatal error: Declaration of Number\Factory\NumberControllerFactory::__invoke() must be compatible with Zend\ServiceManager\Factory\FactoryInterface::__invoke(Interop\Container\ContainerInterface $container, $requestedName, array $options = NULL) in C:\xampp\htdocs\MyProject\module\Number\src\Number\Factory\NumberControllerFactory.php on line 10 

Zend 3のコントローラーからサービスマネージャーが削除されたため、モデルからコントローラーに移動しました。

01で説明したスケルトンを使用しましたcomposer.jsonで

は次のとおりです。

"require": { 
    "php": "^5.6 || ^7.0", 
    "zendframework/zend-component-installer": "^1.0 || ^0.3 || ^[email protected]", 
    "zendframework/zend-mvc": "^3.0.1", 
    "zfcampus/zf-development-mode": "^3.0" 
}, 

私はこの問題を理解していない、私は例えば、チュートリアルをたくさん読んで:あなたは私を助け

https://zendframework.github.io/zend-servicemanager/migration/

coould、お願いします?

私は現在、このメソッドは、:: __コントローラにモデルを注入するための

答えて

3

を呼び出すのZend \ ServiceManager \工場\ FactoryInterfaceと互換性があることを推測し、あなたはファクトリクラスを作成する必要がありmodule.config.phpの構成としばらく以下

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

ここでAlbumControllerはAlbumモジュールのコントローラクラスです。その後、\ Album \ src \ Factoryモジュール内にAlbumControllerFactoryクラスを作成する必要があります。あなたは、コントローラクラス(AlbumController)内部以下のコードを記述する必要が

namespace Album\Factory; 

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


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

:あなたは以下のコードを記述する必要があり、このクラスで 。

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

このようにして、コントローラクラスにモデルクラスを挿入できます。

0

ありがとうAzhar。私が使用したときので

私の問題だった:ドキュメントの

'Number\Controller\Number' => \Number\Factory\NumberControllerFactory::class 

は、私が使用する必要があるということです。それは動作していなかった

  'factories' => array(
     \Number\Controller\NumberController::class => \Number\Factory\NumberControllerFactory::class 
    ) 

、私が使用していた... 404がありましたフルクラス名::クラス。

誰かがそれが機能しない理由を知っていますか?

+0

あなたはbelwoコード 'ナンバー\コントローラ\ナンバー' =>ファクトリー\ NumberControllerFactory ::クラス それとも コントローラ\ NumberController ::クラス=>ファクトリー\ NumberControllerFactory ::クラスを使用することができます –