Взаимодействие нескольких репозиториев. Как объединить?
Получается, что ProductRepository зависит от других репозиториев (Category, ProductType, Image, File....).
Это уж как сделаете. Может зависеть, а может и нет. Я бы не завязывал одно на другое. Пусть там будет похожий код... ничего страшного.Теперь главный вопрос - как собирать товар (или другую сущность) из разных кусков?
Руками.Как обрабатывать метод $productRepository->save($product), если разные куски товара сохраняются по-разному. 
Индивидуально. Руками.Как быть с масштабированием, если в будущем появится еще что-то?
Или взять ORM или, опять же, руками. Не бойтесь писать код и не бойтесь его дублирования в разумных пределах. Не всё то DRY что им кажется.
Не знаю, насколько это хорошо в архитектурном плане. Как вариант, можно, у сущности Product добавить методы-геттеры или методы-модификаторы, которые будут дергать нужные репозитории.$product = $productRepository->findOne(100);
$product->getCategories(); // Здесь по принципу lazy load ищем в нужном репозитории
$product->removeCategories();
В результате, так по цепочке можно связываться с нужными хранилищами.