मैं लारवेल 4 का उपयोग करके एक बड़ी परियोजना को पूरा कर रहा हूं और आपको उन सभी सवालों का जवाब देना होगा जो आप अभी पूछ रहे हैं। लीनपब पर उपलब्ध लारवेल की सभी पुस्तकों और टॉगल ऑफ गोग्लिंग को पढ़ने के बाद, मैं निम्नलिखित संरचना के साथ आया।
- एक योग्य मॉडल वर्ग प्रति खाने योग्य तालिका
- एलोकेंट मॉडल प्रति एक रिपॉजिटरी वर्ग
- एक सेवा वर्ग जो कई रिपॉजिटरी कक्षाओं के बीच संवाद कर सकता है।
तो मान लीजिए कि मैं एक मूवी डेटाबेस बना रहा हूं। मेरे पास कम से कम निम्नलिखित स्पष्ट मॉडल वर्ग होंगे:
- चलचित्र
- स्टूडियो
- निदेशक
- अभिनेता
- समीक्षा
एक रिपॉजिटरी वर्ग प्रत्येक एलोकेंट मॉडल वर्ग को अतिक्रमण करेगा और डेटाबेस पर CRUD संचालन के लिए जिम्मेदार होगा। रिपॉजिटरी वर्ग इस तरह दिख सकते हैं:
- MovieRepository
- StudioRepository
- DirectorRepository
- ActorRepository
- ReviewRepository
प्रत्येक रिपॉजिटरी वर्ग एक बेस रिपॉजिटरी वर्ग का विस्तार करेगा जो निम्नलिखित इंटरफ़ेस को लागू करता है:
interface BaseRepositoryInterface
{
public function errors();
public function all(array $related = null);
public function get($id, array $related = null);
public function getWhere($column, $value, array $related = null);
public function getRecent($limit, array $related = null);
public function create(array $data);
public function update(array $data);
public function delete($id);
public function deleteWhere($column, $value);
}
एक सेवा वर्ग का उपयोग कई रिपॉजिटरी को एक साथ करने के लिए किया जाता है और इसमें एप्लिकेशन का वास्तविक "व्यावसायिक तर्क" होता है। नियंत्रक केवल क्रिएट, अपडेट और डिलीट कार्यों के लिए सेवा वर्गों के साथ संवाद करते हैं।
इसलिए जब मैं डेटाबेस में एक नया मूवी रिकॉर्ड बनाना चाहता हूं, मेरे मूवीकंट्रोलर वर्ग के निम्नलिखित तरीके हो सकते हैं:
public function __construct(MovieRepositoryInterface $movieRepository, MovieServiceInterface $movieService)
{
$this->movieRepository = $movieRepository;
$this->movieService = $movieService;
}
public function postCreate()
{
if( ! $this->movieService->create(Input::all()))
{
return Redirect::back()->withErrors($this->movieService->errors())->withInput();
}
// New movie was saved successfully. Do whatever you need to do here.
}
यह निर्धारित करना आपके लिए है कि आप अपने नियंत्रकों को कैसे POST डेटा देते हैं, लेकिन मान लीजिए कि पोस्टक्रीट में इनपुट :: all () विधि द्वारा दिया गया डेटा कुछ इस प्रकार है:
$data = array(
'movie' => array(
'title' => 'Iron Eagle',
'year' => '1986',
'synopsis' => 'When Doug\'s father, an Air Force Pilot, is shot down by MiGs belonging to a radical Middle Eastern state, no one seems able to get him out. Doug finds Chappy, an Air Force Colonel who is intrigued by the idea of sending in two fighters piloted by himself and Doug to rescue Doug\'s father after bombing the MiG base.'
),
'actors' => array(
0 => 'Louis Gossett Jr.',
1 => 'Jason Gedrick',
2 => 'Larry B. Scott'
),
'director' => 'Sidney J. Furie',
'studio' => 'TriStar Pictures'
)
चूंकि MovieRepository को डेटाबेस में अभिनेता, निर्देशक या स्टूडियो रिकॉर्ड बनाने का तरीका नहीं पता होना चाहिए, हम अपने MovieService क्लास का उपयोग करेंगे, जो कुछ इस तरह दिख सकता है:
public function __construct(MovieRepositoryInterface $movieRepository, ActorRepositoryInterface $actorRepository, DirectorRepositoryInterface $directorRepository, StudioRepositoryInterface $studioRepository)
{
$this->movieRepository = $movieRepository;
$this->actorRepository = $actorRepository;
$this->directorRepository = $directorRepository;
$this->studioRepository = $studioRepository;
}
public function create(array $input)
{
$movieData = $input['movie'];
$actorsData = $input['actors'];
$directorData = $input['director'];
$studioData = $input['studio'];
// In a more complete example you would probably want to implement database transactions and perform input validation using the Laravel Validator class here.
// Create the new movie record
$movie = $this->movieRepository->create($movieData);
// Create the new actor records and associate them with the movie record
foreach($actors as $actor)
{
$actorModel = $this->actorRepository->create($actor);
$movie->actors()->save($actorModel);
}
// Create the director record and associate it with the movie record
$director = $this->directorRepository->create($directorData);
$director->movies()->associate($movie);
// Create the studio record and associate it with the movie record
$studio = $this->studioRepository->create($studioData);
$studio->movies()->associate($movie);
// Assume everything worked. In the real world you'll need to implement checks.
return true;
}
तो जो हम छोड़ गए हैं वह चिंताओं का एक अच्छा, समझदार अलगाव है। रिपॉजिटरी केवल एलोक्वेंट मॉडल के बारे में जानते हैं जो वे डेटाबेस से सम्मिलित करते हैं और प्राप्त करते हैं। नियंत्रकों को रिपॉजिटरी के बारे में परवाह नहीं है, वे केवल उपयोगकर्ता से एकत्र किए गए डेटा को बंद कर देते हैं और इसे उपयुक्त सेवा में भेज देते हैं। सेवा को इस बात की परवाह नहीं है कि यह प्राप्त डेटा को डेटाबेस में कैसे सहेजा जाता है, यह नियंत्रक द्वारा उपयुक्त रिपॉजिटरी को दिए गए प्रासंगिक डेटा को बंद कर देता है।