yiisoft/html
Yii HTML is a PHP library for safe, dynamic server-side HTML generation. It provides classes for common HTML tags, a CustomTag builder, widgets like ButtonGroup/CheckboxList/RadioList, automatic content encoding with NoEncode, and an Html helper API.
## Getting Started
### Minimal Setup
1. **Installation**:
```bash
composer require yiisoft/html
Add to composer.json if using Laravel’s autoloader:
"autoload": {
"psr-4": {
"App\\": "app/",
"Yiisoft\\Html\\": "vendor/yiisoft/html/src/"
}
}
Run composer dump-autoload.
First Use Case: Generate a simple link in a Blade template:
<?= \Yiisoft\Html\Html::a('Click Me', route('home')) ?>
Output: <a href="/home">Click Me</a>.
Key Entry Points:
new \Yiisoft\Html\Tag\A() for fluent tag building.Html::a(), Html::button(), etc.CheckboxList, RadioList, ButtonGroup for complex UIs.Chain methods for readability and reusability:
$button = (new \Yiisoft\Html\Tag\Button())
->type('submit')
->class('btn btn-primary')
->content('Save');
echo $button; // Renders as string
Laravel Integration: Store reusable tags in a service class:
class HtmlBuilder {
public static function primaryButton(string $text): string {
return (new \Yiisoft\Html\Tag\Button())
->type('button')
->class('btn btn-primary')
->content($text)
->render();
}
}
Use in Blade:
{!! HtmlBuilder::primaryButton('Submit') !!}
Checkbox/Radio Lists:
$checkboxes = (new \Yiisoft\Html\Widget\CheckboxList\CheckboxList('roles'))
->items([
'admin' => 'Administrator',
'user' => 'User',
])
->value('admin', 'user') // Pre-select
->containerAttributes(['class' => 'form-check']);
echo $checkboxes;
Laravel Form Requests:
Bind to a FormRequest validator:
public function rules(): array {
return [
'roles' => 'array',
'roles.*' => 'in:admin,user',
];
}
CSS/JS Files:
<?= \Yiisoft\Html\Html::cssFile(
asset('css/app.css'),
['integrity' => 'sha256-...', 'crossorigin' => 'anonymous']
) ?>
Laravel Mix Integration:
Use mix() helper:
<?= \Yiisoft\Html\Html::cssFile(mix('css/app.css')) ?>
Dynamic Attributes:
$link = (new \Yiisoft\Html\Tag\A())
->href(route('profile'))
->class('nav-link' . ($active ? ' active' : ''));
Blade Directives: Create a custom Blade directive:
Blade::directive('htmlTag', function ($expression) {
return "<?php echo {$expression}; ?>";
});
Usage:
@htmlTag(\Yiisoft\Html\Html::a('Home', route('home')))
Encapsulate widgets in Laravel components:
// app/View/Components/ButtonGroup.php
class ButtonGroup extends Component {
public function render(): string {
return (new \Yiisoft\Html\Widget\ButtonGroup())
->buttons(
\Yiisoft\Html\Html::button('Save'),
\Yiisoft\Html\Html::button('Cancel')
)
->containerAttributes(['class' => 'btn-group']);
}
}
Usage in Blade:
<x-button-group />
NoEncode or passed as a NoEncodeStringableInterface object.
// Encoded: <div><script>alert()</script></div>
echo \Yiisoft\Html\Html::div('<script>alert()</script>');
// Not Encoded: <div><script>alert()</script></div>
echo \Yiisoft\Html::div(\Yiisoft\Html\NoEncode::string('<script>alert()</script>'));
Html::a() inside Html::div()) are not encoded by default.Html::generateId() for unique IDs:
$id = \Yiisoft\Html\Html::generateId('user-');
\Yiisoft\Html\Html::setIdGenerator(function () {
return 'test-id';
});
false values (e.g., disabled="disabled" becomes disabled).data-* helpers:
$tag = (new \Yiisoft\Html\Tag\Div())
->data('user-id', 123)
->data('active', true);
addCssClass()/removeCssClass():
$button = (new \Yiisoft\Html\Tag\Button())
->class('btn')
->addCssClass('btn-primary')
->removeCssClass('disabled');
render() once and store the result:
$html = $tag->render(); // Store in cache
NoEncode for trusted HTML (e.g., Markdown content).renderTagAttributes() to debug:
echo \Yiisoft\Html\Html::renderTagAttributes([
'class' => 'btn btn-primary',
'data-test' => 'true',
]);
CheckboxList::renderUncheckInput() for hidden issues.CustomTag for non-standard HTML:
class CustomComponentTag extends \Yiisoft\Html\Tag\CustomTag {
public function __construct(string $tagName, array $attributes = []) {
parent::__construct($tagName, $attributes);
$this->addAttribute('is', 'custom-component');
}
}
Html helper methods in Laravel’s service provider:
app()->singleton('html', function () {
return new class extends \Yiisoft\Html\Html {
public static function customTag(string $tag, array $attributes = []): string {
return (new CustomComponentTag($tag, $attributes))->render();
}
};
});
render():
// Wrong: Outputs object
echo $tag;
// Correct:
echo $tag->render();
// Wrong: Encodes twice
echo \Yiisoft\Html\Html::div(htmlspecialchars('text'));
// Correct: Use NoEncode
echo \Yiisoft\Html\Html::div(\Yiisoft\Html\NoEncode::string(htmlspecialchars('text')));
items, value, and uncheckValue are set for CheckboxList/RadioList.{!! !!} for raw HTML output:
{!! \Yiisoft\Html\Html::div('<strong>Safe</strong>') !!}
How can I help you explore Laravel packages today?