Skip to content

Commit ea9cb84

Browse files
caldempseyJosé Valim
authored andcommitted
Clarify Application.get_env by illustrating a use case (#7929)
Signed-off-by: José Valim <[email protected]>
1 parent b7b7282 commit ea9cb84

File tree

1 file changed

+35
-0
lines changed

1 file changed

+35
-0
lines changed

lib/elixir/lib/application.ex

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,41 @@ defmodule Application do
404404
405405
If the configuration parameter does not exist, the function returns the
406406
`default` value.
407+
408+
## Examples
409+
410+
`get_env/3` is commonly used to read the configuration of your OTP applications.
411+
Since Mix configurations are commonly used to configure applications, we will use
412+
this as a point of illustration.
413+
414+
Consider a new application `:my_app`. `:my_app` contains a database engine which
415+
supports a pool of databases. The database engine needs to know the configuration for
416+
each of those databases, and that configuration is supplied by key-value pairs in
417+
environment of `:my_app`.
418+
419+
config :my_app, Databases.RepoOne,
420+
# A database configuration
421+
ip: "localhost"
422+
port: 5433
423+
424+
config :my_app, Databases.RepoTwo,
425+
# Another database configuration (for the same OTP app)
426+
ip: "localhost"
427+
port: 20717
428+
429+
config :my_app, my_app_databases: [Databases.RepoOne, Databases.RepoTwo]
430+
431+
Our database engine used by `:my_app` needs to know what databases exist, and
432+
what the database configurations are. The database engine can make a call to
433+
`get_env(:my_app, :my_app_databases)` to retrieve the list of databases (specified
434+
by module names). Our database engine can then traverse each repository in the
435+
list and then call `get_env(:my_app, Databases.RepoOne)` and so forth to retrieve
436+
the configuration of each one.
437+
438+
**Important:** if you are writing a library to be used by other developers,
439+
it is generally recommended to avoid the application environment, as the
440+
application environment is effectively a global storage. For more information,
441+
read our [library guidelines](/library-guidelines.html).
407442
"""
408443
@spec get_env(app, key, value) :: value
409444
def get_env(app, key, default \\ nil) do

0 commit comments

Comments
 (0)