Funnel
A catch-all controller (for Laravel)
Installation
- Install from Composer:
composer require marklj/funnel
- Add
Marklj\Funnel\FunnelServiceProvider
to yourapp.php
service provider configuration values. - Publish the packages configuration:
php artisan vendor:publish
Quick Start
1. Send a request
Send a POST request to /mailbox
. You can do this with AJAX from your front-end library of choice (Angular / Vue / etc), but for simplicity, we'll use a simple HTML form example.
The default Funnel endpoint is /mailbox
, but this can be configured in the funnel.php
configuration file that was published in the installation section.
The command
request parameter is required and is automatically converted to StudlyCase when processed by Funnel.
<form action="/mailbox" method="POST">
<input type="hidden" name="command" value="post_blog" />
<input type="text" name="payload[blog_title]" />
<button>Submit</button>
</form>
Note that data does not need to be contained in a payload[]
array unless you want to filter exactly what perameters are passed to your action. If you do not namespace your inputs, like name="blog_title"
, all of your input data will be passed to your action.
2. Map to an Action
Funnel will try to associate the StudlyCase command, in this case PostBlog
, to an action. This association is made in the funnel.php
configuration file.
// config/funnel.php
[
// ...
'action_mappings' => [
'PostBlog' => \App\Blog\Actions\PostAction::class,
// other mappings here
]
]
3. Create Action
The action class must implement the Marklj\Funnel\Actionalble
interface. You are free to place whatever code you need here.
All of your payload data data will be available in the ActionPayload
object.
<?php namespace App\Blog\Actions;
use Marklj\Funnel\Actionable;
use Marklj\Funnel\ActionPayload;
class PostAction implements Actionable
{
public function __invoke(ActionPayload $payload) {
print 'Hello Funnel!';
print 'Blog Post Title: ' . $payload->get('blog_title');
}
}
Since the action is instantiated using Laravel's IoC container, you are free to inject any dependancies into your action via the constructor.