laravel-4 способ внедрить объект, требующий конфигурации, в контроллер

Я хотел бы найти хороший способ передать предварительно настроенный объект контроллеру. Я знаю, что могу использовать IoC, как показано ниже:

Mycontroller extends extends \Illuminate\Routing\Controllers\Controller {

    //i can only use one config uless i pass Request data
    $this->config = App::make('MyconfigObject');

}

но это, кажется, имеет ограничение возможности использовать только одну конфигурацию. Я бы предпочел сделать что-то вроде следующего:

Route::get('some-route', function()
{
    $config = Config::get('some.config');
    $object = new MyConfigObject($config);
    Route::dispatch(MyController($object));
});

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


person Juni Samos De Espinosa    schedule 18.03.2013    source источник


Ответы (1)


Я не полностью удовлетворен этим методом, но это лучшее, что я придумал до сих пор, используя автоматическое разрешение IoC.

бутстрап/stat.php

/*
* bindings to the IoC container
*/
$app->singleton('MyNamespace\Transfer\TransferStategyInterface', function() {
    $config = Config::get('transfer-strategy');
    return new LocalTransferStrategy($config);
});


use MyNamespace\Transfer\TransferStategyInterface;

TransferController.php

use MyNamespace\Transfer\TransferStategyInterface;


class TransferController extends BaseController {

    protected $transferStrategy;

    public function __construct(TransferStategyInterface $transferStrategy = null)
    {
        $this->transferStrategy = $transferStrategy;
    }
}
person Juni Samos De Espinosa    schedule 21.03.2013
comment
Раньше я пользовался вашим подходом. Теперь я использую App::make() для создания экземпляров объектов непосредственно в методе. Таким образом, вам не нужно создавать объекты, которые не понадобятся в определенных методах, и ваш контроллер будет простым. Другой совет: я не использую backslaskes в привязках приложений. Я позволил этому автоматическому разрешению. Я использую точки, такие как App::make('my.special.method', array($arg1, $arg2)). Таким образом, у меня может быть несколько конструкторов одного и того же класса с описательной инстанцией. - person Alwin Kesler; 18.02.2014