Более чистый способ использования моего метода контроллера

Я делаю приложение, которое переводит слово с одного языка на английский и получает информацию о нем (например, определение, использование в предложении, синонимы, звуковое представление)

Что делает моя функция:

  1. Ищет перевод в базе данных. Если он найден, мы его возвращаем.
  2. Если он не найден, мы переводим слово с помощью Google Translate или 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, просто разделите каждое действие на метод в новых двух классах, которые вы создадите.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector