Пакет API и интерфейс Laravel Mashape/Unirest

Как вы реализуете интерфейс для внешнего пакета в Laravel? Скажем, я хочу использовать API Mashape/Unirest для анализа текста, но в будущем я хотел бы переключиться на другого поставщика API и не сильно менять код.

interface AnalyzerInterface {

    public function analyze(); //or send()?

}

class UnirestAnalyzer implements AnalyzerInterface {

    function __constructor(Unirest unirest){
        //this->...
    }

    function analyze($text, $lang) { 
        Unirest::post(.. getConfig() )
    }

    //some private methods to process data
}

А куда девать файлы interfece и UnirestAnalyzer? Сделать для них специальную папку, добавить в композитор? Добавить пространство имен?


person Leszek Pietrzak    schedule 03.05.2014    source источник


Ответы (1)


Вот как я бы перешел к интерфейсу и реализовал что-то вроде этого:

interface AnalyzerInterface {

    public function analyze();
    public function setConfig($name, $value);

}

class UnirestAnalyzer implements AnalyzerInterface {

    private $unirest;

    private $config = [];

    public function __construct(Unirest unirest)
    {
        $this->unirest = $unirest;
    }

    public function analyze($text, $lang) 
    { 
        $this->unirest->post($this->config['var']);
    }

    public function setConfig($name, $value)
    {
        $this->config[$name] = $value;
    }

    //some private methods to process data
}

class Analyser {

    private $analizer;

    public function __construct(AnalyzerInterface analyzer)
    {
        $this->analyzer = $analyzer;

        $this->analyzer->setConfig('var', Config::get('var'));
    }

    public function analyze()
    {
        return $this->analyzer->analyze();
    }

}

И вы должны привязать его к Laravel:

App::bind('AnalyzerInterface', 'UnirestAnalyzer');
person Antonio Carlos Ribeiro    schedule 03.05.2014
comment
Антонио: спасибо за быстрый ответ. Должен ли это быть $this-›analyzer-›setConfig() ? Этот класс Analyzer может быть контроллером, верно? - person Leszek Pietrzak; 03.05.2014