定制 seaworn/symfony-htmx-bundle 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

seaworn/symfony-htmx-bundle

Composer 安装命令:

composer require seaworn/symfony-htmx-bundle

包简介

Htmx integration for Symfony

README 文档

README

Htmx integration for Symfony

  • Symfony >=6.0
  • PHP >=8.0

Install

$ composer require seaworn/symfony-htmx-bundle

Setup

Add the following snippet to the front controller. This will allow Symfony to use a custom Request class

/* public/index.php */

\Symfony\Component\HttpFoundation\Request::setFactory(function (...$args) {
    return new \Seaworn\HtmxBundle\Request\HtmxRequest(...$args);
});

Usage

Extend Seaworn\HtmxBundle\Controller\AbstractController (extends \Symfony\Bundle\FrameworkBundle\Controller\AbstractController)

use Seaworn\HtmxBundle\Request\HtmxRequest;
use Seaworn\HtmxBundle\Response\HtmxResponse;

class HelloController extends \Seaworn\HtmxBundle\Controller\AbstractController{}

or use Seaworn\HtmxBundle\Controller\HtmxControllerTrait

use Seaworn\HtmxBundle\Request\HtmxRequest;
use Seaworn\HtmxBundle\Response\HtmxResponse;

class HelloController extends \Symfony\Bundle\FrameworkBundle\Controller\AbstractController
{
    use \Seaworn\HtmxBundle\Controller\HtmxControllerTrait;
}

Request headers

public function index(HtmxRequest $request): HtmxResponse
{
    // whether the request is made via htmx
    $request->isHxRequest();

    // whether the request is via an element using hx-boost attribute
    $request->isHxBoosted();
    
    // the current browser url
    $request->getHxCurrentUrl();
    
    // whether request is for history restoration after a miss in the local history cache
    $request->isHxHistoryRestoreRequest();
    
    // the user response to an hx-prompt
    $request->getHxPrompt();
    
    // the id of the target element if it exists
    $request->getHxTarget();

    // the id of the triggered element if it exists
    $request->getHxTrigger();
    
    // the name of the triggered element if it exists
    $request->getHxTriggerName();
    
    // ...
}

Response headers

public function index(HtmxRequest $request): HtmxResponse
{
    // ...
    $response = $this->hxRender('index.html.twig'); // or new HtmxResponse()
    // Optional headers
    $response->setHxLocation(
        "/location",
        [
            'source' => '',
            'event' => '',
            'handler' => '',
            'target' => '',
            'swap' => '',
            'select' => '',
            'values' => [],
            'headers' => [],
        ]) // set HX-Location header
        ->setHxPushUrl('/push') // set HX-Push-Url header
        ->setHxReplaceUrl('/replace') // set HX-Replace-Url header
        ->setHxReswap('outerHTML') // set HX-Reswap header
        ->setHxRetarget('#target') // set HX-Retarget header
        ->setHxReselect('#select') // set HX-Reselect header
        ->setHxTrigger('event') // set HX-Trigger header (simple)
        ->setHxTriggerAfterSwap('event1,event2') // set HX-Trigger-After-Swap header (multiple)
        ->setHxTriggerAfterSettle(['event' => ['key' => 'value']]); // set HX-Trigger-After-Settle header (with detail)
    return $response;
}

Render template block

<!-- index.html.twig -->

{% extends 'base.html.twig' %}

{% block block1 %}
    <div id="block1"> 
        Sample content...
    </div>
{% endblock %}
public function index(HtmxRequest $request): HtmxResponse
{
    return $this->hxRenderBlock('index.html.twig', 'block1');
}

Redirect

public function index(HtmxRequest $request): HtmxResponse
{
    return $this->hxRedirect('https://htmx.org/');
}

Refresh

public function index(HtmxRequest $request): HtmxResponse
{
    return $this->hxRefresh();
}

Stop polling

<!-- index.html.twig -->

{% extends 'base.html.twig' %}

{% block content %}
    <div hx-get="/poll" hx-vals="js:{pollingIndex}" hx-trigger="every 2s"></div>
    <script type="text/javascript">
        var pollingIndex = 0;
        document.body.addEventListener("polling", function(e) {
            pollingIndex++;
            console.log("Polling Index:", pollingIndex);
        });
    </script>
{% endblock %}
public function poll(HtmxRequest $request): HtmxResponse
{ 
    $index = $request->get('pollingIndex', 0);
    if ((int)$index >= 10) {
        return new HtmxStopPollingResponse();
    }
    return (new HtmxResponse())->setHxTrigger('polling');
}

统计信息

  • 总下载量: 14
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 8
  • 点击次数: 0
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 8
  • Watchers: 2
  • Forks: 1
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2024-01-10

承接程序开发

PHP开发

VUE

Vue开发

前端开发

小程序开发

公众号开发

系统定制

数据库设计

云部署

网站建设

安全加固