【问题标题】:A cleaner way to go with my controller method使用我的控制器方法的更简洁的方法
【发布时间】:2016-09-21 13:15:36
【问题描述】:

我正在制作一个应用程序,将单词从一种语言翻译成英语并获取有关它的信息(例如定义、在句子中的使用、同义词、声音表示)

我的功能是做什么的:

  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);
}

【问题讨论】:

    标签: php laravel-5 coding-style code-cleanup


    【解决方案1】:

    如果您想要更简洁的代码,只需为这项工作创建一个类。这两个 API 和控制器中的两个类对单词进行检查,如果数据库中不存在,则检查其他两个 API,只需将每个操作拆分为您将创建的新两个类中的方法。

    【讨论】:

      猜你喜欢
      • 2017-05-10
      • 2013-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      相关资源
      最近更新 更多