Конечная роль - организация схемы соединения устройств по различным шинам (Ethernet, USB, COM и т.д., необязательно компьютерным).
При создании порта в конструктор порта передаём объект устройства, тем самым мы уже привязываем порт к устройству, почему не сделать следующий шаг и не вызвать метод $unit->addPort($this) там же, мне кажется это логичным (хотя перед принятием данного способа пробовал в коде оба варианта).
Метод проверки уникальности находится в устройстве, но вызов, действительно, из порта. Изначально проверка была в устройстве, но потом перенесена в порт. Также, чтобы переименовать порт был метод $unit->changePortName($port, $new_name), но теперь это внутри порта, чтобы имя порта нельзя было сделать невалидным никак. Например, сделать $port->changeName(); $port_repo->flush(); изменения ушли в БД уже не получится, валидатор будет ругаться.
Да, это кусок ответственность программиста, но они все разные и могут забыть сделать предварительную проверку команды, а при batch, видимо придётся отдельно писать проверки, либо вызывать оригинальный сервис изменения n-раз, чтобы не дублировать код.
Устройство не м.б. агрегатом, т.к. ссылки в других частях системы идут на сам порт.