2016-10-23 10 views
0

Я новичок в ZendFramework3, и я просто хочу знать, можно ли вызвать функцию с большим количеством аргументов, чем просто serviceManager на фабриках (в моем классе модуля): (можно ли передать аргумент рядом с $sm аргумент?)ZF3 - вызов функции с параметрами на фабриках 'Класс модуля

//class Module 

//getConfig() 
//getServiceConfig() 

public function getControllerConfig() 
{ 
    return [ 
     'factories' => [ 
      Controller\ModuleController::class => function ($sm) { 
       return new ModuleController($sm); 
      } 
     ] 
    ]; 
} 
+0

Это SM от v2, так или иначе вы решаете, какой следующий ... Можете ли вы вставить свою конкретную проблему? – tasmaniski

+0

У меня нет конкретной проблемы. Я просто ищу решение для создания общего кода, который может работать со всеми модулями в моем проекте. Основная цель заключается не в создании фабрик для всех моих модулей (фабрика для каждого модуля ModuleTable, фабрика для каждого модуля ModuleTableGateway, ... я хочу параметризовать только одну фабрику для работы с каждым модулем, который у меня есть. Для этого мне нужно чтобы узнать, какой модуль управляется в моем коде.Я не могу использовать $ this-> getServiceLocator() больше, чтобы получить правильный объект (класс) из моего контроллера. Правильно, я просто хочу знать, можно ли получить ** function ($ sm, $ another) ** – Renaud

ответ

0

Вы можете (обязательно) передать другие аргументы для завода, так долго, как класс будет создан может обрабатывать аргументы изящно. В приведенном ниже примере в каталоге контроллеров был создан Factory Class. Теперь это фабрика - ModuleControllerFactory - которая создает экземпляр ModuleController.

<?php 

    namespace Application\Controller; 

    use Application\Controller\ModuleController, 
     Zend\ServiceManager\Factory\FactoryInterface, 
     Zend\ServiceManager\Factory, 
     Interop\Container\ContainerInterface; 

    class ModuleControllerFactory implements FactoryInterface { 

     public function __invoke(ContainerInterface $container, $requestedName, array $options=null){ 
      // WE WANT TO PASS $variable1 to $variable12 TO THE ModuleController 
      $variable1  = "Variable Value 1"; 
      $variable2  = "Variable Value 2"; 
      $variable3  = "Variable Value 3"; 
      return new ModuleController($container, $variable1, $variable2, $variable3); 
     } 
    } 

Итак, теперь мы можем создать конструктор ModuleController класса:

<?php 

    // FILE-NAME: ModuleController.php; 
    namespace Application\Controller; 
    use Interop\Container\ContainerInterface; 

    class ModuleController extends AbstractActionController { 
     /** 
     * ContainerInterface. 
     * @var ContainerInterface 
     */ 
     public $container; 

     /** 
     * @var string 
     */ 
     public $var1; 

     /** 
     * @var string 
     */ 
     public $var2; 

     /** 
     * @var string 
     */ 
     public $var3; 

     // CONTAINER & VARIALBLES INJECTED IN CONSTRUCTOR 
     public function __construct(ContainerInterface $container, $variable1=null, $variable2=null, $variable3=null) { 
      $this->container = $container; 
      $this->var1   = $variable1; 
      $this->var2   = $variable2; 
      $this->var3   = $variable3; 
     } 

     // JUST PLAY WITH THE INJECTED VALUES IN THE INDEX ACTION 
     public function indexAction() { 
      return new ViewModel([ 
       'container' => $this->container, 
       'var1'  => $this->var1, 
       'var2'  => $this->var2, 
       'var3'  => $this->var3 
      ]); 
     } 


    } 

И теперь, обновить module.config.php внутри конфигурации папки вашего модуля Пример: module/Application/config/module.config.php.

<?php 

    namespace Application; 

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

    return [ 
      //... 
     'router' => [ 
      //... 
     ], 
     'controllers' => [ 
      'factories' => [ 
       Controller\ModuleController::class => Controller\ModuleControllerFactory::class 
      ] 
     ] 
      //... 

    ]; 
1

Если вы хотите создать один «волшебный» завод для всех зависимостей, вы должны смотреть на SM AbstractFactory.

В этой фабрике вы можете проверить с $ запрошенное имя, какие будут зависимости. Напр. вы можете читать зависимости от конструктора классов и вводить эти зависимости (или вытаскивать его снова из $ container). Вы также можете установить свои зависимости в config и таким образом создать только одну фабрику для всех ваших классов.

+0

Да, это то, что мне нужно. Большое вам спасибо. Только одно: они не указывают, где мы должны создать ServiceManager. Это то, что я не понимаю. «// При создании диспетчера служб:« но где нам нужно его определить? // При создании диспетчера служб: $ serviceManager = new ServiceManager ([ «заводы» => [ MyObjectA :: class => MyObjectFactory :: class, MyObjectB :: class => My ObjectFactory :: класс ] ]); – Renaud

+0

, который создается по умолчанию, если вы используете фреймворк. Check ZF skeleton https://github.com/zendframework/ZendSkeletonApplication после установки загляните в файл index.php и вокруг ... – tasmaniski

+0

Я использую фреймворк и я использовали ZendSkeleton. Но я посмотрел файл index.php, но это ничего не говорит о ServiceManager. Будет очень приятно, если бы вы могли показать мне, где это :) Большое спасибо – Renaud