2
下面是我的控制器Admin/MoviesController的'store'方法示例。它已經看起來很大,'更新'的方法會更大。Laravel 5 - 清潔代碼,在哪裏保持業務邏輯(控制器示例)
的algoritm是:在CreateMovieRequest
- 驗證請求數據,並與所有可填寫字段創建新的電影 。
- 上傳海報
- 填寫和保存所有重要的,但不是必需的字段(元標題,meta描述。)
- 然後4與解析代碼,重視電影流派,演員,導演,國家塊。
- 要求使用第三方API
我的問題IMDB的評級:
- 我是不是應該把所有這些代碼模型,並將其劃分爲像小方法:removeGenres($ ID), addGenres(Request $ request),...
是否有一些最佳實踐?我說的不是MVC,而是Laravel的特性。爲了保持幕後的邏輯,我只使用了請求驗證。
public function store(CreateMovieRequest $request) { $movie = Movies::create($request->except('poster')); /* Uploading poster */ if ($request->hasFile('poster')) { $poster = \Image::make($request->file('poster')); $poster->fit(250, 360, function ($constraint) { $constraint->upsize(); }); $path = storage_path() . '/images/movies/'.$movie->id.'/'; if(! \File::exists($path)) { \File::makeDirectory($path); } $filename = time() . '.' . $request->file('poster')->getClientOriginalExtension(); $poster->save($path . $filename); $movie->poster = $filename; } /* If 'Meta Title' is empty, then fill it with the name of the movie */ if (empty($movie->seo_title)) { $movie->seo_title = $movie->title; } /* If 'Meta Description' is empty, then fill it with the description of the movie */ if (empty($movie->seo_description)) { $movie->seo_description = $movie->description; } // Apply all changes $movie->save(); /* Parsing comma separated string of genres * and attaching them to movie */ if (!empty($request->input('genres'))) { $genres = explode(',', $request->input('genres')); foreach($genres as $item) { $name = mb_strtolower(trim($item), 'UTF-8'); $genre = Genre::where('name', $name)->first(); /* If such genre doesn't exists in 'genres' table * then we create a new one */ if (empty($genre)) { $genre = new Genre(); $genre->fill(['name' => $name])->save(); } $movie->genres()->attach($genre->id); } } /* Parsing comma separated string of countries * and attaching them to movie */ if (!empty($request->input('countries'))) { $countries = explode(',', $request->input('countries')); foreach($countries as $item) { $name = mb_strtolower(trim($item), 'UTF-8'); $country = Country::where('name', $name)->first(); if (empty($country)) { $country = new Country(); $country->fill(['name' => $name])->save(); } $movie->countries()->attach($country->id); } } /* Parsing comma separated string of directors * and attaching them to movie */ if (!empty($request->input('directors'))) { $directors = explode(',', $request->input('directors')); foreach($directors as $item) { $name = mb_strtolower(trim($item), 'UTF-8'); // Actors and Directors stored in the same table 'actors' $director = Actor::where('fullname', trim($name))->first(); if (empty($director)) { $director = new Actor(); $director->fill(['fullname' => $name])->save(); } // Save this relation to 'movie_director' table $movie->directors()->attach($director->id); } } /* Parsing comma separated string of actors * and attaching them to movie */ if (!empty($request->input('actors'))) { $actors = explode(',', $request->input('actors')); foreach($actors as $item) { $name = mb_strtolower(trim($item), 'UTF-8'); $actor = Actor::where('fullname', $name)->first(); if (empty($actor)) { $actor = new Actor(); $actor->fill(['fullname' => $name])->save(); } // Save this relation to 'movie_actor' table $movie->actors()->attach($actor->id); } } // Updating IMDB and Kinopoisk ratings if (!empty($movie->kinopoisk_id)) { $content = Curl::get('http://rating.kinopoisk.ru/'.$movie->kinopoisk_id.'.xml'); $xml = new \SimpleXMLElement($content[0]->getContent()); $movie->rating_kinopoisk = (double) $xml->kp_rating; $movie->rating_imdb = (double) $xml->imdb_rating; $movie->num_votes_kinopoisk = (int) $xml->kp_rating['num_vote']; $movie->num_votes_imdb = (int) $xml->imdb_rating['num_vote']; $movie->save(); } return redirect('/admin/movies'); }