Jump to content
MakeWebGames

Recommended Posts

Posted

Hello everyone,

I forked over a basic hook system that I generally use in my Laravel projects to make it I guess "Framework Agnostic" and figured that some other people on here may find it useful. Its very easy to use, just require the file somewhere in a global file ie global_func.php if you're a MCC user and just instantiate the class

require('Hook.php')

$hook = Hook::getInstance();

Then you can use the get method anywhere that you would like your hook ran. For example, in index.php:

$hooks->get('index_loaded', [$ir['userid']], function ($user) {
    return $user;
}, 'Hello World');

Then somewhere in an autoloaded file you can listen for the hook

/**
* In this example we are listening for the 'index_loaded' hook,
* if found, will replace 'Hello World' with $ir['userid'] and
* print it to the screen
*/

$hooks->listen('index_loaded', function ($callback, $output, $user) {
    if(empty($output)) {
        $output = $user;
    }
    echo $output;
},1);

 

Hook.php

<?php

/**
 * Class Hook
 * Forked from https://github.com/esemve/Hook
 * @license MIT
 * @copyright 2016 Bence Kádár
 */

class Hook
{

    protected $watch = [];
    protected $stop = [];
    private static $instance = null;

    public static function getInstance()
    {
        if (self::$instance == null)
        {
            self::$instance = new Hook;
        }

        return self::$instance;
    }

    /**
     * Return the hook answer.
     *
     * @param string $hook Hook name
     * @param array $params
     * @param callable|null $callback
     * @param string $htmlContent content wrapped by hook
     *
     * @return null|void
     */
    public function get(string $hook, $params = [], callable $callback = null, $htmlContent = '')
    {
        return $this->run($hook, $params, $callback, $htmlContent);

    }

    /**
     * Stop all another hook running.
     *
     * @param string $hook Hook name
     */
    public function stop(string $hook)
    {
        $this->stop[$hook] = true;
    }

    /**
     * Subscribe to hook.
     *
     * @param string $hook Hook name
     * @param $priority
     * @param $function
     */
    public function listen(string $hook, $function, $priority = null)
    {
        $caller = debug_backtrace(null, 3)[0];

        if (empty($this->watch[$hook])) {
            $this->watch[$hook] = [];
        }

        if (!is_numeric($priority)) {
            $priority = null;
        }

        $this->watch[$hook][$priority] = [
            'function' => $function,
            'caller'   => [
                'file' => $caller['file'],
                'line' => $caller['line'],
                'class' => $caller['class'],
            ],
        ];

        ksort($this->watch[$hook]);
    }

    /**
     * Return all registered hooks.
     *
     * @return array
     */
    public function getHooks()
    {
        $hookNames = (array_keys($this->watch));
        ksort($hookNames);

        return $hookNames;
    }

    /**
     * Return all listeners for hook.
     *
     * @param string $hook
     *
     * @return array
     */
    public function getEvents($hook)
    {
        $output = [];

        foreach ($this->watch[$hook] as $key => $value) {
            $output[$key] = $value['caller'];
        }

        return $output;
    }

    /**
     * Run hook events.
     *
     * @param string $hook Hook name
     * @param array $params Parameters
     * @param $callback
     * @param null $output html wrapped by hook
     *
     * @return mixed
     */
    protected function run(string $hook, array $params, $callback, $output = null)
    {
        array_unshift($params, $output);
        array_unshift($params, $callback);

        if (array_key_exists($hook, $this->watch)) {
            if (is_array($this->watch[$hook])) {
                foreach ($this->watch[$hook] as $function) {
                    if (!empty($this->stop[$hook])) {
                        unset($this->stop[$hook]);
                        break;
                    }

                    $output = call_user_func_array($function['function'], $params);
                    $params[1] = $output;
                }
            }
        }

        return $output;
    }

    /**
     * Return the listeners.
     *
     * @return array
     */
    public function getListeners()
    {
        return $this->watch;
    }
}

 

  • Like 2

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...