å°å ¥ïŒé·å¹Žéçšããã·ã¹ãã ãžã®æè¬ãšæ±ºæ
é·å¹Ž PHP ç¬èª MVC ã§ Web ãµã€ããéçšããŠããçµéšãããç§ã¯**ãåãã®éèŠæ§ãçæããŠããŸããç¹ã«ãããã³ããšã³ãïŒNext.jsïŒãšããã¯ãšã³ãïŒDjangoïŒã API çµç±ã§æ¥ç¶ããã¢ãã³ãªéçºã«ç§»è¡ããéãå€ãã·ã¹ãã èšèšãåŒãèµ·ãããèŠããªããã°ã**ã«çŽé¢ããŸããã
ããããJavaScript ã®äžçã§å€çºãã**ãany å°çã**ã§ãã
API ããéãããŠããããŒã¿ããå®éã«ã¯äœåãªã®ãïŒããäžæç¢ºãªãŸãŸéçºãé²ãããšãéçºå¹çã¯åçã«äœäžããåŸã èŽåœçãªãã°ã®æž©åºã«ãªããŸããæ¬èšäºã§ã¯ããã®**ãã¬ã¬ã·ãŒ API å°çãããã®è±åŽãç®æãããç§ã® TypeScript å°å ¥ãšãany æé€ãžã®æŠãã**ã®èšé²ãå ¬éããŸãã
第1ç« ïŒPHP ç¬èª MVC ããåŒãç¶ãã æè¡çè² åµ
1. ããŒã¿åãææ§ãªã¬ã¬ã·ãŒ API ã®çŸå®
ã¬ã¬ã·ãŒãªã·ã¹ãã ã§ã¯ãããŒã¿ããŒã¹ããã®ããŒã¿ååŸã API ã®ã¬ã¹ãã³ã¹åœ¢åŒãå³å¯ã«å®çŸ©ãããŠããªãããšãå€ã ãããŸããç§ã®æ§ PHP ç¬èª MVC ãµã€ããäŸå€ã§ã¯ãããŸããã§ããã
- åé¡ç¹:
- ã¬ã¹ãã³ã¹ã®ãã£ãŒã«ãåãéäžã§å€æŽãããŠããããã³ãåŽã§ãšã©ãŒã«ãªããªãã
- æ°å€ïŒID ã CountïŒãæååãšããŠè¿ã£ãŠããããšããããèšç®æã«å®è¡æãšã©ãŒãçºçããã
- ããŒã¿ãååšããªãå Žåãnull ãè¿ãã®ãã空ã®é åãè¿ãã®ããçµ±äžãããŠããªãã
ãããã®åé¡ã¯ãåœæã® JavaScript éçºã«ãããŠ**ããã®ããŒã¿ã¯äœåã ãšä¿¡ãããïŒã**ãšããå±äººçãªå€æã«å§ããããŠããŸããã
2. ã¢ãã³ãª Next.js ç°å¢ãžã®æªåœ±é¿
Next.js ã®éçºãå§ãããšãããããã®ã¬ã¬ã·ãŒ API ããã®ãŸãŸå©çšãããšããã£ããå°å ¥ãã TypeScript ã®æ©æµãå šãåããããªãããšã倿ããŸããã
TypeScript
// åå®çŸ©ããªããšããããªã£ãŠããŸã...
const fetchData = async () => {
const res = await fetch('/legacy/api/data');
const data: any = await res.json(); // anyå°çã®å§ãŸã
console.log(data.item_name.length); // item_nameããªãå Žåãå®è¡æãšã©ãŒïŒ
return data;
};
éçºã®åææ®µéã§ data: any ãå€çšãããšãTypeScript ã®æå€§ã®ã¡ãªããã§ãã**ã³ã³ãã€ã«æïŒã³ãŒãèšè¿°æïŒ**ã®ãšã©ãŒãã§ãã¯ãæ©èœããããããã°æéãå¢å ãããšããæ¬æ«è»¢åãªäºæ
ã«é¥ããŸãã
第2ç« ïŒTypeScript ãš Zod ã«ããã峿 Œãªéçªãã®èšçœ®
ãã®èª²é¡ã解決ãããããç§ã¯ãAPI ã¬ã¹ãã³ã¹ã®åã¯ãã¯ã©ã€ã¢ã³ããµã€ãïŒNext.js åŽïŒã§å³å¯ã«æ€èšŒããããšããæ¹éãç«ãŠãŸããã
1. TypeScript ã€ã³ã¿ãŒãã§ãŒã¹ã«ããæåŸ å€ã®æç¢ºå
ãŸããAPI ãè¿ãã§ãããçæ³ã®ããŒã¿æ§é ã TypeScript ã® Interface ã§å®çŸ©ããŸããã
TypeScript
// æåŸ
ãããŠãŒã¶ãŒããŒã¿æ§é ã峿 Œã«å®çŸ©
export interface UserData {
id: number;
username: string;
is_active: boolean;
profile?: { // ãªãã·ã§ãã«ãªå€ãæç¢ºã«
bio: string;
};
}
ãã® Interface ãå®çŸ©ããã ãã§ããéçºæã®è£å®æ©èœïŒã€ã³ããªã»ã³ã¹ïŒãå¹ããäœæ¥å¹çãåäžããŸãããAPI ããã®åã«åŸã£ãŠããä¿èšŒã¯ãŸã ãããŸããã
2. ã©ã³ã¿ã€ã ããªããŒã·ã§ã³ã©ã€ãã©ãª Zod ã®å°å ¥
ããã§éµãšãªãã®ãã**ã©ã³ã¿ã€ã ïŒå®è¡æïŒ**ã«ããŒã¿ã®åãæ€èšŒããã©ã€ãã©ãªã§ãã Zod ã®å°å ¥ã§ãã
Zod ã䜿ãããšã§ããããã¯ãŒã¯ããååŸãã JSON ããŒã¿ããäºåã«å®çŸ©ãã TypeScript ã® InterfaceïŒSchemaïŒã«äžèŽããããå®è¡æã«ãã§ãã¯ã§ããŸãã
TypeScript
import { z } from 'zod';
// Zodã§Schemaãå®çŸ© (ãããInterfaceã®åœ¹å²ãå
Œãã)
const UserSchema = z.object({
id: z.number().int(),
username: z.string(),
is_active: z.boolean(),
profile: z.object({
bio: z.string(),
}).optional(), // 'profile' ããªãå¯èœæ§ãå®çŸ©
});
// Zodã®SchemaããTypeScriptã®åãèªåçæ
export type UserData = z.infer<typeof UserSchema>;
// APIåŒã³åºãåŸã®ããŒã¿æ€èšŒ
const data = await res.json();
try {
// ããã§å³æ Œã«ãã§ãã¯ïŒåãåããªããã°ãšã©ãŒãæãã
const validatedData = UserSchema.parse(data);
// ããããå
ã¯ãvalidatedData 㯠UserDataåãšããŠå®å
šã«æ±ãã
} catch (error) {
// ãã°ã«èšé²ããäžæ£ãªããŒã¿ã¯åŠçããªã
console.error("APIã¬ã¹ãã³ã¹ã®åãäžæ£ã§ã", error);
}
ãã® Zod ã®å°å ¥ã¯ãAPI ãšããã³ããšã³ãã®éã«**ã峿 Œãªéçªããèšçœ®ããããšãæå³ããŸããããã«ãããã¬ã¬ã·ãŒ API ããã®äžæ£ãªããŒã¿æµå ¥ãé²ããNext.js åŽã®ã³ãŒãããå®å šã« any ãæé€**ããããšãå¯èœã«ãªããŸããã
ãŸãšãïŒå®å šãªã·ã¹ãã æ§ç¯ãžç¹ããäžæ©
1. any æé€ãããããã广
**ãany æé€ãžã®æŠãã**ã¯ãåãªãã³ãŒãã£ã³ã°èŠçŽã®å€æŽã§ã¯ãããŸããã§ããã
- éçºå¹çã®åäž: TypeScript ã«ããã³ã³ãã€ã«æãã§ãã¯ãšãZod ã«ããã©ã³ã¿ã€ã ãã§ãã¯ã®äºéäœå¶ã«ããããããã°æéãå€§å¹ ã«åæžãããŸããããã°ã¯å®è¡æã§ã¯ãªããã³ãŒããæžããªãã解決ã§ããããã«ãªããŸããã
- ä¿å®æ§ã®åäž: ããŒã¿ã®åãæž¡ãã«é¢ããèª€è§£ãæšæž¬ããªããªããæªæ¥ã®èªåãããŒã ã¡ã³ããŒãå®å¿ããŠã³ãŒãã倿Žã§ããããã«ãªããŸããã
- èšèšã®æ¹å: Zod ã§ API ã®æ§é ã峿 Œã«å®çŸ©ããéçšã§ãDjango åŽã® API èšèšã«ãããäžåãäžçµ±äžãªç¹ãæç¢ºã«ãªããããã¯ãšã³ãã®æ¹åã«ãç¹ãã£ãŠããŸãã
2. èªèµ°åãçãã åŠã³ãšå±æ
PHP ã®ç·©ãåç°å¢ã§é·ãéçºãããŠãããããããç§ã¯**ãåãã®æã€é²åŸ¡åãšçç£æ§**ãæ·±ãçè§£ã§ããŸããã
ãã®èª²é¡ãç¬åã§èŠã€ããTypeScript ã Zod ãšãã£ãã¢ãã³ãªãœãªã¥ãŒã·ã§ã³ãå°å ¥ã»é©çšã§ããçµéšã¯ãç§ã®èªåŸçãªèª²é¡è§£æ±ºèœåã蚌æãããã®ã ãšèªè² ããŠããŸãã
ã¬ã¬ã·ãŒãªã·ã¹ãã ç§»è¡ã¯å°é£ã䌎ããŸãããäžã€äžã€ã®æè¡çè² åµãè§£æ¶ããŠããããšã§ãã·ã¹ãã ã¯å ç¢ã«ãªããéçºè ãšããŠã®èªä¿¡ãæ·±ãŸããŸãã
次åã®èšäºã§ã¯ããã® API ãé ä¿¡ããããã¯ãšã³ããšããŠæ¡çšãã Django REST Framework ã®èšèšæŠç¥ã«ã€ããŠè©³ãã解説ããäºå®ã§ãã


ã³ã¡ã³ã