2016-11-30 4 views
2

Я пытаюсь применить Clean Architecture от дяди Боба в приложении Laravel.Контроллер в чистой архитектуре

Что я имею в виду: Как говорит дядя Боб, Контроллер должен принадлежать третьему кругу: Адаптеры интерфейса (из наизнанку). Это означает, что Контроллер зависит только от Use Case Circle (2nd) и не должен знать ничего о структуре в 4-м круге.

Но контроллер в некоторых рамках должен расширяет базовый класс (например, класс AbstractController), он также должен получить объект запроса, а иногда и возвращают объект ответа, так что это своего рода нарушить правило зависимость от Clean Архитектура, поскольку она знает о структуре во внешнем круге.

Не понимаю ли я? Если нет, то есть решение не нарушать правило зависимости?

Мой контроллер выглядит так:

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.

Решение: Создайте DTO с именем UserDto со строковой переменной (вы можете назвать ее Name). Контроллер знает 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, 
     ]; 
    } 
} 

В этом случае вы не будете нарушать дисциплину.

Смежные вопросы