Paris Saint-Germain won the French league in Kylian Mbapp’s last season at the club after Monaco lost 3-2 at Lyon on Sunday.
PSG has an unassailable 12-point lead over second-place Monaco, which has three games left.
The Ligue 1 triumph is PSG’s third in a row and a record-extending 12th overall.
Mbapp has been involved in six of them, but comes off contract at the end of the season. He’s expected to be signed by Real Madrid.
PSG is on course for a potential historic treble as it will play at Borussia Dortmund in the first leg of the Champions League semifinals on Wednesday and face Lyon in the French Cup final on May 25.
In coach Luis Enrique’s first season at the club, PSG produced one of the most dominant seasons in league history with just one loss in 31 games so far.
PSG could have secured the title a day earlier but was held 3-3 by Le Havre on Saturday.
“Our fans are incredible. We were losing 1-0, 3-1, and they kept supporting us,” Luis Enrique said after the draw. “We managed to draw later on and effectively win the league thanks to the supporters, thanks to their positive attitude.”
That was quite a contrast with the past couple of seasons.
Last season, PSG supporters were booing Lionel Messi even though the soccer great was the player who helped the club clinch an 11th league title by scoring in a 1-1 draw with Strasbourg.
Two years ago, there was a similar disconnect between the supporters and the club. PSG supporters kept protesting at Parc des Princes by giving their team the silent treatment.
Now this season could be the most exciting of all.
Lyon substitute Malick Fofana capitalized on a counterattack in the 84th minute to score the winner and snap Monaco’s four-game winning streak.
Monaco striker Wissam Ben Yedder scored twice while Lyon winger Said Benrahma notched a goal and an assist.
Lyon kept alive its European hopes while Monaco is only two points clear of Brest.
Brest made club history by qualifying for any European competition for the first time with a 5-4 win over Rennes on Sunday.
In an emotional roller coaster for Brest, defender Lilian Brassier scored the winner in the seventh minute of stoppage time by heading home a free kick. Brest remained third – in the last automatic Champions League spot – and secured a top-six finish, which means a Europa Conference League playoff spot at least.
“The end of the game is unexplainable. It sums up our season. What we have achieved since the start of the season is extraordinary,” Brest midfielder Jonas Martin told broadcaster Canal Plus. “In third place with three rounds left, even in our dreams we didn’t think about it.”
Fourth-place Lille kept pace with Brest in the race for Champion League spots by rallying to beat relegation-threatened Metz 2-1.
Turkey midfielder Yusuf Yuzici scored the winner in the 44th by pouncing on a rebound to score with a first-time effort.
Fifth-place Nice beat Strasbourg 3-1 to stay four points behind Lille. Evann Guessand, Dante and Morgan Sanson scored for Nice.
Toulouse secured safety by rallying past Lorient 2-1 with goals from Thijs Dallinga and Ibrahim Cissoko. Lorient remained in the relegation zone, three points from safety.
Bottom side Clermont kept alive its hopes of safety by stunning Reims 4-1 with two goals from Muhammed Cham and a brace from Elbasan Rashani.
The 31st round ends later Sunday with Marseille vs. Lens.