自己写的一个MethodLink工具。比如生成一个任意METHOD的link.

自己写的一个MethodLink工具。比如生成一个任意METHOD的link.

<?php
namespace App\Admin\Extensions;

use ArrayAccess;
use Encore\Admin\Admin;
use Encore\Admin\Grid\Tools\AbstractTool;
use Illuminate\Contracts\Support\Arrayable;
use Illuminate\Contracts\Support\Jsonable;
use Illuminate\Contracts\Support\Renderable;
use JsonSerializable;

class MethodLink extends AbstractTool implements Renderable, ArrayAccess, Arrayable, Jsonable, JsonSerializable
{
    /**
     * @var string
     */
    protected $view;

    protected $link = '';

    protected $text = '';

    protected $method = 'GET';
    /**
     * All of the attributes set on the fluent instance.
     *
     * @var array
     */
    protected $attributes = [];

    public function __construct($link = '', $method = 'GET', $text = '')
    {
        $this->link = $link;
        $this->method = $method;
        $this->text = $text;
    }

    /**
     * Set view of widget.
     *
     * @param string $view
     */
    public function view($view)
    {
        $this->view = $view;
    }

    /**
     * Build a single attribute element.
     *
     * @param string $key
     * @param string $value
     *
     * @return string
     */
    protected function attributeElement($key, $value)
    {
        if (is_numeric($key)) {
            $key = $value;
        }
        if (!is_null($value)) {
            return $key . '="' . htmlentities($value, ENT_QUOTES, 'UTF-8') . '"';
        }
    }

    public function attribute($attribute, $value = null)
    {
        if (is_array($attribute)) {
            $this->attributes = array_merge($this->attributes, $attribute);
        } else {
            $this->attributes[$attribute] = (string) $value;
        }
        return $this;
    }

    /**
     * Format the field attributes.
     *
     * @return string
     */
    public function formatAttributes()
    {
        $html = [];

        foreach ($this->attributes as $name => $value) {
            if (in_array($name, ['data-method-link-select', 'data-href', 'href'])) {
                continue;
            }
            $html[] = $name . '="' . e($value) . '"';
        }

        return implode(' ', $html);
    }

    protected function getToken()
    {
        return csrf_token();
    }

    protected function script()
    {
        return <<<SCRIPT
$('a[data-method-link-select]').on('click', function () {var url = $(this).data('href');$.pjax({url: url,method:'POST',data: {_token:'{$this->getToken()}',_method:'{$this->method}',},container: '#pjax-container'});});
SCRIPT;
    }

    public function render()
    {
        Admin::script($this->script());
        return '<a data-method-link-select data-href="' . e($this->link) . '" ' . $this->formatAttributes() . ' href="javascript:void(0);">' . ($this->text ?: e($this->link)) . '</a>';
    }

    /**
     * Get an attribute from the fluent instance.
     *
     * @param  string  $key
     * @param  mixed   $default
     * @return mixed
     */
    public function get($key, $default = null)
    {
        if (array_key_exists($key, $this->attributes)) {
            return $this->attributes[$key];
        }

        return value($default);
    }

    /**
     * Get the attributes from the fluent instance.
     *
     * @return array
     */
    public function getAttributes()
    {
        return $this->attributes;
    }

    /**
     * Convert the fluent instance to an array.
     *
     * @return array
     */
    public function toArray()
    {
        return $this->attributes;
    }

    /**
     * Convert the object into something JSON serializable.
     *
     * @return array
     */
    public function jsonSerialize()
    {
        return $this->toArray();
    }

    /**
     * Convert the fluent instance to JSON.
     *
     * @param  int  $options
     * @return string
     */
    public function toJson($options = 0)
    {
        return json_encode($this->jsonSerialize(), $options);
    }

    /**
     * Determine if the given offset exists.
     *
     * @param  string  $offset
     * @return bool
     */
    public function offsetExists($offset)
    {
        return isset($this->attributes[$offset]);
    }

    /**
     * Get the value for a given offset.
     *
     * @param  string  $offset
     * @return mixed
     */
    public function offsetGet($offset)
    {
        return $this->get($offset);
    }

    /**
     * Set the value at the given offset.
     *
     * @param  string  $offset
     * @param  mixed   $value
     * @return void
     */
    public function offsetSet($offset, $value)
    {
        $this->attributes[$offset] = $value;
    }

    /**
     * Unset the value at the given offset.
     *
     * @param  string  $offset
     * @return void
     */
    public function offsetUnset($offset)
    {
        unset($this->attributes[$offset]);
    }

    /**
     * Handle dynamic calls to the fluent instance to set attributes.
     *
     * @param  string  $method
     * @param  array   $parameters
     * @return $this
     */
    public function __call($method, $parameters)
    {
        $this->attributes[$method] = count($parameters) > 0 ? $parameters[0] : true;

        return $this;
    }

    /**
     * Dynamically retrieve the value of an attribute.
     *
     * @param  string  $key
     * @return mixed
     */
    public function __get($key)
    {
        return $this->get($key);
    }

    /**
     * Dynamically set the value of an attribute.
     *
     * @param  string  $key
     * @param  mixed   $value
     * @return void
     */
    public function __set($key, $value)
    {
        $this->offsetSet($key, $value);
    }

    /**
     * Dynamically check if an attribute is set.
     *
     * @param  string  $key
     * @return bool
     */
    public function __isset($key)
    {
        return $this->offsetExists($key);
    }

    /**
     * Dynamically unset an attribute.
     *
     * @param  string  $key
     * @return void
     */
    public function __unset($key)
    {
        $this->offsetUnset($key);
    }

    /**
     * @return mixed
     */
    public function __toString()
    {
        return $this->render();
    }
}

例:

new App\Admin\Extensions\MethodLink(admin_base_path('index'), 'POST', '我是POSTLINK')