Skocz do zawartości

Witaj na forum webmasterów Webax.pl.

Wyświetl nową zawartość

System pluginów w PHP


  • Zaloguj się, aby dodać odpowiedź
3 odpowiedzi w tym temacie
Thelleo
Thelleo

    Początkujący

  • Użytkownik
  • PipPipPip
  • 115 postów
#1

Napisano 21 październik 2012 - 01:40

Na potrzeby swojego projektu, którym jest CMS chciałem stworzyć do niego mechanizm pluginów za pomocą których będę mógł się wczepiać do różnych funkcji skryptu.
Osobiście uważam, że bardzo przyjemnym w użyciu systemem jest ten umieszczony w MyBB dlatego moja metoda opiera się o podobną ideę.

Ogólnie rzecz biorąc to co teraz chciałbym przedstawić to mój pomysł na niewielki, ale potężny system pluginów opartych o haki za pomocą których możemy wczepić się w każde miejsce w którym programista przewidział możliwość wczepiania.

Klasa ma 2 metody. Pierwsza to register_hook($name, callable $function) za pomocą którego rejestrujemy akcję dla haka. W 1 parametrze wpisujemy nazwę haka, natomiast w drugim nazwę funkcji bądź inną rzecz będącą "callable".
Natomiast drugą metodą jest run_hook($name, $params = NULL) za pomocą której odpalamy funkcje przypisane do danego haka. W pierwszym parametrze znajduje się jego nazwa, natomiast w drugim ewentualne parametry, które chcemy przekazać do funkcji.

No dobrze, po tym krótkim wstępie przyszedł czas na kod opatrzony lekkim komentarze i przykładem zaprezentowanym pod klasą.

/**
* Simple class for basic plugin system based on hooks.
* You can register many function to one hook and run they all with one method.
*
* @author Thelleo
* @see http://youcode.pl
* @version 1.0.0
* @copyright Thelleo © 2012
* @license BSD
*
* @package Curro
* @subpackage Plugin
*/
class Curro_Plugin
{
/**
* List of registered hooks
* @var array
*/
static protected $hooks = array();

/**
* Registering new hook
* @param string $name -- Name of hook
* @param callable $function -- Callable function, you can use name of function in string or anonymous function
*/
static public function register_hook($name, callable $function)
{
self::$hooks[$name][] = $function;
}

/**
* Running functions registered to selected hook.
* @param string $name -- Name of hook to run
* @param mixed $params -- Params passed to functions
*/
static public function run_hook($name, $params = NULL)
{
if(array_key_exists($name, self::$hooks))
{
foreach(self::$hooks[$name] as $hook)
{
$hook($params); // Cool, huh?
}
}
}

}

/**
* TEST
*/

function change_name()
{
// Global needs to be about 20% cooler, but you can live with him.
global $text;
$text = 'Zmieniona nazwa!';
}

Curro_Plugin::register_hook('example_hook', 'change_name');

$text = 'Jestem sobie tekstem, który zostanie zmieniony przez plugin.
';
echo 'Tekst przed aktywacją haka: '.$text.'
';

Curro_Plugin::run_hook('example_hook');

echo 'Tekst po aktywacji haka: '.$text;


?>

banner_400x70.png


Viperoo
Viperoo

    Początkujący

  • Moderator
  • 138 postów
#2

Napisano 24 styczeń 2013 - 08:44

Pluginy mogą się komunikować między sobą ? Mogą się komunikować z Modele/Controllerem ? A co jak będę miał wiele pluginów pod jedno zaczepienie ?

Dada
Dada

    Nowicjusz

  • Użytkownik
  • PipPip
  • 6 postów
#3

Napisano 24 styczeń 2013 - 12:17

Bardzo fajny system. ;)

Viso
Viso

    Początkujący

  • Użytkownik
  • PipPipPip
  • 31 postów
#4

Napisano 26 styczeń 2013 - 14:01

Klasa, która jest całkowicie statyczna i działa na zasadzie kontenera nie ma absolutnego sensu, nie wspominając o korzystaniu z "global", który w obecnej wersji php powinien mieć całkowity zakaz występowania ;) Jeśli tworzysz już obiektowo dany ten system używaj Dependency Injection. Co do uruchamiania/wstrzykiwania danych pluginów powinieneś to rozbić na kilka rodzajów (możesz obrać też technikę filtrów - before/after). Pluginy to dość szeroki temat, mające ogroomne zastosowanie, więc obsługę ich pasowałoby zrobić całkiem sensowną. Zamiast tylko funkcji przydałaby się również interwencja dla całych klas, co jeśli plugin jest spory - ładowanie go do jednej funkcji to samobójstwo. W dodatku dobierz jakieś sensowne nazwy dla klas, bo "Curro_Plugin" mówi jedynie tyle, że jest to projekt Curro i jakaś biblioteka Plugin (co wygląda na coś pojedynczego), a w twoim przypadku występuje Registry/Manager.




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych