লারাভেলে সম্পর্ক পরিচালনা করা, সংগ্রহস্থলের প্যাটার্নটিকে মেনে চলা


120

লারাভেল-তে ভাল ডিজাইনের ধরণ নিয়ে টি। ওটওয়েলের বই পড়ার পরে লারাভেল 4-তে একটি অ্যাপ তৈরি করার সময় আমি নিজেকে অ্যাপ্লিকেশনের প্রতিটি টেবিলের জন্য সংগ্রহস্থল তৈরি করতে দেখলাম।

আমি নিম্নলিখিত টেবিল কাঠামো দিয়ে শেষ করেছি:

  • ছাত্র: আইডি, নাম
  • কোর্স: আইডি, নাম, শিক্ষক_আইডি
  • শিক্ষক: আইডি, নাম
  • অ্যাসাইনমেন্টস: আইডি, নাম, কোর্স_আইডি
  • স্কোর (শিক্ষার্থী এবং অ্যাসাইনমেন্টের মধ্যে একটি পাইভট হিসাবে কাজ করে): ছাত্রী_ইড, অ্যাসাইনমেন্ট_আইডি, স্কোর

এই সমস্ত সারণীর জন্য পদ্ধতিগুলি অনুসন্ধান করুন, তৈরি করুন, আপডেট করুন এবং মুছুন সহ আমার কাছে সংগ্রহশালা ক্লাস রয়েছে। প্রতিটি সংগ্রহশালীর একটি স্বতন্ত্র মডেল থাকে যা ডাটাবেসের সাথে ইন্টারঅ্যাক্ট করে। লারাভেলের ডকুমেন্টেশন অনুযায়ী সম্পর্কের বিষয়টি মডেলটিতে সংজ্ঞায়িত করা হয়: http://laravel.com/docs/eloquent# সম্পর্কযুক্তি

একটি নতুন কোর্স তৈরি করার সময়, আমি যা করি তা কোর্স সংগ্রহস্থলটিতে তৈরি পদ্ধতি কল করে। এই কোর্সে অ্যাসাইনমেন্ট রয়েছে, সুতরাং একটি তৈরি করার সময়, আমি অবশ্যই কোর্সের প্রতিটি শিক্ষার্থীর জন্য স্কোরের টেবিলে একটি এন্ট্রি তৈরি করতে চাই। আমি এ্যাসাইনমেন্ট রিপোজিটরির মাধ্যমে এটি করি। এটি অ্যাসাইনমেন্ট এবং স্টুডেন্ট মডেলের সাথে দুটি স্পষ্টত মডেলের সাথে অ্যাসাইনমেন্ট রিপোজিটরি যোগাযোগ করে।

আমার প্রশ্নটি হ'ল: এই অ্যাপটি সম্ভবত আকারে বৃদ্ধি পাবে এবং আরও বেশি সম্পর্কের সূচনা হবে, তাই কি ভাল ভান্ডারগুলিতে বিভিন্ন প্রচ্ছন্ন মডেলগুলির সাথে যোগাযোগ করা বা এটির পরিবর্তে অন্যান্য সংগ্রহশালা ব্যবহার করে করা উচিত (আমি বলতে চাইছি অ্যাসাইনমেন্ট সংগ্রহশালা থেকে অন্যান্য সংগ্রহস্থলগুলিকে কল করা) ) বা এটি সমস্ত একসাথে স্বতন্ত্র মডেলগুলিতে করা উচিত?

এছাড়াও, অ্যাসাইনমেন্ট এবং শিক্ষার্থীদের মধ্যে একটি স্কোর টেবিলকে একটি প্রধান বিষয় হিসাবে ব্যবহার করা ভাল অভ্যাস বা এটি অন্য কোথাও করা উচিত?

উত্তর:


71

আপনি মতামত চাইছেন মনে রাখবেন: ডি

এখানে আমার:

টিএল; ডিআর: হ্যাঁ, ঠিক আছে।

আপনি ভাল করছেন!

আপনি প্রায়শই ঠিক যা করেন তা আমি করি এবং এটি দুর্দান্ত কাজ করে find

আমি প্রায়শই, প্রতি টেবিলে রেপো রাখার পরিবর্তে ব্যবসায়িক লজিকের আশেপাশে সংগ্রহস্থলগুলি সংগঠিত করি। আপনার অ্যাপ্লিকেশনটি আপনার "ব্যবসায়িক সমস্যা" কীভাবে সমাধান করতে হবে সেদিকেই এটি কেন্দ্রীভূত দৃষ্টিভঙ্গি হিসাবে এটি দরকারী।

একটি কোর্স একটি "সত্তা", বৈশিষ্ট্য (শিরোনাম, আইডি, ইত্যাদি) এবং এমনকী অন্যান্য সত্তা (অ্যাসাইনমেন্টস, যার নিজস্ব বৈশিষ্ট্য এবং সম্ভবত সত্তা রয়েছে) with

আপনার "কোর্স" সংগ্রহস্থলটি একটি কোর্স এবং কোর্সগুলির বৈশিষ্ট্য / অ্যাসাইনমেন্ট (অ্যাসাইনমেন্ট সহ) ফেরত দিতে সক্ষম হওয়া উচিত।

ভাগ্যক্রমে আপনি এটিকে সফল করতে পারেন।

(আমি প্রায়শই টেবিল প্রতি একটি সংগ্রহস্থল দিয়ে শেষ করি, তবে কিছু সংগ্রহাগুলি অন্যের তুলনায় অনেক বেশি ব্যবহৃত হয় এবং এর সাথে আরও অনেক পদ্ধতি রয়েছে Your অ্যাপ্লিকেশনটি কোর্সগুলির আশেপাশে আরও বেশি এবং কোর্সগুলির কার্যকরী সংগ্রহ সম্পর্কে কম) centers

জটিল অংশ

আমি প্রায়শই কিছু তথ্যভাণ্ডার ক্রিয়া করতে আমার সংগ্রহস্থলের অভ্যন্তরে সংগ্রহস্থলগুলি ব্যবহার করি।

ডেটা পরিচালনা করার জন্য স্বতঃস্ফূর্ত প্রয়োগ করে এমন কোনও সংগ্রহস্থল সম্ভবত প্রচ্ছন্ন মডেলগুলি ফিরিয়ে দেবে। এই আলোকে, যদি আপনার কোর্স মডেল অ্যাসাইনমেন্টগুলি (বা অন্য কোনও ব্যবহারের ক্ষেত্রে) পুনরুদ্ধার বা সংরক্ষণ করতে অন্তর্নির্মিত সম্পর্কগুলি ব্যবহার করে তবে তা ঠিক। আমাদের "বাস্তবায়ন" নির্বিশেষে নির্মিত।

ব্যবহারিক দৃষ্টিকোণ থেকে এটি উপলব্ধি করে। আমরা ডেটা উত্সগুলিকে এমন কিছুতে পরিবর্তন করার সম্ভাবনা বোধ করি যা খুব সহজেই হ্যান্ডেল করতে পারে না (কোনও অ-স্কিল ডেটা উত্সের কাছে)।

ORMS

এই সেটআপের সবচেয়ে জটিল অংশটি, আমার পক্ষে অন্ততপক্ষে, যদি এলওভার্ট আসলে আমাদের সহায়তা করে বা ক্ষতি করে থাকে তবে তা হ্রাসকারী। ওআরএমগুলি একটি জটিল বিষয়, কারণ তারা আমাদের ব্যবহারিক দৃষ্টিকোণ থেকে প্রচুর পরিমাণে সহায়তা করে, তারা আপনার "ব্যবসায়িক যুক্তি সত্তা" কোডটি ডেটা পুনরুদ্ধার করার সাথে সংযুক্ত করে।

আপনার ভাণ্ডারের দায়িত্ব আসলে ডেটা পরিচালনা করা বা সত্তাগুলির পুনরুদ্ধার / আপডেট পরিচালনার জন্য (ব্যবসায়িক ডোমেন সত্তা) এই ধরণের গোলমাল udd

তদুপরি, আপনার দৃষ্টিভঙ্গিতে আপনি যে বিষয়গুলি পাস করেন সেগুলি এগুলি একইভাবে কাজ করে। যদি আপনাকে পরে কোনও ভাণ্ডারগুলিতে স্বতন্ত্র মডেলগুলি ব্যবহার করা থেকে দূরে সরে যেতে হয়, আপনাকে অবশ্যই নিশ্চিত করতে হবে যে আপনার ভিউগুলিতে পাস করা ভেরিয়েবলগুলি একইভাবে আচরণ করে বা একই পদ্ধতি উপলভ্য রয়েছে, অন্যথায় আপনার ডেটা উত্সগুলি পরিবর্তন করা আপনার পরিবর্তনে রূপান্তরিত হবে মতামত, এবং আপনি (আংশিকভাবে) প্রথমে সংগ্রহস্থলগুলিতে আপনার যুক্তি বিমোচন করার উদ্দেশ্যটি হারিয়েছেন - আপনার প্রকল্পের রক্ষণাবেক্ষণটি হ্রাস পাবে।

যাইহোক, এগুলি কিছুটা অসম্পূর্ণ চিন্তাভাবনা। এগুলি যেমন বলা হয়েছে, কেবলমাত্র আমার মতে এটিই ডোমেন চালিত ডিজাইন পড়ার ফলাফল এবং গত বছরের মধ্যে রুবি মিডওয়েষ্টে "মামার বব" এর মূল বক্তব্য দেখার মত ফলাফল ।


1
আপনার মতে, সংগ্রহশালা যদি সুস্পষ্ট অবজেক্টের পরিবর্তে ডেটা স্থানান্তর অবজেক্টগুলি ফেরত দেয় তবে এটি একটি ভাল বিকল্প হবে? অবশ্যই এটি স্পষ্টতই ডিটিওর থেকে অতিরিক্ত রূপান্তর বোঝায় তবে এইভাবে, কমপক্ষে আপনি বর্তমান নিয়ন্ত্রক থেকে আপনার নিয়ন্ত্রক / দৃষ্টিভঙ্গি পৃথক করে নিন।
ফেডেরিভো

1
আমি নিজে এটি নিয়ে কিছুটা পরীক্ষা করে দেখেছি এবং ব্যবহারিক দিক থেকে এটি একটু খুঁজে পেয়েছি। বলা হচ্ছে, আমি বিমূর্তে এই ধারণাটি পছন্দ করি। তবে আলোকসজ্জার ডেটাবেস সংগ্রহের বস্তুগুলি অ্যারেগুলির মতোই কাজ করে এবং মডেল অবজেক্টগুলি স্টাডক্লাসের মতো পর্যাপ্ত বস্তুগুলির মতোই কাজ করে যাতে আমরা ব্যবহারিকভাবে বলতে পারি, বুদ্ধিমানের সাথে লেগে থাকতে পারি এবং ভবিষ্যতে অ্যারে / অবজেক্টগুলি আমাদের প্রয়োজন হওয়া উচিত।
ফিদেলোপার

4
@ ফিডেলোপার আমি অনুভব করছি যে আমি যদি সংগ্রহস্থলগুলি ব্যবহার করি তবে আমি ওআরএম এর পুরো সৌন্দর্যটি হারিয়ে ফেলছি যা স্পষ্টরূপে সরবরাহ করে। আমার সংগ্রহস্থল পদ্ধতির মাধ্যমে কোনও অ্যাকাউন্টের পুনরুদ্ধার করার সময় $a = $this->account->getById(1)আমি কেবল পদ্ধতিগুলি চেইন করতে পারি না $a->getActiveUsers()। ঠিক আছে, আমি ব্যবহার করতে পারি $a->users->..., তবে তারপরে আমি একটি স্পষ্টত সংগ্রহ এবং কোনও স্টাডক্লাসের অবজেক্ট ফিরিয়ে দিচ্ছি না এবং আবার এলওভার্টের সাথে আবদ্ধ tied এর সমাধান কী? ব্যবহারকারী সংগ্রহস্থলে অন্য পদ্ধতি ঘোষণা করছেন $user->getActiveUsersByAccount($a->id);? আপনি কীভাবে এটি সমাধান করবেন তা শুনতে খুব পছন্দ করবে ...
সান্তা ক্রুজের

1
ওআরএমগুলি এন্টারপ্রাইজ (ish) -level আর্কিটেকচারের জন্য ভয়ঙ্কর কারণ তারা এ জাতীয় সমস্যা সৃষ্টি করে। শেষ অবধি, আপনাকে সিদ্ধান্ত নিতে হবে আপনার আবেদনের জন্য কী সর্বাধিক অর্থ বোধ করে। স্বতঃস্ফূর্তভাবে অলিউল্ট (the০% সময়ের!) সহ সংগ্রহস্থল ব্যবহার করার সময় আমি স্ট্রোক্লাস এবং অ্যারেগুলির মতো মডেলগুলি এবং সংগ্রহগুলির চিকিত্সা করার জন্য আমার সবচেয়ে চেষ্টা করি (কারণ আপনি পারেন!) তাই আমার যদি প্রয়োজন হয় তবে অন্য কিছুতে স্যুইচ করা সম্ভব।
ফিদেলোপার

5
এগিয়ে যান এবং অলস-বোঝা মডেলগুলি ব্যবহার করুন। আপনি যদি সত্যিকারের ডোমেন মডেলগুলি এমনভাবে কাজ করতে পারেন তবে আপনি যদি কখনও এলোভুল্ট ব্যবহার বাদ দেন। কিন্তু গম্ভীরভাবে, তুমি করত আউট বলিয়ে কি কখনো সুইচ? এক পয়সা ইন, এক পাউন্ডের জন্য! ("বিধিগুলি" বদ্ধ থাকার চেষ্টা করে ওভারবোর্ডে যাবেন না! আমি আমার সমস্ত সময় ভঙ্গ করি)
ফিডেলোপার

224

আমি লারাভেল 4 ব্যবহার করে একটি বৃহত প্রকল্প শেষ করছি এবং আপনি এখনই জিজ্ঞাসা করছেন এমন সমস্ত প্রশ্নের উত্তর দিতে হয়েছিল। ল্যানপব এবং লভেনপবগুলিতে প্রচুর উপলব্ধ লারাভেল বই এবং টন গুগলিং পড়ার পরে আমি নীচের কাঠামোটি নিয়ে এসেছি।

  1. ডেটেবল টেবিলের জন্য একটি স্বতন্ত্র মডেল শ্রেণি
  2. এলওভার্ট মডেল অনুসারে একটি ভান্ডার ক্লাস
  3. একটি পরিষেবা শ্রেণি যা একাধিক সংগ্রহস্থল শ্রেণীর মধ্যে যোগাযোগ করতে পারে।

সুতরাং ধরা যাক আমি একটি মুভি ডেটাবেস তৈরি করছি। আমার কমপক্ষে নিম্নলিখিত নিম্নোক্ত মডেল ক্লাসগুলি থাকতে হবে:

  • সিনেমা
  • চিত্রশালা
  • পরিচালক
  • অভিনেতা
  • পুনঃমূল্যায়ন

একটি সংগ্রহস্থল শ্রেণি প্রতিটি স্বতন্ত্র মডেল শ্রেণিকে আবদ্ধ করে এবং ডাটাবেসে সিআরইউডি অপারেশনের জন্য দায়বদ্ধ থাকবে। সংগ্রহস্থল শ্রেণিগুলি এর মতো দেখতে পারে:

  • 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.
}

আপনি কীভাবে আপনার কন্ট্রোলারদের কাছে ডেটা পোস্ট করেন তা নির্ধারণ করা আপনার পক্ষে, তবে আসুন আমরা ইনপুট দ্বারা পোস্ট করা ডেটা :: সমস্ত () পোস্টক্রিয়েট () পদ্ধতিতে দেখানো হয়েছে:

$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'
)

যেহেতু মুভিরপোসিটোরিটি ডেটাবেসে অভিনেতা, পরিচালক বা স্টুডিও রেকর্ড তৈরি করবেন তা জানা উচিত নয়, তাই আমরা আমাদের মুভি সার্ভিস ক্লাসটি ব্যবহার করব, যা দেখতে এরকম কিছু দেখায়:

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

সুতরাং আমরা যা রেখেছি তা হ'ল উদ্বেগগুলির একটি দুর্দান্ত, বোধগম্য বিচ্ছেদ। ভান্ডারগুলি কেবলমাত্র সুনির্দিষ্ট মডেল সম্পর্কে সচেতন যা তারা প্রবেশ করে এবং ডাটাবেস থেকে পুনরুদ্ধার করে। কন্ট্রোলাররা সংগ্রহস্থলগুলির বিষয়ে চিন্তা করে না, তারা কেবল তাদের ব্যবহারকারীর কাছ থেকে সংগ্রহ করা ডেটা বন্ধ করে উপযুক্ত পরিষেবাতে দেয়। সেবা গ্রাহ্য না করে কিভাবে ডেটা পায় ডাটাবেসের সংরক্ষিত হয়, এটা ঠিক প্রাসঙ্গিক ডেটা উপযুক্ত ভান্ডার নিয়ামক দ্বারা দেওয়া হয় বন্ধ হাত।


8
এই মন্তব্যটি এখন পর্যন্ত ক্লিনার, আরও স্কেলযোগ্য এবং রক্ষণাবেক্ষণযোগ্য পদ্ধতির।
আন্দ্রেস

4
+1 টি! এটি আমাকে অনেক সাহায্য করবে, আমাদের সাথে ভাগ করে নেওয়ার জন্য আপনাকে ধন্যবাদ! আপনি কীভাবে পরিষেবাগুলির অভ্যন্তরীণ জিনিসগুলিকে বৈধতা দিয়েছিলেন তা ভাবছেন, যদি সম্ভব হয় তবে আপনি কী করেছিলেন তা সংক্ষেপে ব্যাখ্যা করতে পারছেন? যাহোক তোমাকে ধন্যবাদ! :)
পাওলো ফ্রেইটাস

6
@ পাওলো ফ্রেইটাসের মতো বলেছিলেন, আপনি বৈধতা অংশটি কীভাবে পরিচালনা করেন তা দেখতে আকর্ষণীয় হবে এবং আমি ব্যতিক্রম অংশগুলিতেও আগ্রহী (আপনি কি ব্যতিক্রম, ইভেন্টগুলি ব্যবহার করেন বা আপনি কেবল এটি হ্যান্ডেল করেন যা আপনি নিজের পরামর্শ হিসাবে মনে করেন বলে মনে হয়) আপনার পরিষেবাগুলিতে বুলিয়ান রিটার্নের মাধ্যমে নিয়ন্ত্রণকারী?) ধন্যবাদ!
নিকোলাস 13

11
ভাল লিখুন, যদিও আমি নিশ্চিত না যে আপনি মুভি কন্ট্রোলারে মুভি রেপোসিটোরি কেন ইনজেকশন করছেন কারণ নিয়ামক সরাসরি সংগ্রহস্থল দিয়ে কিছু করা উচিত নয়, না আপনার পোস্টের তৈরি পদ্ধতি মুভি রিপোসিটোরি ব্যবহার করে না, তাই আমি ধরে নিয়েছি যে আপনি ভুল করে এটিকে রেখে গেছেন ?
ডেভিডনাইটনাইট

15
এ সম্পর্কে প্রশ্ন: আপনি কেন এই উদাহরণে সংগ্রহস্থল ব্যবহার করছেন? এটি সত্যই প্রশ্ন - আমার কাছে দেখে মনে হচ্ছে আপনি রিপোজিটরিগুলি ব্যবহার করছেন তবে কমপক্ষে এই উদাহরণে রিপোজিটরিটি সত্যিই কিছু করছে না বরং ইওলিউভারের মতো একই ইন্টারফেস সরবরাহ করছে এবং শেষ পর্যন্ত আপনি এখনও এলওলিউডের সাথে আবদ্ধ রয়েছেন কারণ আপনার পরিষেবা শ্রেণিটি এতে সরাসরি স্পষ্টভাবে ব্যবহার করছে ( $studio->movies()->associate($movie);)।
কেভিন মিচেল

5

আমি "সঠিক বা ভুল" না দিয়ে আমার কোডটি কী করছে এবং এর জন্য কী দায়বদ্ধ তা বিবেচনা করতে চাই। এইভাবে আমি আমার দায়িত্বগুলি ছিন্ন করি:

  • নিয়ন্ত্রণকারীরা হ'ল এইচটিটিপি স্তর এবং অন্তর্নিহিত এপিআইএসের মাধ্যমে রুটের অনুরোধগুলি (ওরফে, এটি প্রবাহকে নিয়ন্ত্রণ করে)
  • মডেলগুলি ডাটাবেস স্কিমা উপস্থাপন করে এবং অ্যাপ্লিকেশনটিকে ডেটা দেখতে কেমন, কী সম্পর্ক থাকতে পারে এবং সেই সাথে যে কোনও বিশ্বব্যাপী বৈশিষ্ট্য যা প্রয়োজনীয় হতে পারে তা জানায় (যেমন একটি সংক্ষিপ্ত প্রথম এবং শেষ নাম ফেরত দেওয়ার জন্য একটি নাম পদ্ধতি)
  • সংগ্রহস্থলগুলি মডেলগুলির সাথে আরও জটিল প্রশ্ন এবং মিথস্ক্রিয়া উপস্থাপন করে (আমি মডেল পদ্ধতিতে কোনও প্রশ্ন করি না)।
  • অনুসন্ধান ইঞ্জিন - ক্লাস যা আমাকে জটিল অনুসন্ধান অনুসন্ধান তৈরি করতে সহায়তা করে।

এটিকে মনে রেখে, প্রতিবারই কোনও সংগ্রহশালা ব্যবহার করার বিষয়টি বোঝা যায় (আপনি ইন্টারফেসগুলি তৈরি করেন কিনা। ইত্যাদি একটি সম্পূর্ণ অন্যান্য বিষয়)। আমি এই পদ্ধতির পছন্দ করি, কারণ এর অর্থ হ'ল যখন আমাকে নির্দিষ্ট কাজ করার প্রয়োজন হয় তখন আমি ঠিক কোথায় যাব।

আমি একটি বেস সংগ্রহস্থলও গড়ে তোলার ঝোঁক, সাধারণত একটি বিমূর্ত শ্রেণি যা মূল ডিফল্টগুলি সংজ্ঞায়িত করে - মূলত CRUD অপারেশন, এবং তারপরে প্রতিটি শিশু কেবল প্রয়োজনীয়ভাবে প্রসারিত বা যুক্ত করতে পারে বা ডিফল্টগুলি ওভারলোড করতে পারে। আপনার মডেল ইনজেকশন এছাড়াও এই নিদর্শন বেশ শক্তিশালী হতে সাহায্য করে।


আপনি কি আপনার বেসরেপোসিটরিটি বাস্তবায়ন করতে পারবেন? আমি আসলে এটিও করি এবং আপনি যা করেছেন আমি আগ্রহী।
ওডিসি

GetById, getByName, getByTitle, সংরক্ষণ করুন পদ্ধতিগুলি সংরক্ষণ করুন et - সাধারণত এমন পদ্ধতি যা বিভিন্ন ডোমেনের মধ্যে থাকা সমস্ত ভান্ডারগুলিতে প্রয়োগ হয়।
ওডম্যান

5

সংগ্রহস্থলগুলি আপনার ডেটা (কেবলমাত্র আপনার ওআরএম নয়) এর একটি ধারাবাহিক ফাইলিং মন্ত্রিসভা হিসাবে ভাবেন। ধারণাটি হ'ল আপনি API ব্যবহারের জন্য একটি ধারাবাহিক সরল উপায়ে ডেটা দখল করতে চান।

আপনি যদি নিজেকে কেবল মডেল :: সমস্ত (), মডেল :: সন্ধান (), মডেল :: তৈরি () করছেন বলে মনে করেন তবে আপনি সম্ভবত কোনও সংগ্রহস্থল বিমূর্ত করার ফলে খুব বেশি উপকার পাবেন না। অন্যদিকে, আপনি যদি আপনার প্রশ্ন বা ক্রিয়াকলাপের জন্য আরও কিছুটা যুক্তিযুক্ত যুক্তি করতে চান, তবে আপনি ডেটা নিয়ে কাজ করার জন্য এপিআই ব্যবহার করা আরও সহজ করার জন্য একটি সংগ্রহশালা তৈরি করতে চাইতে পারেন।

আমি মনে করি আপনি জিজ্ঞাসা করেছিলেন যে কোনও মডেলগুলি সংযুক্ত করার জন্য প্রয়োজনীয় আরও কিছু ভার্বোস সিনট্যাক্সের সাথে মোকাবিলা করার জন্য কোনও সংগ্রহস্থল সবচেয়ে ভাল উপায়। পরিস্থিতির উপর নির্ভর করে আমি কিছু জিনিস করতে পারি:

  1. একটি পিতা বা মাতা মডেলের বন্ধ একটি নতুন শিশু মডেল Hanging (এক এক বা এক-অনেক), আমি একটি পদ্ধতি মত সন্তান সংগ্রহস্থলের কিছু যোগ হবে createWithParent($attributes, $parentModelInstance)এবং এই শুধু যোগ হবে $parentModelInstance->idমধ্যে parent_idগুণাবলী এবং কল তৈরি ক্ষেত্রে।

  2. অনেকগুলি সম্পর্ক সংযুক্ত করে আমি আসলে মডেলগুলিতে ফাংশন তৈরি করি যাতে আমি উদাহরণস্বরূপ> সংযুক্তিচিল্ড ($ চাইল্ডইনস্ট্যান্স) চালাতে পারি। নোট করুন যে এটি উভয় পক্ষের বিদ্যমান উপাদান প্রয়োজন।

  3. এক দৌড়ে সম্পর্কিত মডেলগুলি তৈরি করে আমি এমন কিছু তৈরি করি যা আমি একটি গেটওয়ে কল করি (এটি ফওলারের সংজ্ঞা থেকে কিছুটা দূরে হতে পারে)। আমি যে পদ্ধতিতে পরিবর্তন করতে পারে বা যে কোনও নিয়ামক বা কমান্ডে থাকা যুক্তিটিকে জটিল করে তুলবে তার পরিবর্তে আমি $ গেটওয়ে-> ক্রিয়েটেন্ট প্যারেন্টএন্ডচিল্ডকে ($ প্যারেন্টএট্রিবিউটস, A চাইল্ডঅ্যাট্রিবিউটস) কল করতে পারি that

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.