gkratz / maintenancebundle

一个易于将您的站点设置为公共维护的包

安装: 37

依赖: 0

建议: 0

安全: 0

类型:symfony-bundle

dev-master / dev-master 2018-08-28 02:29 UTC

This package is auto-updated.

Last update: 2020-05-28 06:12:07 UTC


README

1) //-- 在您的项目的 composer.json 中添加 --//

"require": {
    // ...
    "gkratz/maintenancebundle": "dev-master"
}

2) //-- 在您的 app/AppKernel.php 中激活此包 --//

new Gkratz\MaintenanceBundle\GkratzMaintenanceBundle(),

3) //-- 在您的终端中输入此命令 --//

php composer update gkratz/maintenancebundle

4) //-- 创建一个空的 AppBundle:Maintenance 实体,具有受保护的 id 并且扩展 \Gkratz\MaintenanceBundle\Model\Maintenance --//

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Gkratz\MaintenanceBundle\Model\Maintenance as BaseMaintenance;

/**
 * Maintenance
 *
 * @ORM\Table(name="maintenance")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\MaintenanceRepository")
 */
class Maintenance extends BaseMaintenance
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Get id
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }
}

5) //-- 输入以下命令,然后在数据库中插入一行,其中 id = 1 且名称为您的站点名称 --//

php bin/console doctrine:generate:entities App
php bin/console doctrine:schema:update --force

6) //-- 更新您的前端控制器 --// //-- 只使用 render() 方法渲染视图,不要使用 renderView() --// //-- (如果同时使用 analyticbundle 和 maintenancebundle,请先安装 analyticbundle,然后仅扩展 GKratzController) --//

<?php

namespace AppBundle\Controller;

use Gkratz\MaintenanceBundle\Controller\GKratzMaintenanceController;

class DefaultController extends GKratzMaintenanceController
{
    // ...
}

如何使用

1) //-- 随意更改 vendor/gkratz/maintenancebundle/Gkratz/MaintenanceBundle/Resources/views/base/maintenance.html.twig 和 web/bundles/gkratzmaintenance/js/jquery.countdown.js 文件中的文本或语言 --//

2) //-- 按照以下示例更改您的 admin 控制器 --//

/**
 * @Route("/admin", name="admin")
 * @param Request $request
 * @return \Symfony\Component\HttpFoundation\Response
 */
public function indexAction(Request $request)
{
    // replace this example code with whatever you need
    /** @var  $em \Doctrine\ORM\EntityManager */
    $em = $this->getDoctrine()->getManager();
    /** @var  $maintenance \AppBundle\Entity\Maintenance */
    $maintenance = $em->getRepository("AppBundle:Maintenance")->find(1);
    return $this->render('default/index.html.twig', array('maintenance' => $maintenance));
}

/**
 * @Route("/maintenanceSwitch/{state}", name="maintenanceSwitch")
 * @Method({"GET"})
 * @param $state
 * @return \Symfony\Component\HttpFoundation\RedirectResponse
 */
public function maintenanceSwitch($state){
    /** @var  $em \Doctrine\ORM\EntityManager */
    $em = $this->getDoctrine()->getManager();
    /** @var  $maintenance \AppBundle\Entity\Maintenance */
    $maintenance = $em->getRepository("AppBundle:Maintenance")->find(1);
    $maintenance->setMaintenance($state);
    $em->flush();
    return $this->redirectToRoute("admin");
}

/**
 * @Route("/maintenanceIp", name="maintenanceIp")
 * @Method({"GET"})
 * @return \Symfony\Component\HttpFoundation\RedirectResponse
 */
public function maintenanceIp(){
    /** @var  $em \Doctrine\ORM\EntityManager */
    $em = $this->getDoctrine()->getManager();
    /** @var  $maintenance \AppBundle\Entity\Maintenance */
    $maintenance = $em->getRepository("AppBundle:Maintenance")->find(1);

    if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    elseif(isset($_SERVER['HTTP_CLIENT_IP'])) {
        $ip  = $_SERVER['HTTP_CLIENT_IP'];
    }else{
        $ip = $_SERVER['REMOTE_ADDR'];
    }

    $maintenance->setIp($ip);
    $em->flush();
    return $this->redirectToRoute("admin");
}

/**
 * @Route("/maintenanceDate", name="maintenanceDate")
 * @Method({"GET"})
 * @param Request $request
 * @return \Symfony\Component\HttpFoundation\RedirectResponse
 */
public function maintenanceDate(Request $request){
    /** @var  $em \Doctrine\ORM\EntityManager */
    $em = $this->getDoctrine()->getManager();
    /** @var  $maintenance \AppBundle\Entity\Maintenance */
    $maintenance = $em->getRepository("AppBundle:Maintenance")->find(1);
    $date = $request->query->get('date');
    $time = $request->query->get('time');
    try{
        $datetime = new \DateTime($date.' '.$time);
        $maintenance->setDate($datetime);
        $em->flush();
        return $this->redirectToRoute("admin");
    }catch(\Exception $e){
        die ($e->getMessage());
    }
}

3) //-- 将您的按钮插入 index.html 文件中 (您可以使用日期选择器、开关按钮、font-awesome 等其他酷炫功能) --//

{% if maintenance.maintenance == 0 %}
    <a href="{{ path('maintenanceSwitch', {'state': 1}) }}">Put maintenance On</a>
{% else %}
    <a href="{{ path('maintenanceSwitch', {'state': 0}) }}">Put maintenance Off</a>
{% endif %}
<p>Exception IP: {{ maintenance.ip }}</p>
<a href="{{ path('maintenanceIp') }}">Set my ip for exception IP</a>
<form action="{{ path('maintenanceDate') }}" method="get">
    <input type="date" name="date" placeholder="{{ maintenance.date|date('Y-m-d') }}" required>
    <input type="time" name="time" placeholder="{{ maintenance.date|date('H:i') }}" required>
    <input type="submit">
</form>