Первое что нужно это добавить в форму атрибут, что она может грузить файлы.
Потом ошибка бывает когда имя поля для файла не совпадает с именем файла в массиве $_FILES
Бывает что сервер настроен на минимальные настройки , и файл больше 2мб не лезет.
Потом я бы добавил проверку и вместо копирования исходника делал бы какую либо обработку
Ну а вообще поля уникальные, не должны быть редактируемые. Имя вполне может быть не уникальным. Иванов Иван. Например поле почты использовать для авторизации
Антон Р., ну как по мне сессии могут быть как отдельным модулем, как и частью реквеста, то есть все суперглобальные массивы в одном месте, то есть можно проверить есть ли ключ в гет, есть ли пост, то есть в контроллере вызвать проверку
$request->isPost(); проверить был ли сабмит формы, или проверить куку, сессию, файлы, юзер агент клиента. Респонз должен уметь ставить куку например , ставить заголовки, редирект например
Вообще каркас это mvc без mv , то есть пользователь сам должен решать взять ему доктрину или твиг, или другие удобные инструменты, например элокент и блэйд
То есть контроллер должен уметь принять реквест, что то сделать и отдать респонз. Например вызвать метод модели, по результату данных от модели, например ошибка, сделать редирект или подключить вью ошибки