<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: howyi</title>
    <description>The latest articles on Forem by howyi (@howyi).</description>
    <link>https://forem.com/howyi</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F132495%2F6b8cc32d-18db-4c9f-a21e-14089b497d00.png</url>
      <title>Forem: howyi</title>
      <link>https://forem.com/howyi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/howyi"/>
    <language>en</language>
    <item>
      <title>📡 Built "rundown" — An AI-Powered RSS Reader at Railway Hackathon</title>
      <dc:creator>howyi</dc:creator>
      <pubDate>Mon, 11 Aug 2025 09:09:11 +0000</pubDate>
      <link>https://forem.com/sbox/built-rundown-an-ai-powered-rss-reader-at-railway-hackathon-39o6</link>
      <guid>https://forem.com/sbox/built-rundown-an-ai-powered-rss-reader-at-railway-hackathon-39o6</guid>
      <description>&lt;h2&gt;
  
  
  📝 Overview
&lt;/h2&gt;

&lt;p&gt;"rundown" crawls your subscribed RSS feeds every 15 minutes, detects new or updated articles, and sends you a neat AI-powered summary. You can tweak the summary language &amp;amp; length, and get notifications via Discord Webhook.&lt;/p&gt;

&lt;p&gt;source code: &lt;a href="https://github.com/howyi/rundown" rel="noopener noreferrer"&gt;https://github.com/howyi/rundown&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;I jumped into &lt;a href="https://railway.com/hackathon" rel="noopener noreferrer"&gt;Railway Hackathon 2025&lt;/a&gt; and built &lt;strong&gt;"rundown"&lt;/strong&gt; — an AI-powered RSS reader that keeps an eye on your feeds, auto-summarizes new content, and pings you when something fresh drops. Here’s a quick tour of what it does, how it’s built, and what it was like to make it all happen on Railway.&lt;/p&gt;

&lt;p&gt;The app is live on Railway at &lt;a href="https://rundown.sbox.studio" rel="noopener noreferrer"&gt;https://rundown.sbox.studio&lt;/a&gt; (not sure how long I’ll keep it up after the hackathon 🥴).&lt;/p&gt;




&lt;h2&gt;
  
  
  📝 Overview
&lt;/h2&gt;

&lt;p&gt;"rundown" crawls your subscribed RSS feeds every 15 minutes, detects new or updated articles, and sends you a neat AI-powered summary. You can tweak the summary language &amp;amp; length, and get notifications via Discord Webhook.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✨ Key Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  📚 1. RSS Feed Registration &amp;amp; Management
&lt;/h3&gt;

&lt;p&gt;Add as many RSS feeds as you like and manage them all in one place.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2fd4crqjtcgnflzv6o8o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2fd4crqjtcgnflzv6o8o.png" alt="RSS Feed Registration" width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🔍 2. Update Detection + AI Summarization
&lt;/h3&gt;

&lt;p&gt;Every 15 minutes, it scans your feeds, finds the new stuff, and summarizes it using &lt;strong&gt;gpt-5-nano&lt;/strong&gt;. Multi-language &amp;amp; adjustable length support included.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ogghc2n78ife7k0pdon.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ogghc2n78ife7k0pdon.gif" alt="AI Summarization" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🗓 3. Timeline View
&lt;/h3&gt;

&lt;p&gt;See all your summarized articles in chronological order, with easy browsing of past updates.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fra9g6ldpiq3dd7d6wtbq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fra9g6ldpiq3dd7d6wtbq.png" alt="Timeline" width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🔔 4. Discord Webhook Notifications
&lt;/h3&gt;

&lt;p&gt;Get instant updates in your Discord channels — perfect for teams or communities.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1aae1g7ytkh5556mtoz9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1aae1g7ytkh5556mtoz9.png" alt="Discord Webhook Notifications" width="800" height="257"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🔗 5. MCP Integration
&lt;/h3&gt;

&lt;p&gt;Hook it into your own tools and grab feed/article data programmatically.&lt;/p&gt;

&lt;p&gt;You can connect to the MCP server running at &lt;code&gt;rundown.sbox.studio/mcp&lt;/code&gt; using an API key generated from the settings page.&lt;br&gt;
The MCP server is built with &lt;a href="https://github.com/vercel/mcp-adapter" rel="noopener noreferrer"&gt;Vercel’s mcp-handler&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F17450f6wwhtndbzfjs6s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F17450f6wwhtndbzfjs6s.png" alt="MCP Integration" width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠 Tech Stack
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Frontend &amp;amp; Auth&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js for UI + Backend-for-Frontend&lt;/li&gt;
&lt;li&gt;better-auth for simple email/password login&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Backend Processing&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;BullMQ + Redis for async jobs&lt;/li&gt;
&lt;li&gt;OpenAI gpt-5-nano for AI summaries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Database&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PostgreSQL for feeds, articles, summaries, and user settings&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚙️ Built on Railway
&lt;/h2&gt;

&lt;p&gt;Everything’s running on Railway as separate services:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js App&lt;/li&gt;
&lt;li&gt;BullMQ Worker&lt;/li&gt;
&lt;li&gt;Redis&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;Bootstrap (runs migrations + re-registers cron jobs after deploy)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5vnfo0rthjoxx3qo0khp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5vnfo0rthjoxx3qo0khp.png" alt="Railway Infrastructure" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The code’s open-source here → &lt;a href="https://github.com/howyi/rundown" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; 🐙&lt;br&gt;
You can also spin up your own with this &lt;a href="https://railway.com/deploy/rundown-1" rel="noopener noreferrer"&gt;Railway Template&lt;/a&gt; — just drop in your OpenAI API key and you’re good to go.&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 Takeaways
&lt;/h2&gt;

&lt;p&gt;Railway made the whole multi-service setup ridiculously smooth — from creating services to managing env vars and logs. It’s a great fit for hackathons where you want to focus on building, not fighting your infrastructure.&lt;/p&gt;

&lt;p&gt;Next steps? More notification channels and fancier diff analysis.&lt;br&gt;
If you’re thinking about joining the next Railway Hackathon — do it. You’ll ship fast, meet cool people, and have fun doing it.&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>showdev</category>
      <category>railway</category>
      <category>hackathon</category>
    </item>
    <item>
      <title>🍗Show Dev: Posting Twitter search results to Slack for free and without writing code using AWS Amplify</title>
      <dc:creator>howyi</dc:creator>
      <pubDate>Wed, 21 Aug 2019 10:15:33 +0000</pubDate>
      <link>https://forem.com/howyi/show-dev-posting-twitter-search-results-to-slack-for-free-and-without-writing-code-using-aws-amplify-c3g</link>
      <guid>https://forem.com/howyi/show-dev-posting-twitter-search-results-to-slack-for-free-and-without-writing-code-using-aws-amplify-c3g</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dPvTcUsN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/m1omv6x3fgxo9aj65fsj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dPvTcUsN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/m1omv6x3fgxo9aj65fsj.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Repository
&lt;/h1&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qF2jUiUG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-6a5bca60a4ebf959a6df7f08217acd07ac2bc285164fae041eacb8a148b1bab9.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/howyi"&gt;
        howyi
      &lt;/a&gt; / &lt;a href="https://github.com/howyi/tweettoslack"&gt;
        tweettoslack
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="instapaper_body md"&gt;
&lt;p&gt;Search Twitter and send results to Slack automatically.&lt;br&gt;
Work on your AWS.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://console.aws.amazon.com/amplify/home#/deploy?repo=https://github.com/howyi/tweettoslack" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/8519f7aba64adae06041681329c1d2b26b0cbbda/68747470733a2f2f6f6e65636c69636b2e616d706c6966796170702e636f6d2f627574746f6e2e737667" alt="amplifybutton"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
Cost&lt;/h1&gt;
&lt;p&gt;It's free because it's all within the &lt;a href="https://aws.amazon.com/free/" rel="nofollow"&gt;AWS Free Tier&lt;/a&gt;.&lt;/p&gt;
&lt;h1&gt;
Requirements&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://api.slack.com/incoming-webhooks" rel="nofollow"&gt;Slack Incoming Webhook URL&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;SLACK_WEBHOOK_URL&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.twitter.com/en/docs/basics/authentication/guides/access-tokens.html" rel="nofollow"&gt;Twitter API Token&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;TWITTER_CONSUMER_KEY&lt;/li&gt;
&lt;li&gt;TWITTER_CONSUMER_SECRET&lt;/li&gt;
&lt;li&gt;TWITTER_ACCESS_TOKEN_KEY&lt;/li&gt;
&lt;li&gt;TWITTER_ACCESS_TOKEN_SECRET&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;
Deploy&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Click the &lt;code&gt;DEPLOY TO AMPLIFY CONSOLE&lt;/code&gt; button.&lt;/li&gt;
&lt;li&gt;After deploy, access to Lambda &lt;code&gt;tweettoslack-amplify&lt;/code&gt;. and set environment variables.
&lt;ul&gt;
&lt;li&gt;SEARCH_QUERY: &lt;a href="https://developer.twitter.com/en/docs/tweets/search/guides/standard-operators.html" rel="nofollow"&gt;Twitter standard search operators&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;
Diagram&lt;/h1&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://camo.githubusercontent.com/0896bd2379de378fa826e4b128b30b90d53d0167/68747470733a2f2f63646e2d616b2e662e73742d686174656e612e636f6d2f696d616765732f666f746f6c6966652f682f686f7779692f32303139303832302f32303139303832303030343331352e706e67"&gt;&lt;img src="https://camo.githubusercontent.com/0896bd2379de378fa826e4b128b30b90d53d0167/68747470733a2f2f63646e2d616b2e662e73742d686174656e612e636f6d2f696d616765732f666f746f6c6966652f682f686f7779692f32303139303832302f32303139303832303030343331352e706e67" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/howyi/tweettoslack"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;h1&gt;
  
  
  ScreenShot
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--B4CWjuTR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-ak.f.st-hatena.com/images/fotolife/h/howyi/20190820/20190820211259.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--B4CWjuTR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-ak.f.st-hatena.com/images/fotolife/h/howyi/20190820/20190820211259.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Cost
&lt;/h1&gt;

&lt;p&gt;It's free because it's all within the &lt;a href="https://aws.amazon.com/free/"&gt;AWS Free Tier&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Requirements
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://api.slack.com/incoming-webhooks"&gt;Slack Incoming Webhook URL&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;SLACK_WEBHOOK_URL&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.twitter.com/en/docs/basics/authentication/guides/access-tokens.html"&gt;Twitter API Token&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;TWITTER_CONSUMER_KEY&lt;/li&gt;
&lt;li&gt;TWITTER_CONSUMER_SECRET&lt;/li&gt;
&lt;li&gt;TWITTER_ACCESS_TOKEN_KEY&lt;/li&gt;
&lt;li&gt;TWITTER_ACCESS_TOKEN_SECRET
# Deploy&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Click the &lt;code&gt;DEPLOY TO AMPLIFY CONSOLE&lt;/code&gt; button.&lt;/li&gt;
&lt;li&gt;After deploy, access to Lambda &lt;code&gt;tweettoslack-amplify&lt;/code&gt;. and set environment variables.

&lt;ul&gt;
&lt;li&gt;SEARCH_QUERY: &lt;a href="https://developer.twitter.com/en/docs/tweets/search/guides/standard-operators.html"&gt;Twitter standard search operators&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>showdev</category>
      <category>aws</category>
      <category>amplify</category>
      <category>node</category>
    </item>
    <item>
      <title>🐔 I made a PHP Library "Conv-Laravel": Auto-generate MySQL migration queries. 🤖</title>
      <dc:creator>howyi</dc:creator>
      <pubDate>Tue, 19 Mar 2019 15:25:32 +0000</pubDate>
      <link>https://forem.com/howyi/-i-made-a-php-library-conv-laravel-auto-generate-mysql-migration-queries--45nl</link>
      <guid>https://forem.com/howyi/-i-made-a-php-library-conv-laravel-auto-generate-mysql-migration-queries--45nl</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5k1jgaizb38q6jazf1wu.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5k1jgaizb38q6jazf1wu.gif" alt="thumbnail" width="480" height="244"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://thepracticaldev.s3.amazonaws.com/i/eh53otutrf9c0vtduxlx.gif" rel="noopener noreferrer"&gt;full size&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/howyi" rel="noopener noreferrer"&gt;
        howyi
      &lt;/a&gt; / &lt;a href="https://github.com/howyi/conv-laravel" rel="noopener noreferrer"&gt;
        conv-laravel
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      MySQL migration query auto generate on Laravel/Lumen
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;conv-laravel&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;MySQL migration query auto generate on Laravel/Lumen&lt;/p&gt;
&lt;p&gt;
 &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/dc3c4bcdc6561dc99f47d19be1fae181855bc5a49f69e52c2105e215bad90a46/68747470733a2f2f7265732e636c6f7564696e6172792e636f6d2f70726163746963616c6465762f696d6167652f66657463682f732d2d526a675675684e562d2d2f635f6c696d6974253243665f6175746f253243666c5f70726f6772657373697665253243715f3636253243775f3838302f68747470733a2f2f74686570726163746963616c6465762e73332e616d617a6f6e6177732e636f6d2f692f68706d326435387162746c6d776d7731346c676c2e676966"&gt;&lt;img src="https://camo.githubusercontent.com/dc3c4bcdc6561dc99f47d19be1fae181855bc5a49f69e52c2105e215bad90a46/68747470733a2f2f7265732e636c6f7564696e6172792e636f6d2f70726163746963616c6465762f696d6167652f66657463682f732d2d526a675675684e562d2d2f635f6c696d6974253243665f6175746f253243666c5f70726f6772657373697665253243715f3636253243775f3838302f68747470733a2f2f74686570726163746963616c6465762e73332e616d617a6f6e6177732e636f6d2f692f68706d326435387162746c6d776d7731346c676c2e676966"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Install&lt;/h2&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;require library (Laravel/Lumen)&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;composer require "howyi/conv-laravel" --dev
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol start="2"&gt;
&lt;li&gt;publish config (only Laravel)&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;php artisan vendor:publish --provider="Howyi\ConvLaravel\ConvServiceProvider"
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol start="3"&gt;
&lt;li&gt;schema initialize (Laravel/Lumen)&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;php artisan conv:reflect
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;generate CREATE queries on &lt;code&gt;database/schemas&lt;/code&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Usage&lt;/h2&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;edit CREATE query (in schema directory)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;php artisan conv:generate&lt;/code&gt; to generate migrations from actual Database - CREATE queries&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;php artisan migrate&lt;/code&gt; to migration&lt;/li&gt;
&lt;/ol&gt;

&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/howyi/conv-laravel" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;h1&gt;
  
  
  feature
&lt;/h1&gt;

&lt;p&gt;Generate MySQL migration queries from actual DB (\PDO) and DDLs (CREATE queries)&lt;/p&gt;

&lt;h1&gt;
  
  
  motivation
&lt;/h1&gt;

&lt;p&gt;I'm tired of writing migration queries ... 😌&lt;/p&gt;

&lt;h2&gt;
  
  
  install
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;require library (Laravel/Lumen)
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;composer require "howyi/conv-laravel" --dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;publish config (only Laravel)
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan vendor:publish --provider="Howyi\ConvLaravel\ConvServiceProvider"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;schema initialize (Laravel/Lumen)
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan conv:reflect
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;generate CREATE queries on &lt;code&gt;database/schemas&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  usage
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;edit CREATE query (in schema directory)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;php artisan conv:generate&lt;/code&gt; to generate migrations from actual Database - CREATE queries&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;php artisan migrate&lt;/code&gt; to migration&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;
  
  
  example
&lt;/h1&gt;

&lt;p&gt;example repository 😉&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/howyi" rel="noopener noreferrer"&gt;
        howyi
      &lt;/a&gt; / &lt;a href="https://github.com/howyi/conv-laravel-example" rel="noopener noreferrer"&gt;
        conv-laravel-example
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;Example repository for &lt;a href="https://github.com/howyi/conv-laravel" rel="noopener noreferrer"&gt;conv-laravel&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/howyi/conv-laravel-example" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



</description>
      <category>conv</category>
      <category>php</category>
      <category>laravel</category>
      <category>showdev</category>
    </item>
    <item>
      <title>🍗Show Dev: json-schema-mapper - JSON Schema convert to jsonSerializable PHP classes</title>
      <dc:creator>howyi</dc:creator>
      <pubDate>Wed, 06 Feb 2019 13:20:32 +0000</pubDate>
      <link>https://forem.com/howyi/show-dev-json-schema-mapper---json-schema-convert-to-jsonserializable-php-classes--j24</link>
      <guid>https://forem.com/howyi/show-dev-json-schema-mapper---json-schema-convert-to-jsonserializable-php-classes--j24</guid>
      <description>&lt;p&gt;⭐&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/howyi" rel="noopener noreferrer"&gt;
        howyi
      &lt;/a&gt; / &lt;a href="https://github.com/howyi/json-schema-mapper" rel="noopener noreferrer"&gt;
        json-schema-mapper
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      JSON Schema Object|Enum to PHP classes
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a href="https://travis-ci.org/howyi/json-schema-mapper" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7adebeb4d0699275a29056c8c96037e2d19c16cbe6d0e2f005ed59a43baa0122/68747470733a2f2f7472617669732d63692e6f72672f686f7779692f6a736f6e2d736368656d612d6d61707065722e7376673f6272616e63683d6d6173746572" alt="Build Status"&gt;&lt;/a&gt;
&lt;a href="https://coveralls.io/github/howyi/json-schema-mapper?branch=master" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/5051d49f08cbde18c39459024c87ebea6a1d409f3cd11f452018a5951b9cb4f1/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f686f7779692f6a736f6e2d736368656d612d6d61707065722f62616467652e7376673f6272616e63683d6d6173746572" alt="Coverage Status"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;json-schema-mapper&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;JSON Schema Object|Enum to PHP classes&lt;/p&gt;
&lt;p&gt;document: &lt;a href="https://howyi.gitbooks.io/json-schema-mapper/" rel="nofollow noopener noreferrer"&gt;https://howyi.gitbooks.io/json-schema-mapper/&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;composer require howyi/json-schema-mapper&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;./vendor/bin/jsm map [jsonDir] [phpDir] [namespace] [templatePath]&lt;/pre&gt;

&lt;/div&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/howyi/json-schema-mapper" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;h1&gt;
  
  
  motivation
&lt;/h1&gt;

&lt;p&gt;I am tired of making a PHP class that matches Json-schema anymore 😵&lt;/p&gt;

&lt;h1&gt;
  
  
  install
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ composer require howyi/json-schema-mapper
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  usage
&lt;/h1&gt;

&lt;p&gt;Specify the target JSON directory and the map (PHP) directory and namespace and execute&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ ./vendor/bin/jsm map [jsonDir] [phpDir] [namespace] [templatePath]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  description
&lt;/h1&gt;

&lt;p&gt;A library that generates PHP classes that can be acquired from JSON Schema with &lt;code&gt;\json_encode()&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Convert JSON Schema type to PHP type as much as possible and do type hint&lt;/p&gt;

&lt;p&gt;When "type is string and format is date-time", the type hint becomes &lt;code&gt;\ DateTimeInterface&lt;/code&gt; and when converting the array automatically performs &lt;code&gt;-&amp;gt;format(\ DateTime::RFC3339)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The object specified by $ ref is converted to a type hint to the mapped interface&lt;/p&gt;

&lt;p&gt;Enum is generated alone as an Enum class that inherits &lt;code&gt;Eloquent\AbstractEnumration&lt;/code&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  example
&lt;/h1&gt;

&lt;h2&gt;
  
  
  directory
&lt;/h2&gt;

&lt;p&gt;JSON dir&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sample/json/
  ├ neta.json
  ├ osakanaType.json
  ├ shari.json
  └ sushi.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Converted PHP dir&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sample/generated/
  ├ Neta/
  │  ├ Neta.php
  │  ├ NetaInterface.php
  │  └ NetaTrait.php
  ├ Shari/
  │  ├ Shari.php
  │  ├ ShariInterface.php
  │  └ ShariTrait.php
  ├ Sushi/
  │  ├ Sushi.php
  │  ├ SushiInterface.php
  │  └ SushiTrait.php
  └ OsakanaType.php
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  file
&lt;/h2&gt;

&lt;p&gt;JSON (sushi.json)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"寿司情報"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sushiId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"寿司ID"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"integer"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sushiName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"寿司の名前"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"eatable"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"食べられるか"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"boolean"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"length"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"寿司の長さ"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"number"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"osakanaType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"お魚タイプ"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"$ref"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"osakanaType.json"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"neta"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ネタ"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"$ref"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./neta.json"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"shari"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"シャリ"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"$ref"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"./shari.json"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"expirationDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"消費期限"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"format"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"date-time"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"sushiId"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"sushiName"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"eatable"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"osakanaType"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"neta"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"shari"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"expirationDate"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"additionalProperties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Converted PHP(Class)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php

namespace Json\Sushi;

use Json\OsakanaType;
use Json\Neta\NetaInterface;
use Json\Shari\ShariInterface;

class Sushi implements SushiInterface
{
    use SushiTrait;

    protected $sushiId;
    protected $sushiName;
    protected $eatable;
    protected $length;
    protected $osakanaType;
    protected $neta;
    protected $shari;
    protected $expirationDate;
    protected $additionalProperties;

    public function __construct(
        int $sushiId,
        string $sushiName,
        bool $eatable,
        ?float $length,
        OsakanaType $osakanaType,
        NetaInterface $neta,
        ShariInterface $shari,
        \DateTimeInterface $expirationDate,
        array $additionalProperties = []
    ) {
        $this-&amp;gt;sushiId = $sushiId;
        $this-&amp;gt;sushiName = $sushiName;
        $this-&amp;gt;eatable = $eatable;
        $this-&amp;gt;length = $length;
        $this-&amp;gt;osakanaType = $osakanaType;
        $this-&amp;gt;neta = $neta;
        $this-&amp;gt;shari = $shari;
        $this-&amp;gt;expirationDate = $expirationDate;
        $this-&amp;gt;additionalProperties = $additionalProperties;
    }

    public function sushiId(): int
    {
        return $this-&amp;gt;sushiId;
    }

    public function sushiName(): string
    {
        return $this-&amp;gt;sushiName;
    }

    public function eatable(): bool
    {
        return $this-&amp;gt;eatable;
    }

    public function length(): ?float
    {
        return $this-&amp;gt;length;
    }

    public function osakanaType(): OsakanaType
    {
        return $this-&amp;gt;osakanaType;
    }

    public function neta(): NetaInterface
    {
        return $this-&amp;gt;neta;
    }

    public function shari(): ShariInterface
    {
        return $this-&amp;gt;shari;
    }

    public function expirationDate(): \DateTimeInterface
    {
        return $this-&amp;gt;expirationDate;
    }

    public function additionalProperties(): array
    {
        return $this-&amp;gt;additionalProperties;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Converted PHP(Trait)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php

namespace Json\Sushi;

trait SushiTrait
{
    use \JsonSchemaMapper\ObjectTrait;

    public function jsonProperties(): array
    {
        return [
            'sushiId',
            'sushiName',
            'eatable',
            'length',
            'osakanaType',
            'neta',
            'shari',
            'expirationDate',
        ];
    }

    public function allowAdditionalProperties(): bool
    {
        return true;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Converted PHP(Interface)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php

namespace Json\Sushi;

use JsonSchemaMapper\JsonArrayAccess;
use Json\Neta\NetaInterface;
use Json\OsakanaType;
use Json\Shari\ShariInterface;

interface SushiInterface extends JsonArrayAccess, \JsonSerializable
{
    public function toJsonArray(): array;

    public function jsonProperties(): array;

    public function allowAdditionalProperties(): bool;

    public function sushiId(): int;

    public function sushiName(): string;

    public function eatable(): bool;

    public function length(): ?float;

    public function osakanaType(): OsakanaType;

    public function neta(): NetaInterface;

    public function shari(): ShariInterface;

    public function expirationDate(): \DateTimeInterface;

    public function additionalProperties(): array;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>showdev</category>
      <category>php</category>
      <category>composer</category>
      <category>json</category>
    </item>
  </channel>
</rss>
