Я в своей системе реализую некий UI Builder.
Есть предопределенные поля Input, Checkbox и т.д.
Однако, должна быть возможность создавать пользовательские поля.
При этом такие поля обязаны придерживаться определенных соглашений, чтобы система не сломалась. Например, поля обязаны реализовать метод render. И не как-то, и именно так, как положено.
Для этого я во всех встроенных полях реализую интерфейс FieldContract
interface FieldContract {
public function render(Repository $repository): ViewContract;
}
Теперь сторонний разработчик, захотевший написать расширение к системе будет обязан реализовать в своих кастомных полях интерфейс FieldContract.
А я внутри системы всегда уверен, что у поля есть необходимый метод с необходимой сигнатурой, даже если это поле реализовал сторонний разработчик.