Является воспитанником Академии им. Ф. Черенкова. Первую игру за основную команду «Спартака» провёл 28 сентября 2013 года, выйдя на 88-й минуте на поле вместо Юры Мовсисяна в гостевом матче 11-го тура с «Зенитом». После прихода в «Спартак» нового главного тренера Мурата Якина стал регулярно выходить на замену. 17 августа 2014 года поучаствовал в победе своего клуба над ЦСКА (1:0) в дерби, выйдя на замену на 67-й минуте, вместо Маджида Уориса.
5 сентября 2014 года участвовал в матче открытия первого в истории клуба «Спартак» Москва стадиона. Под руководством швейцарского тренера Мурата Якина, «Спартак» сыграл в ничью (1:1) с сербской командой «Црвена Звезда» из города Белград. В этом матче вышел на замену.
8 марта 2015 года в первом официальном матче 2015 года против «Краснодара» отдал голевую передачу на Квинси Промеса. 15 марта в дерби против московского «Динамо» Денис вышел в стартовом составе, а в следующем матче против «Торпедо» провёл на поле все 90 минут и вновь ассистировал Квинси Промесу. 25 октября в матче против московского «Динамо» Денис забил свой первый гол за Спартак в РФПЛ, а также отдал голевую передачу.
В феврале 2016 года Денис на правах аренды перешёл в чешский «Млада-Болеслав».