大家好,這是我首次發問。
我對於我們即將面對的改變有一些疑問,希望有經驗的大家可以給我一些指點。
我們的公司計劃更改現行的開發模式,並打算導入Laravel框架並與現有公司框架並行。
而我將會是主要負責laravel的人,之後如果其他人也會把我的案子當範本使用,因為公司內其他人都是寫原生php。
因此我也沒人可以討論...所以上來詢問!
我預計會在原本MVC價購基礎上加入Service和Repository的設計模式。
以下是我會創建的檔案:
Services\BaseService.php
Services\AddDataService.php
Services\DeleteDataService.php
上述檔案將繼承BaseService類別。
Repositories\BaseRepository.php
Repositories\ModelRepository
這裡的"Model"是多個以Model命名的Repository。
上述檔案將繼承BaseRepository類別。
預計的程式碼如下:
class XXXXRepository extends BaseRepository
{
protected $XXXX;
public function __construct(XXXX $XXXX)
{
$this->model = $XXXX;
}
}
因為我們將在後台使用圖片和文字來上架和刪除各個頁面,所以我打算在BaseService中一次性地注入數個ModelRepository。
程式碼如下:
class BaseService
{
protected $XXXXRepo;
protected $OOOORepo;
protected $AAAARepo;
protected $BBBBRepo;
public function __construct(
XXXXRepository $XXXXRepo,
OOOORepository $OOOORepo,
AAAARepository $AAAARepo,
BBBBBRepository $BBBBBRepo
){
$this->XXXXRepo = $XXXXRepo;
$this->OOOORepo = $OOOORepo;
$this->AAAARepo = $AAAARepo;
$this->BBBBRepo = $BBBBRepo;
}
}
這樣的設計可以讓我方便地在每個Service中使用這些Repository,程式碼如下:
class AddDataService extends BaseService
{
public function addXXXX(Request $request, $id)
{
$data = $this->XXXXRepo->create([
//略
]);
}
public function addOOOO(Request $request, $id)
{
$data = $this->OOOORepo->create([
//略
]);
}
public function addAAAA(Request $request, $id)
{
$data = $this->AAAARepo->create([
//略
]);
}
public function addBBBB(Request $request, $id)
{
$data = $this->BBBBRepo->create([
//略
]);
}
}
想詢問一下這樣會不會讓BaseService過度肥大進而影響效能之類的,
因為我的想法是想說創建AddDataService讓他只負責處理新增資料的工作,
但一次性注入一堆Repo後,DeleteDataService也要再做一次,
不如寫在BaseService內讓所有Service都可以一次繼承,
之後即使有單獨的Service也可以直接使用對應的Repo
感覺你的 AddDataService
有點包山包海,但良好的設計應該根據業務邏輯拆開
例如拆成 AddCustomerDataService
、AddProductDataService
,所以 AddCustomerDataService
應該就只會用到 CustomerRepository
(或是其他有相關的 Repository,不一定只會有一個)
此外我個人不建議用"動作"來作為切 Service 的基準,應該是以對應的業務範圍來切分
以剛剛的 AddCustomerDataService
與 DeleteCustomerDataService
為例,我會覺得合併到 CustomService
會比較好一些
class CustomService
{
public function __construct(
protected CustomRepository $repository
) {}
// add data
public function create(Request $request)
{
$this->repository->create('...')
// ...
}
// delete data
public function destroy(Request $request, Customer $custom)
{
$this->repository->destroy($custom->id)
// ...
}
}
以上小弟淺見,供大大參考