2016-09-21 62 views
2

我想提出的是翻譯從一種語言文字爲英語,並得到有關它的信息的應用程序(如定義,在一個句子,同義詞,聲音表示使用)一個清潔的方式去與我的控制器方法

什麼我的功能是:

  1. 搜索數據庫中的翻譯。如果找到了,我們會將其退回。
  2. 如果找不到,我們會翻譯一個詞使用谷歌翻譯,或Yandex翻譯API。
  3. 如果找到翻譯,我們下載它的聲音表示形式,將翻譯保存到數據庫並添加來自其他API的其他信息
  4. 我們返回一個包含所有信息的json響應。

現在我的控制器方法真的很大,我找不到一個更乾淨的方法來解決它。

任何幫助表示讚賞。

public function store(Request $request) 
{ 
    $translated = $request->get('translated'); 
    $translation = $this->translation->findBy('translated', $translated)->first(); 

    if ($translation) { 
     return Response::json(['translation' => $this->translation->with(['examples', 'definitions', 'synonyms', 'images'])->find($translation->id)], ResponseCode::HTTP_CREATED); 
    } 

    $data = $request->all(); 
    $data['translation'] = $this->translate($translated); 

    if ($translated == $data['translation']) { 
     Log::info('Translation not found: ' . $data['translation']); 
     return $this->translationNotFound(); 
    } 

    $downloader = new Downloader(new GoogleSpeechDownloader()); 
    $filename = $downloader->download($data['translation']); 

    if ($filename) $data['sound_name'] = $filename; 

    $translation = $this->translation->create($data); 

    $this->createDefinition($translation); 
    $this->createExample($translation); 
    $this->createSynonym($translation); 

    return Response::json(['translation' => $this->translation->with(['examples', 'definitions', 'synonyms', 'images'])->find($translation->id)], ResponseCode::HTTP_CREATED); 
} 

private function translationNotFound() 
{ 
    return Response::json(['error' => 'Vertimas nerastas.'], ResponseCode::HTTP_NOT_FOUND); 
} 

private function createDefinition($translation) 
{ 
    $definition = new Definition(); 
    $definer = new Definer(new DictionaryApiDefiner()); 
    try { 
     $definition->definition = $definer->getDefinition($translation->translation); 
     $definition->approved = true; 
     $translation->definitions()->save($definition); 
    } catch (\Exception $e) { 
     Log::alert('Definition for word ' . $translation->translation . ' not found.'); 
    } 
} 

private function createExample($translation) 
{ 
    $example = new Example(); 
    $exampler = new ExampleCreator(new YourDictionaryGouteParserExampler()); 
    try { 
     $example->example = $exampler->getExample($translation->translation); 
     $example->approved = true; 
     $translation->examples()->save($example); 
    } catch (\Exception $e) { 
     Log::alert('Example for word ' . $translation->translation . ' not found.'); 
    } 
} 

private function createSynonym($translation) 
{ 
    $creator = new SynonymCreator(new BigHugeLabsSynonymCreator()); 
    foreach ($creator->getSynonyms($translation->translation) as $s) { 
     $synonym = new Synonym(); 
     $synonym->synonym = $s; 
     $synonym->approved = true; 
     $translation->synonyms()->save($synonym); 
    } 
} 

private function translate($translated) 
{ 
    $translator = new Translator(new GoogleTranslator()); 

    try { 
     return $translator->translate($translated); 
    } catch (\Exception $e) { 
     Log::critical($e->getMessage()); 
    } 

    $translator = new Translator(new YandexTranslator()); 
    return $translator->translate($translated); 
} 

回答

2

如果你想要更乾淨的代碼,只需爲這個工作做一個類。這兩個API和控制器中的兩個類會檢查該單詞,如果不存在於數據庫中,請檢查另外兩個API,將每個操作拆分爲您將創建的新兩個類中的方法。