From db2b5347172997812e7c9a36bb2f8b60b3311326 Mon Sep 17 00:00:00 2001 From: Matthew Weier O'Phinney Date: Wed, 6 Jan 2016 18:00:53 -0600 Subject: [PATCH 1/2] Added architectural diagram and narrative - Hopefully addresses #242 --- doc/book/features.md | 133 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) diff --git a/doc/book/features.md b/doc/book/features.md index 86f712a9..3ce86705 100644 --- a/doc/book/features.md +++ b/doc/book/features.md @@ -64,3 +64,136 @@ features it provides include: handling via Stratigility's own `FinalHandler` implementation, as well as more advanced error handling via two specialized error handlers: a templated error handler for production, and a Whoops-based error handler for development. + +## Flow Overview + +Below is a diagram detailing the workflow used by Expressive. + +``` + Request Response + + ^ ^ + | | | ++-------------+--------------------------------------+ +| | | pre_routing | | +----->+ +| Application +--------------------------------------| | +| | | (run always) | | +------+ +| +--------------------------------------| | +| | | pipeline | | +------+ +| +--------------------------------------| | +| | | middleware | | +------+ +| +--------------------------------------+ | +| | | | | | | +| | v | | | | +| | | | | | +| | Routing | | | | +| | | | | v +| | Middleware | | | | +| | | | | | +| | | | | | +| | + | | | | +| | | | | | | +| | | | | | | +| | | | | +------+ +| | +-------------------------------+ | +| | | | | | | | +| | | v Routed + | | v +| | | | | | +| | | Middleware | | | +| | | | | | +| | | | +------+ +| +------+-------------------------------| | +| | post_routing | |<------+ +| +--------------------------------------+ +| | (error handling) | | | +| +--------------------------------------+ +| | pipeline | | | +| +--------------------------------------+ +| | middleware + v | ++-------------+---------------------------------+----+ +``` + +The `Application` acts as an "onion"; in the diagram above, the top is the +outer-most layer of the onion, while the bottom is the inner-most. + +The `Application` dispatches each middleware. Each middleware accepts a +*request*, a *response*, and the *next* middleware to dispatch. Internally, +it's actually receiving the middleware stack itself, which knows which +middleware to invoke next. + +Any given middleware can return a *response*, at which point execution winds +its way back out the onion. Additionally, any given middleware can indicate an +error occurred, at which point it can call on the next *error handling +middleware*. These act like regular middleware, but accept an additional error +argument to act on. + +> ### Pipelines +> +> The terminology "pipeline" is often used to describe the onion. One way of +> looking at the "onion" is as a *queue*, which is first-in-first-out (FIFO) in +> operation. This means that the first middleware on the queue is executed first, +> and this invokes the next, and so on (and hence the "next" terminology). When +> looked at from this perspective: +> +> - In most cases, the entire queue *will not* be traversed. +> - The inner-most layer of the onion represents the last item in the queue. +> - Responses are returned back *through* the pipeline, in reverse order of +> traversal. + +The `Application` allows for "pre routing" middleware, routing middleware (and +the routed middleware it dispatches), and "post routing" middleware. + +Routing within Expressive consists of decomposing the request to match it to +middleware that can handle that given request. This typically consists of a +combination of matching the requested URI path along with allowed HTTP methods: + +- map a GET request to the path `/api/ping` to the `PingMiddleware` +- map a POST request to the path `/contact/process` to the `HandleContactMiddleware` +- etc. + +The majority of your application will consist of routing rules that map to +routed middleware. + +"Pre routing" middleware is middleware that you wish to execute for every +request. These might include: + +- authentication +- parsing of request body parameters +- addition of debugging tools +- etc. + +Such middleware may decide that a request is invalid, and return a response; +doing so means no further middleware will be executed! This is an important +feature of middleware architectures, as it allows you to define +application-specific workflows optimized for performance, security, etc. + +"Post routing" middleware will execute in one of two conditions: + +- routing failed +- routed middleware called on the next middleware instead of returning a response. + +As such, the largest use case for post routing middleware is for error handling. +One possibility is for [providing custom 404 handling](cookbook/custom-404-page-handling.md), +or handling application-specific error conditions (such as authentication or +authorization failures). + +Another possibility is to provide post-processing on the response before +returning it. However, this is typically better handled via pre-routing +middleware, by capturing the response before returning it: + +```php +function ($request, $response, $next) +{ + $response = $next($request, $response); + return $response->withHeader('X-Clacks-Overhead', 'GNU Terry Pratchett'); +} +``` + +The main points to remember are: + +- The application is a queue, and operates in FIFO order. +- Each middleware can choose whether to return a response, which will cause + the queue to unwind, or to traverse to the next middleware. +- Most of the time, you will be defining *routed middleware*, and the routing + rules that map to them. +- *You* get to control the workflow of your application by deciding the order in + which middleware is queued. From e9c2b71ddfd1fca01e7ed089e2f3b09a4bad7b81 Mon Sep 17 00:00:00 2001 From: Matthew Weier O'Phinney Date: Thu, 7 Jan 2016 10:50:16 -0600 Subject: [PATCH 2/2] Actual image for flow diagram --- doc/book/features.md | 43 +------------------------------ doc/book/images/architecture.dia | Bin 0 -> 1279 bytes doc/book/images/architecture.png | Bin 0 -> 35521 bytes doc/book/images/architecture.svg | 33 ++++++++++++++++++++++++ doc/book/images/architecture.xcf | Bin 0 -> 135993 bytes 5 files changed, 34 insertions(+), 42 deletions(-) create mode 100644 doc/book/images/architecture.dia create mode 100644 doc/book/images/architecture.png create mode 100644 doc/book/images/architecture.svg create mode 100644 doc/book/images/architecture.xcf diff --git a/doc/book/features.md b/doc/book/features.md index 3ce86705..e8dfc8fe 100644 --- a/doc/book/features.md +++ b/doc/book/features.md @@ -69,48 +69,7 @@ features it provides include: Below is a diagram detailing the workflow used by Expressive. -``` - Request Response - + ^ ^ - | | | -+-------------+--------------------------------------+ -| | | pre_routing | | +----->+ -| Application +--------------------------------------| | -| | | (run always) | | +------+ -| +--------------------------------------| | -| | | pipeline | | +------+ -| +--------------------------------------| | -| | | middleware | | +------+ -| +--------------------------------------+ | -| | | | | | | -| | v | | | | -| | | | | | -| | Routing | | | | -| | | | | v -| | Middleware | | | | -| | | | | | -| | | | | | -| | + | | | | -| | | | | | | -| | | | | | | -| | | | | +------+ -| | +-------------------------------+ | -| | | | | | | | -| | | v Routed + | | v -| | | | | | -| | | Middleware | | | -| | | | | | -| | | | +------+ -| +------+-------------------------------| | -| | post_routing | |<------+ -| +--------------------------------------+ -| | (error handling) | | | -| +--------------------------------------+ -| | pipeline | | | -| +--------------------------------------+ -| | middleware + v | -+-------------+---------------------------------+----+ -``` +![Expressive Architectural Flow](images/architecture.png) The `Application` acts as an "onion"; in the diagram above, the top is the outer-most layer of the onion, while the bottom is the inner-most. diff --git a/doc/book/images/architecture.dia b/doc/book/images/architecture.dia new file mode 100644 index 0000000000000000000000000000000000000000..7c21e11d6acb8c350756f72b8f033214694058c1 GIT binary patch literal 1279 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/book/images/architecture.xcf b/doc/book/images/architecture.xcf new file mode 100644 index 0000000000000000000000000000000000000000..aa4719374b6aec58f6fc2617ea21cd17f2a2d059 GIT binary patch literal 135993 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 z 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