1. Go to this page and download the library: Download affinity4/support library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
affinity4 / support example snippets
use Slim\Factory\AppFactory;
use Affinity4\SlimSupport\Support\Facade;
$app = AppFactory::createFromContainer();
Facade::setFacadeApplication($app);
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Slim\Factory\AppFactory;
use Affinity4\SlimSupport\Support\Facade;
$app = AppFactory::createFromContainer();
Facade::setFacadeApplication($app);
App::get('/', function(RequestInterface $request, ResponseInterface $response) {
// return ...
});
App::run();
use Affinity4\SlimSupport\Facades\Container;
Container::set('some-service', function () {
return SomeService();
});
if (Container::has('some-service')) {
$someService = Container::get('some-service');
}
use Affinity4\SlimSupport\Facades\Container;
App::get('/', function($request) {
return Response::json(['test' => 'payload'])->get();
});
App::get('/', function ($request) {
// 4. Define the pipeline
$result = (new Pipeline(App::getContainer()))
->send($request)
->through([
PrepareRequest::class,
ValidateRequest::class,
TransformRequest::class,
SaveRequest::class,
])
->thenReturn();
// 5. Respond with the processed data
return response()->json(['result' => $result])->get();
});
App::get('/', function ($request) {
return response('Hello World')->get();
});
App::get('/', function ($request) {
return response()->json(['data' => 'payload'])->get();
});
return tap(new Psr7Response(), function ($response) {
$response->getBody()->write('foo');
});
use Affinity4\SlimSupport\Support\Traits\Tappable;
class TappableClass
{
use Tappable;
private $name;
public static function make()
{
return new static;
}
public function setName($name)
{
$this->name = $name;
}
public function getName()
{
return $this->name;
}
}
$name = TappableClass::make()->tap(function ($tappable) {
$tappable->setName('MyName');
})->getName();
// Or, even though setName does not return this you can now just chain from it!
$name = TappableClass::make()->tap()->setName('MyName')->getName()
$app->get('/', function ($request, $response) {
$response = new Response;
$response->getBody()->write('Hello');
return $response;
})
use GuzzleHttp\Psr7\Response;
use Affinity4\SlimSupport\Support\Traits\Macroable;
class MacroableResponse extends Response
{
use Macroable;
}
use Affinity4\SlimSupport\Facades\Container;
// ... above code here
Container::set('response', function () {
return new MacroableResponse();
});
App::get('/', function () {
return Container::get('response')->write('Macro!');
});
$container = new Container;
if (!$container->has('FileDriver')) {
$container->set('FileDriver', fn() => new FileDriver);
}
if (!$container->has('Logger')) {
$container->set('Logger', function ($container) {
$logger = new Logger;
$logger->setDriver($container->get('FileDriver'));
return $logger;
});
}
class ConditionableContainer extends Container
{
use Conditionable;
}
$container = new ConditionableContainer;
$container
->unless(
fn($container) => $container->has('FileDriver'),
function ($container) {
$container->set('FileDriver', fn() => new FileDriver);
}
)->unless(
fn($container) => $container->has('Logger'),
function ($container) {
$container->set('Logger', function ($container) {
$logger = new Logger;
$logger->setDriver($container->get('FileDriver'));
return $logger;
});
}
);
class FileDriverServiceFactory
{
public function __invoke($container)
{
$container->set('FileDriver', fn() => new FileDriver);
}
}
class LoggerServiceFactory
{
public function __invoke($cotnainer)
{
$logger = new Logger;
$logger->setDriver($container->get('FileDriver'));
return $logger;
}
}
$container = new ConditionableContainer;
// or, using unless, instead of when
$container
->unless(fn($container) => $container->has('FileDriver'), FileDriverServiceFactory($container))
->unless(fn($container) => $container->has('Logger'), LoggerServiceFactory($container));
class Collection
{
use Dumpable;
public function __constructor(
protected array $collection = []
) {}
}
$collection = new Collection([
"one" => 1,
"two" => 2
]);
// Debug the collection...
$collection->dump();
// Or
$collection->dd();
class AppProxy
{
use ForwardsCalls;
public function __call($method, $parameters)
{
return $this->forwardCallTo(new App, $method, $parameters);
}
public function addSomeServiceDirectlyToContainer()
{
$this->getContainer()->set('some-service', function ($container) {
return new SomeService($container->get('some-dependency-already-in-container'));
});
}
}
final class App
{
public function __construct(
protected ContainerInterface $container
) {}
public function getContainer()
{
return $this->container;
}
}
// 1. Prepare the request
class PrepareRequest
{
public function handle($request, $next)
{
$uri = $request->getUri();
$query = $uri->getQuery(); // Get the query string (e.g., "param1=value1¶m2=value2")
parse_str($query, $queryParams); // Parse the query string into an array
return $next($queryParams);
}
}
// 2. Validate the request
class ValidateRequest
{
public function handle($data, $next)
{
// Validate parameters
// (e.g. check if 'email' and 'password' exist, validate 'email' and 'password' etc)
// If invalid then $data['valid'] = false, else $data['valid'] = true;
return $next($data);
}
}
// 2. Transform the request
class TransformRequest
{
public function handle($data, $next)
{
$data['password'] = bcrypt($data['password']);
return $next($data);
}
}
// 3. Save the data, or log errors
class SaveRequest
{
public function handle($data, $next)
{
if (!$data['valid']) {
// Log errors...
return $next($data);
}
$data['saved'] = true;
return $next($data);
}
}
App::get('/', function ($request) {
// 4. Define the pipeline
$result = (new Pipeline(App::getContainer()))
->send($request)
->through([
PrepareRequest::class,
ValidateRequest::class,
TransformRequest::class,
SaveRequest::class,
])
->thenReturn();
// 5. Respond with the processed data
return response()->json(['result' => $result])->get();
});
$app = AppFactory::create();
$userWorkflows = new Hub($app->getContainer());
// By default register the user
$userWorkflows->defaults(function ($pipeline, $passable) {
return $pipeline->send($passable)
->through([
ValidateRequest::class,
RegisterUser::class,
SendRegistrationEmail::class
])
->thenReturn();
});
$userWorkflows->pipeline('user-requested-reset-password', function ($pipeline, $passable) {
return $pipeline->send($passable)
->through([
ValidateRequestData::class,
ValidateUser::class,
EmailResetPasswordLink::class
])
->thenReturn();
});
$userWorkflows->pipeline('user-enabled-2fa', function ($pipeline, $passable) {
return $pipeline->send($passable)
->through([
ValidateRequestData::class,
ValidateUser::class,
Handle2faSetup::class
])
->thenReturn();
});
// Then we can call them easily like so
App::post('/user/register', function($request) use ($userWorkflows) {
$result = $userWorkflows->pipe($request); // Since our default is our register pipe we only need the first arg
return response()->json(['data' => $result])->get();
});
App::post('/user/password-reset', function($request) use ($userWorkflows) {
$result = $userWorkflows->pipe($request, 'user-requested-password-reset');
return response()->json(['data' => $result])->get();
});
App::post('/user/enable-2fa', function($request) use ($userWorkflows) {
$result = $userWorkflows->pipe($request, 'user-enabled-2fa');
return response()->json(['data' => $result])->get();
});
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.