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.

bootstrap/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() за инстанциране на обекти директно в метода. По този начин не е необходимо да създавате обекти, които няма да са необходими в определени методи и поддържа вашия контролер прост. Друг съвет: Не използвам обратно накланяне в моите обвързвания на приложения. Оставих това на автоматичната резолюция. Използвам точки като App::make('my.special.method', array($arg1, $arg2)). По този начин мога да имам няколко конструктора от един и същи клас с описателна инстанция - person Alwin Kesler; 18.02.2014