Giter Site home page Giter Site logo

adr-example's Introduction

Action Domain Responder Example

This example shows an Action Domain Responder user interface subsystem, with the corresponding domain logic and data source elements, for a naive blogging system.

This is not a running example, in the sense that it cannot be dropped onto a web server and begin operating properly.

However, there is a full test suite in the tests/ directory. (These are more properly considred integration rather than unit tests, but they will do for the purpose of this example.) Issue composer install followed by ./vendor/bin/phpunit to run the tests.

There is no authentication, authorization, or session mechanism included. While necessary in a real system, they would increase the complexity of the example and make it more difficult to discern the separation of concerns.

Action

The Action classes depend on 3rd-party HTTP Request and Response interfaces.

Each Action picks apart the incoming request to pass individual typehinted Domain method arguments. A differently-constructed Domain might require a different input signature, such as a data transfer object or a catch-all array of all possible request values.

Domain

The base ApplicationService class protects all the "real" service methods behind the magic __call() method. This allows the service to implement some functionality common to all the service methods, such as exception handling, though it does get in the way of IDE auto-completion.

The BlogService methods return a domain Payload that wraps the domain results and includes a status indicator. This standardizes the domain return signature, makes the BlogResponder work much more readable.

The domain logic uses a Data Mapper for data source interactions (BlogMapper et al.).

Responder

Each Responder calls a method corresponding to the domain Payload status to build the HTTP Response.

The base Responder class depends on a 3rd-party HTTP Request interface and Response object.

The base BlogResponder class depends on a 3rd-party PHP-based Template View system. The templates are located in resources/templates/blog/.

adr-example's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

adr-example's Issues

Poor domain logic

Hey @pmjones the example it's well structured and easy to understand, but i think this it's not a real domain with real complex logic.
Are you planning to do some real-world and handle some domain complexity?
If help needed ping me ๐Ÿ˜„

Responding in Various Formats

@pmjones Quick question but I thought I'd ask it here for everyone's benefit.

When responding with the same payload but in more than 1 format (for instance, user may request JSON, CSV, or XML), how would you structure your responder classes?

Some options I'm considering (and caveats):

  1. Have abstract JSON, CSV, and XML responders. (Possible inheritance hell)
  2. Make each responder handle all possible formats. (Huge responders, likely code repetition)
  3. Use traits for serializing payloads to each format. (Only allows for generic serialization, no custom logic per responder)
  4. Become a graphic designer. (More free time but even fewer problems with concrete answers)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.