PHPixie/HTTP

View on GitHub
src/PHPixie/HTTP/Builder.php

Summary

Maintainability
A
1 hr
Test Coverage
<?php

namespace PHPixie\HTTP;

use PHPixie\Slice;

/**
 * HTTP factory
 */
class Builder
{
    /**
     * @var Slice
     */
    protected $slice;

    /**
     * @var array
     */
    protected $instances = array();

    /**
     * Builder constructor
     * @param Slice $slice
     */
    public function __construct($slice) {
        $this->slice = $slice;
    }

    /**
     * Message factory
     * @return Messages
     */
    public function messages()
    {
        return $this->instance('messages');
    }

    /**
     * Response factory
     * @return Responses
     */
    public function responses()
    {
        return $this->instance('responses');
    }

    /**
     * Output
     * @return Output
     */
    public function output()
    {
        return $this->instance('output');
    }

    /**
     * Build PHPixie request from PSR-7 ServerRequest
     * @param $serverRequest
     * @return Request
     */
    public function request($serverRequest)
    {
        return new Request($this, $serverRequest);
    }

    /**
     * Proxy for building slice data
     * @param array $array
     * @return Slice\Type\ArrayData
     */
    public function data($array = array())
    {
        return $this->slice->arrayData($array);
    }

    /**
     * Build headers storage
     * @param array $headerArray
     * @return Data\Headers
     */
    public function headers($headerArray = array())
    {
        return new Data\Headers($headerArray);
    }

    /**
     * Build editable headers storage
     * @param array $headerArray
     * @return Data\Headers\Editable
     */
    public function editableHeaders($headerArray = array())
    {
        return new Data\Headers\Editable($headerArray);
    }

    /**
     * Build server data storage
     * @param array $serverData
     * @return Data\Server
     */
    public function serverData($serverData = array())
    {
        return new Data\Server($serverData);
    }

    /**
     * Build HTTP context
     * @param Request $request
     * @param Context\Cookies $cookies
     * @param Context\Session\SAPI $session
     * @return Context
     */
    public function context($request, $cookies, $session)
    {
        return new Context($request, $cookies, $session);
    }

    /**
     * Build cookie storage
     * @param array $cookieArray
     * @return Context\Cookies
     */
    public function cookies($cookieArray = array())
    {
        return new Context\Cookies($this, $cookieArray);
    }

    /**
     * Build default session storage
     * @return Context\Session\SAPI
     */
    public function sapiSession()
    {
        return new Context\Session\SAPI();
    }

    /**
     * Build a single cookie update
     * @param string      $name
     * @param mixed       $value
     * @param int|null    $expires
     * @param string      $path
     * @param string|null $domain
     * @param bool        $secure
     * @param bool        $httpOnly
     * @param string|null $sameSite
     * @return Context\Cookies\Update
     */
    public function cookiesUpdate(
        $name,
        $value,
        $expires = null,
        $path = '/',
        $domain = null,
        $secure = false,
        $httpOnly = false,
        $sameSite = null
    )
    {
        return new Context\Cookies\Update(
            $name,
            $value,
            $expires,
            $path,
            $domain,
            $secure,
            $httpOnly,
            $sameSite
        );
    }

    /**
     * Build context container
     * @param $context
     * @return Context\Container\Implementation
     */
    public function contextContainer($context)
    {
        return new Context\Container\Implementation($context);
    }

    /**
     * @param $name
     * @return mixed
     */
    protected function instance($name)
    {
        if(!array_key_exists($name, $this->instances)) {
            $method = 'build'.ucfirst($name);
            $this->instances[$name] = $this->$method();
        }

        return $this->instances[$name];
    }

    /**
     * @return Messages
     */
    protected function buildMessages()
    {
        return new Messages();
    }

    /**
     * @return Responses
     */
    protected function buildResponses()
    {
        return new Responses($this);
    }

    /**
     * @return Output
     */
    protected function buildOutput()
    {
        return new Output();
    }
}