2016-11-30 58 views
2

我試圖從Laravel應用程序中的叔叔Bob應用Clean Architecture清潔架構中的控制器

我所關心的是:正如叔叔鮑勃所描述的,控制器應該屬於第三圈:接口適配器(從內向外)。這意味着Controller僅依賴於用例圓(第二),並且不應該知道第四個圓的框架。

但是控制器在一些框架具有延伸的基類(例如,一個AbstractController類),它也需要接收一個請求對象,並有時返回一個響應對象,所以這有點打破清潔的依賴關係規則架構,因爲它知道外圍的框架。

我誤解了嗎?如果不是有任何解決方案不打破依賴規則

我的控制器看起來像這樣:

use Illuminate\Http\Request; 
use Illuminate\Routing\Controller; 
use User\UseCase\FetchUsers; 
use User\UseCase\FetchUsersRequest; 

class UserController extends Controller 
{ 
    public function index(Request $request, FetchUsers $fetchUsersUseCase) 
    { 
     $useCaseRequest = new FetchUsersRequest(
      // extract data from Request 
     ); 

     $useCaseResponse = $fetchUsersUseCase->handle($useCaseRequest); 

     return [ 
      'users' => $useCaseResponse->users, 
     ]; 
    } 
} 

回答

1

AbstractController是屬於第三圈。所以你不打破任何依賴。並且如果您有數據傳輸對象(DTO)用例圓圈傳輸數據到第三個圈子您不打破任何依賴關係。

爲了做到這一點,您應該爲所有請求和響應創建DTO,將您的實體映射到DTO並共享DTO而不是實體。

例如:您有一個User實體,其字符串變量名爲Name。您有一個將從use-cases圈子中獲取用戶的控制器。

解決方案:使用字符串變量(您可以稱其爲Name)創建一個名爲UserDto的DTO。控制器知道UserDto但不是User entity

+0

是的,我已經** DTO **了。但是控制器在第三個圈中提到了Laravel(通過使用一些'Illuminate'類),所以它會打破依賴規則? –

+0

如果你在第二個圓圈定義你的DTO,你不會違反任何依賴規則 – cokceken

0

有點太晚了,但是您可以在用例圓中創建一個特定控制器的接口(這將在乾淨架構中稱爲輸入端口)。

然後就可以實現在第三圈的界面,就像

// In the use-cases circle 
interface UserControllerInterface(){ 

    public function index(Request $request, FetchUsers $fetchUsersUseCase); 

} 

// In the third circle 
class UserController extends Controller implements UserControllerInterface{ 

    public function index(Request $request, FetchUsers $fetchUsersUseCase){ 
     $useCaseRequest = new FetchUsersRequest(
      // extract data from Request 
     ); 

     $useCaseResponse = $fetchUsersUseCase->handle($useCaseRequest); 

     return [ 
      'users' => $useCaseResponse->users, 
     ]; 
    } 
} 

這樣你就不會違反紀律。