Rumah > Soal Jawab > teks badan
P粉0869937882023-09-06 18:46:06
Jika anda ingin melaksanakan pendekatan polimorfik, lebih baik buat repositori atau sesuatu hanya untuk menguruskan logik itu.
Ini adalah contoh.
class SampleRepository { /** * repository instance value * * @var string[] | null */ private $sampleArray; // maybe here is SEASON or EXPIRY or null /** * constructor * * @param string[] | null $sampleArray */ public function __construct($sampleArray) { $this->sampleArray = $sampleArray; } /** * execute like class interface role * * @return array */ public function execute() { return (!$this->sampleArray) ? [] : $this->getResult(); } /** * get result * * @return array */ private function getResult() { // maybe pattern will be better to manage another class or trait. $pattern = [ "SEASON" => new Season(), "EXPIRY" => new Expiry() ]; return collect($this->sampleArray)->map(function($itemKey){ $requestClass = data_get($pattern,$itemKey); if (!$requestClass){ // here is space you don't expect class or canIt find correct class return ["something wrong"]; } return $requestClass->execute(); })->flatten(); } }
Boleh panggil macam ni.
$sampleRepository = new SampleRepository($sampleValue); // expect string[] or null like ["SEASON"],["SEASON","EXPIRY"],null $result = $sampleRepository->execute(); // [string] or [string,string] or []
Kaedah ini hanya berfungsi dengan nilai parameter anda yang ditentukan. Jika keputusan pulangan kelas Musim dan kelas Tamat tempoh adalah hampir sama, adalah lebih baik untuk mengurusnya mengikut ciri. (iaitu $pattern dalam kod contoh)
Cuba sikit.
Saya baca komen, jadi ikuti..
Sebagai contoh, ia lebih suka hanya mendapatkan hasil getResult(). Oleh itu, corak tertentu dan banyak logik tidak boleh ditulis pada getResult();
Jika anda menggunakan ciri, berikut adalah contoh. Pertama, anda perlu mencipta kelas tingkah laku pengurusan.
kelakuan.php
<?php namespace App\Repositories; class Behavior { use Behavior\BehaviorTrait; // if you need to add another pattern, you can add trait here. }
Kemudian, anda perlu mencipta direktori Gelagat pada tahap yang sama. Apabila anda mengalihkan direktori ini, anda mencipta fail tandatangan sedemikian.
<?php namespace App\Repositories\Behavior; trait BehaviorTrait { public static function findAccessibleClass(string $itemKey) { return data_get([ "SEASON" => new Season(), "EXPIRY" => new Expiry() ],$itemKey); } }Kaedah
findAccessibleClass() bertanggungjawab untuk mencari kelas yang betul.
Kemudian, anda boleh memanggil kaedah ini seperti ini.
private function getResult() { return collect($this->sampleArray)->map(function($itemKey){ $requestClass = Behavior::findAccessibleClass($itemKey); // fix here. if (!$requestClass){ // here is space you don't expect class or canIt find correct class return ["something wrong"]; } return $requestClass->execute(); })->flatten(); }
Jika terdapat terlalu banyak kod dalam getResult(), adalah lebih baik untuk memisahkan kod yang bertanggungjawab.
Untuk mencipta Trait Tingkah Laku, getResult tidak perlu bertanggungjawab terhadap logik tingkah laku. Pendek kata, ia akan menjadi mudah untuk diuji atau diperbaiki.
Semoga semuanya berjalan lancar.