Component.php
TLDR
This file is the Component
class in the namespace Illuminate\Console\View\Components
. It provides an abstract base for components that can be used to render views in a console application. It contains methods for rendering views, compiling view contents, mutating data, and performing questions using a question helper.
Methods
__construct($output)
Creates a new component instance. Accepts an instance of Illuminate\Console\OutputStyle
as the $output
parameter.
renderView($view, $data, $verbosity)
Renders the given view using the provided data and verbosity level. It uses the Termwind\renderUsing
and Termwind\render
functions to render the view content.
compile($view, $data)
Compiles the given view contents by including the PHP file for the view and capturing the output using output buffering. Returns the compiled view content as a string.
mutate($data, $mutators)
Mutates the given data using the provided set of mutators. It iterates over the mutators and applies them to each value in the data array or to the data string. Returns the mutated data.
usingQuestionHelper($callable)
Performs a question using the component's question helper. It temporarily replaces the current question helper with a new one and executes the provided callable. After the callable is executed, it restores the original question helper.
Classes
None
<?php
namespace Illuminate\Console\View\Components;
use Illuminate\Console\OutputStyle;
use Illuminate\Console\QuestionHelper;
use ReflectionClass;
use Symfony\Component\Console\Helper\SymfonyQuestionHelper;
use function Termwind\render;
use function Termwind\renderUsing;
abstract class Component
{
/**
* The output style implementation.
*
* @var \Illuminate\Console\OutputStyle
*/
protected $output;
/**
* The list of mutators to apply on the view data.
*
* @var array<int, callable(string): string>
*/
protected $mutators;
/**
* Creates a new component instance.
*
* @param \Illuminate\Console\OutputStyle $output
* @return void
*/
public function __construct($output)
{
$this->output = $output;
}
/**
* Renders the given view.
*
* @param string $view
* @param \Illuminate\Contracts\Support\Arrayable|array $data
* @param int $verbosity
* @return void
*/
protected function renderView($view, $data, $verbosity)
{
renderUsing($this->output);
render((string) $this->compile($view, $data), $verbosity);
}
/**
* Compile the given view contents.
*
* @param string $view
* @param array $data
* @return void
*/
protected function compile($view, $data)
{
extract($data);
ob_start();
include __DIR__."/../../resources/views/components/$view.php";
return tap(ob_get_contents(), function () {
ob_end_clean();
});
}
/**
* Mutates the given data with the given set of mutators.
*
* @param array<int, string>|string $data
* @param array<int, callable(string): string> $mutators
* @return array<int, string>|string
*/
protected function mutate($data, $mutators)
{
foreach ($mutators as $mutator) {
$mutator = new $mutator;
if (is_iterable($data)) {
foreach ($data as $key => $value) {
$data[$key] = $mutator($value);
}
} else {
$data = $mutator($data);
}
}
return $data;
}
/**
* Eventually performs a question using the component's question helper.
*
* @param callable $callable
* @return mixed
*/
protected function usingQuestionHelper($callable)
{
$property = with(new ReflectionClass(OutputStyle::class))
->getParentClass()
->getProperty('questionHelper');
$currentHelper = $property->isInitialized($this->output)
? $property->getValue($this->output)
: new SymfonyQuestionHelper();
$property->setValue($this->output, new QuestionHelper);
try {
return $callable();
} finally {
$property->setValue($this->output, $currentHelper);
}
}
}