pro - PHP: ¿Cómo realizar el controlador de eventos?
sportspress pro nulled (4)
Métodos
Tienes varios métodos para hacerlo descritos aquí por ircmaxell.
Y aquí está ToroHook utilizado en ToroPHP (Routing lib).
Gancho
class ToroHook {
private static $instance;
private $hooks = array();
private function __construct() {}
private function __clone() {}
public static function add($hook_name, $fn){
$instance = self::get_instance();
$instance->hooks[$hook_name][] = $fn;
}
public static function fire($hook_name, $params = null){
$instance = self::get_instance();
if (isset($instance->hooks[$hook_name])) {
foreach ($instance->hooks[$hook_name] as $fn) {
call_user_func_array($fn, array(&$params));
}
}
}
public static function remove($hook_name){
$instance = self::get_instance();
unset($instance->hooks[$hook_name]);
var_dump($instance->hooks);
}
public static function get_instance(){
if (empty(self::$instance)) {
self::$instance = new Hook();
}
return self::$instance;
}
}
Usando gancho
Es simple llamarlo así:
ToroHook::add(''404'', function($errorpage){
render("page/not_found", array("errorpage" => $errorpage));
});
Deseo agregar controlador de eventos personalizado al método del objeto.
Tengo una clase con método.
class Post {
public function Add($title) {
// beforeAdd event should be called here
echo ''Post "'' . $title . ''" added.'';
return;
}
}
Deseo agregar un evento al método Add
y pasar los argumentos del método al controlador de eventos.
function AddEventHandler($event, $handler){
// What should this function do?
}
$handler = function($title){
return strtoupper($title);
}
AddEventHandler(''beforeAdd'', $handler);
¿Es posible hacer algo como esto? Espero que mi pregunta sea clara.
Bueno, si estás usando <php 5.3 entonces no puedes crear un cierre de esa manera, pero puedes acercarte con create_function (); Esto sería
$handler = create_function(''$title'', ''return strtoupper($title);'');
Luego, almacena $ handler en la clase y puede llamarlo como lo desee.
Debería ser bastante fácil usando las funciones definidas aquí http://www.php.net/manual/en/book.funchand.php
En particular, debe mantener un conjunto de controladores (o un conjunto de matrices si desea varios controladores para el mismo evento) y luego simplemente hacer algo como
function AddEventHandler($event, $handler){
$handlerArray[$event] = $handler;
}
o
function AddEventHandler($event, $handler){
$handlerArray[$event][] = $handler;
}
en caso de múltiples manipuladores.
Invocar a los manejadores sería simplemente cuestión de llamar a " call_user_func " (eventualmente en un ciclo si se necesitan múltiples manejadores)
Mira en mi biblioteca de sphido / eventos :
- es fácil de usar (pocas líneas de código)
- basado en el manejo de funciones de PHP
- permitir la priorización de oyentes
- agregar / eliminar oyentes
- filtrar valores por funciones
- detener la propagación en la cadena funcional
- agregar controlador predeterminado
Ejemplo de controlador de eventos
on(''event'', function () {
echo "wow it''s works yeah!";
});
fire(''event''); // print wow it''s works yeah!
Ejemplo de función de filtro
add_filter(''price'', function($price) {
return (int)$price . '' USD'';
});
echo filter(''price'', 100); // print 100 USD