jaxon-php/jaxon-symfony

Symfony 框架的 Jaxon 库集成

v4.0.0 2022-07-30 14:30 UTC

README

此包将 Jaxon 库 集成到 Symfony 框架中。

安装

composer.json 文件中添加以下行,并运行 composer update 命令。

"require": {
    "jaxon-php/jaxon-symfony": "^5.0"
}

或者运行 composer require jaxon-php/jaxon-symfony ^5.0 命令。

config/bundle.php 文件中添加 Jaxon 包。

return [
    ...

    Jaxon\Symfony\JaxonBundle::class => ['all' => true],
];

创建并编辑 packages/config/jaxon.yaml 文件以适应您的应用程序需求。一个示例配置文件可以在 此存储库 中找到。

config/services.yaml 文件中添加以下设置,以配置 Jaxon 库。

imports:
    ...
    - { resource: packages/jaxon.yaml }

默认情况下,此配置文件将 Jaxon 类注册在 jaxon/ajax 目录下,使用 \Jaxon\Ajax 命名空间。

必须在需要显示 Jaxon 相关内容的所有页面上设置 Jaxon 库,例如使用事件订阅者。

<?php

// src/EventSubscriber/JaxonSubscriber.php
namespace App\EventSubscriber;

use App\Controller\DemoController;
use App\Controller\JaxonController;
use Jaxon\Symfony\App\Jaxon;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\KernelEvents;

use function is_array;

class JaxonSubscriber implements EventSubscriberInterface
{
    public function __construct(private Jaxon $jaxon)
    {}

    public function onKernelController(ControllerEvent $event)
    {
        $controller = $event->getController();

        // when a controller class defines multiple action methods, the controller
        // is returned as [$controllerInstance, 'methodName']
        if (is_array($controller)) {
            $controller = $controller[0];
        }

        // Select the controllers with Jaxon related content.
        if ($controller instanceof JaxonController || $controller instanceof DemoController) {
            $this->jaxon->setup();
        }
    }

    public static function getSubscribedEvents()
    {
        return [
            KernelEvents::CONTROLLER => 'onKernelController',
        ];
    }
}

定义一个控制器操作来处理 Jaxon AJAX 请求。

use Jaxon\Symfony\App\Jaxon;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

class JaxonController extends AbstractController
{
    #[Route('jaxon', name: 'jaxon.ajax', methods: ['POST'])]
    public function __invoke(Jaxon $jaxon)
    {
        if(!$jaxon->canProcessRequest())
        {
            return; // Todo: return an error message
        }

        $jaxon->processRequest();
        return $jaxon->httpResponse();
    }
}

使用 Jaxon 包提供的 Twig 函数,将 Jaxon js 和 css 代码插入需要显示 Jaxon 相关内容的页面。

use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

use function Jaxon\rq;

class DemoController extends AbstractController
{
    #[Route('/', name: 'demo.home')]
    public function __invoke()
    {
        // Print the page
        return $this->render('demo/index.html.twig', [
            'pageTitle' => "Symfony Framework",
        ]);
    }
}
// templates/demo/index.html.twig

<!-- In page header -->

{{ jxnCss() }}
</head>

<body>

<!-- Page content here -->

</body>

<!-- In page footer -->

{{ jxnJs() }}

{{ jxnScript() }}

配置

config/package/jaxon.yml 配置文件中的设置分为两个部分。在 lib 部分中的选项是 Jaxon 核心库的选项,而在 app 部分中的选项是 Symfony 应用程序的选项。

可以在配置文件的 app 部分中定义以下选项。

默认情况下,views 数组为空。视图从框架默认位置渲染。在 directories 数组中有一个条目,以下是其值。

用法

Jaxon 类

Jaxon 类可以继承自 \Jaxon\App\CallableClass。默认情况下,它们位于 Symfony 应用程序的 jaxon/ajax 目录中,相关的命名空间是 \Jaxon\Ajax

以下是一个简单的 Jaxon 类示例,定义在 jaxon/Ajax/HelloWorld.php 文件中。

namespace Jaxon\Ajax;

class HelloWorld extends \Jaxon\App\CallableClass
{
    public function sayHello()
    {
        $this->response->assign('div2', 'innerHTML', 'Hello World!');
        return $this->response;
    }
}

依赖注入

Symfony 中的服务可以声明为公共或私有,并且可以 注入到 Jaxon 类中

由于 Jaxon 使用容器来获取注入到其类中的 Symfony 服务,因此默认情况下它只能访问声明为公共的服务。

可以在 config/services.yaml 文件中为 Jaxon 定义服务定位器,以提供对私有服务的访问。

services:
  ...
    jaxon.service_locator:
        public: true
        class: Symfony\Component\DependencyInjection\ServiceLocator
        tags: ['container.service_locator']
        arguments:
            -
                Twig\Environment: '@twig'

服务定位器必须声明为公共的,并接受所有可以传递给 Jaxon 类的参数。请参阅 Symfony 服务定位器文档

贡献

  • 问题跟踪器:github.com/jaxon-php/jaxon-symfony/issues
  • 源代码:github.com/jaxon-php/jaxon-symfony

许可证

该包受 BSD 许可证许可。