2015-05-16 1 views
3

Так что я в основном хочу сделать это:параметры Пасс в Pimple-> container-> завод

$this->container['Menu_builder'] = $this->container->factory(function ($c) { 
    return new Menu_builder($parameter_1, $parameter_2); 
}); 

Где $parameter_1 и $parameter_2 передаются в от вызова, например:

$menu_builder = $this->container['Menu_builder']('account', 'reset_password'); 

I знать, что приведенный выше синтаксис неверен, но я хочу передать эти строки в вызов $this->container->factory.

Возможно ли это?

Например, если бы я хотел создать экземпляр Menu_builder из различных функций контроллера с различными параметрами для каждой функции контроллера.

+0

Итак, ваша проблема в том, что '$ parameter_1' /' _2' находятся вне области видимости в вашей анонимной функции? – Rizier123

+0

Да, именно так, как вы их проходите? Надеюсь, я не нашел один случай использования Pimple, который вы не можете сделать! –

+0

Ну, у вас уже есть свой ответ в вашем комментарии^:) 'use', например. 'function ($ c) use ($ parameter_1, $ parameter_2) {' – Rizier123

ответ

2

Вы можете использовать use(), чтобы передать свои переменные анонимным функциям, например.

//your parameters needs to be defined here: 
$parameter_1 = "XY"; 
$parameter_2 = 42; 

$this->container['Menu_builder'] = $this->container->factory(function ($c)use($parameter_1, $parameter_2) { 
                     //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ See here 
    return new Menu_builder($parameter_1, $parameter_2); 
}); 
+0

И когда он определен в поставщике услуг? Я думаю, что параметры должны быть переданы путем определения значения контейнера - т.е. $ container ['param1'] = 'some value'. Затем анонимная функция может получить доступ через $ container ['param1'] –

1

FWIW, вы также можете включить анонимную функцию в свой контейнер.

$this->container['Menu_builder'] = function() { 
    // do stuff here 

    return function($parameter_1, $parameter_2) { 
     return new Menu_builder($parameter_1, $parameter_2); 
    }; 
}; 

Используйте этот способ:

$localfunc = $this->container['Menu_builder']; 
$result = $localfunc($parameter_1, $parameter_2); 

Обратите внимание, что в данном случае я не использую фабрику. Это потому, что вы можете выполнять анонимную функцию с разными значениями каждый раз.