<turbo-stream action="append" target="posts_list"><template>    <div class="postbit" id="11004" data-post-id="11004">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="StevenXL" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/StevenXL/120/886_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  StevenXL
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I’m also interested in this question.</p>
<p>I’m working on a personal project, and I’m at the point where I have to start building the web interface.</p>
<p>As I understand it, my choices are:</p>
<ol>
<li>Go Lance’s route (of developing both applications completely separately and then use the <code>path</code> option to include my domain logic app in my web interface app.</li>
<li>Build an umbrella project and use the <code>in_umbrella</code> option.</li>
</ol>
<p>I do not know what the tradeoffs are. I’m specifically wondering what happens to my git commit history if I go with an umbrella project. It seems that the <code>path</code> option would allow me to not worry about this question, but I do not know if I am just setting myself up for headaches when it comes to deployment. (Currently I’m not using GitHub or anything - just git, so I don’t want to use the <code>git</code> option).</p>
<p>Thanks folks!</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="11004" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/phoenix-is-not-your-application-questions/735/12">Post #11</a>
	                </div>
	            </div>
              <div id="likers-container-11004" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="11004"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #11"></div>
  </section>
</div>
    <div class="postbit" id="11011" data-post-id="11011">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="josevalim" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/josevalim/120/1787_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  josevalim
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Creator of Elixir</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="Qqwy" data-post="4" data-topic="735">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/qqwy/48/1349_2.png" class="avatar"> Qqwy:</div>
<blockquote>
<p>Phoenix integrates tightly with Ecto through phoenix_ecto. It seems that when one moves the persistence layer to its own part in an umbrella application, the advantages of Phoenix working with Ecto are lost.</p>
</blockquote>
</aside>
<p>The integration is the opposite of tight. <img src="https://forum.elixirforum.com/images/emoji/apple/slight_smile.png?v=15" title=":slight_smile:" class="emoji" alt=":slight_smile:" loading="lazy" width="20" height="20"> Phoenix defines protocols and Ecto implements those protocols, that’s literally the only thing that is happening in phoenix_ecto. So if you want to hook anything else, you should be fine.</p>
<p>But even though, I believe it is fine for your context to return a changeset. For example, if you have <code>MyApp.Account.insert_user(params)</code> and that returns <code>{:error, changeset}</code>, the changeset is useful even if you were not using Ecto because it contains all kinds of relevant information about your parameters and what exactly worked and what exactly didn’t. Exactly the kind of things you would yield in an error response page for an API.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="11011" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/phoenix-is-not-your-application-questions/735/13">Post #12</a>
	                </div>
	            </div>
              <div id="likers-container-11011" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="11011"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #12"></div>
  </section>
</div>
    <div class="postbit" id="11012" data-post-id="11012">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="josevalim" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/josevalim/120/1787_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  josevalim
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Creator of Elixir</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="StevenXL" data-post="12" data-topic="735">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/stevenxl/48/886_2.png" class="avatar"> StevenXL:</div>
<blockquote>
<ol>
<li>Go Lance’s route (of developing both applications completely separately and then use the path option to include my domain logic app in my web interface app.</li>
<li>Build an umbrella project and use the in_umbrella option.</li>
</ol>
</blockquote>
</aside>
<p>Those options are largely equivalent. The <code>:in_umbrella</code> option is a shortcut for specifying the <code>:path</code> option, nothing more. I would personally choose the second option though because most likely you want to version those two things in the same repository. Otherwise you end-up in a source control management kind of hell where you always need to commit, push and sync two applications whenever you implement a feature.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="11012" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/phoenix-is-not-your-application-questions/735/14">Post #13</a>
	                </div>
	            </div>
              <div id="likers-container-11012" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="11012"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #13"></div>
  </section>
</div>
    <div class="postbit" id="11086" data-post-id="11086">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="StevenXL" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/StevenXL/120/886_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  StevenXL
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Thank you <a class="mention" href="/u/josevalim" rel="nofollow">@josevalim</a> for the reply. Seems like the umbrella route makes sense.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="11086" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/phoenix-is-not-your-application-questions/735/15">Post #14</a>
	                </div>
	            </div>
              <div id="likers-container-11086" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="11086"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #14"></div>
  </section>
</div>
    <div class="postbit" id="11185" data-post-id="11185">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="StevenXL" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/StevenXL/120/886_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  StevenXL
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I think the following two resources should also be included when others are trying to learn how to take Phoenix (or really any application) and split it apart into logical domains.</p>
<ol>
<li>
<p><a href="https://github.com/wojtekmach/acme_bank" rel="noopener nofollow ugc">Acme Bank GitHub Repo</a> by <a class="mention" href="/u/wojtekmach" rel="nofollow">@wojtekmach</a> - besides the invaluable code examples, it includes a link to slides as well as an upcoming video.</p>
</li>
<li>
<p><a href="https://youtu.be/XhNacMst_1o?list=PLWbHc_FXPo2ivlIjzcaHS9N_Swe_0hWj0" rel="noopener nofollow ugc">Controller Control</a> conference talk by <a class="mention" href="/u/gazler" rel="nofollow">@Gazler</a>.</p>
</li>
</ol>
<p>Thank you both - very valuable work!</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="11185" data-batch-url="/posts/batch_likers">
                        5
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/phoenix-is-not-your-application-questions/735/16">Post #15</a>
	                </div>
	            </div>
              <div id="likers-container-11185" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="11185"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #15"></div>
  </section>
</div>
    <div class="postbit" id="11283" data-post-id="11283">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="anders" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/anders/120/2345_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  anders
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>The talk reminds me of the pattern of Hexagonal architecture as presented way back in 2008 on <a href="http://alistair.cockburn.us/Hexagonal+architecture" rel="noopener nofollow ugc">http://alistair.cockburn.us/Hexagonal+architecture</a> aka Build your domain stuff without dependencies on concrete databases or web frameworks (or any frame works), then build adapters. Ecto and Phoenix could be used in such adapters.</p>
<p>Taken together with the DDD concept of <a href="http://martinfowler.com/bliki/BoundedContext.html" rel="noopener nofollow ugc">Bounded Contexts</a> - where you define what actually is your application domains, and an <a href="http://martinfowler.com/bliki/UbiquitousLanguage.html" rel="noopener nofollow ugc">Ubiquitous Language</a> - where you start naming modules, functions and files in the terminology of domain experts - this idea of separation makes a lot of sense.</p>
<p>I’m new to Phoenix and Elixir, but if my experience from other languages is a relevant indicator, I would say the overhead you pay in building and maintaining the framework adapter (the interface in the talk) is worth it if you have a moderately complex domain (say 15+ models) or if you need to maintain the code for more than three years. In four years you might want to replace Phoenix with the new Elixir web framework Xineohp and it shouldn’t have to be a lot of work (same goes for Otce).</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="11283" data-batch-url="/posts/batch_likers">
                        3
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/phoenix-is-not-your-application-questions/735/17">Post #16</a>
	                </div>
	            </div>
              <div id="likers-container-11283" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="11283"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #16"></div>
  </section>
</div>
    <div class="postbit" id="27613" data-post-id="27613">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="peerreynders" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/peerreynders/120/5826_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  peerreynders
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p><a href="https://forum.elixirforum.com/t/new-pragprog-elixir-phoenix-book-will-be-on-sale-tomorrow/4231" rel="nofollow">New Pragprog Elixir &amp; Phoenix book will be on sale tomorrow</a></p>
<h2><a name="p-27613-functional-web-development-with-elixir-otp-and-phoenix-1" class="anchor" href="#p-27613-functional-web-development-with-elixir-otp-and-phoenix-1" aria-label="Heading link" rel="nofollow"></a>Functional Web Development with Elixir, OTP, and Phoenix</h2>
<p>Rethink the Modern Web App<br>
by Lance Halvorsen</p>
<p>Well, this is going to be interesting!</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="27613" data-batch-url="/posts/batch_likers">
                        3
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/phoenix-is-not-your-application-questions/735/18">Post #17</a>
	                </div>
	            </div>
              <div id="likers-container-27613" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="27613"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #17"></div>
  </section>
</div>
    <div class="postbit" id="32140" data-post-id="32140">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="StevenXL" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/StevenXL/120/886_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  StevenXL
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p><a class="mention" href="/u/anders" rel="nofollow">@anders</a> Completely agree with your thoughts here. I haven’t gone through your source materials (assuming Fowler is the source), but Scott Wlaschin does a great job of summarizing <a href="https://skillsmatter.com/skillscasts/4971-domain-driven-design-with-scott-wlaschin" rel="noopener nofollow ugc">DDD, Bounded Contexts, and Ubiquitous Language</a> in the context of functional programming.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="32140" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/phoenix-is-not-your-application-questions/735/19">Post #18</a>
	                </div>
	            </div>
              <div id="likers-container-32140" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="32140"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-last-post cat-last-post" title="Last post!"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <span class="all-loaded">— All posts loaded —</span>
</div></template></turbo-stream>