[geeklog-devel] Quick overview of GL2 and what we have so far and how it relates to the API

Tony Bibbs tony at tonybibbs.com
Mon Nov 3 10:45:44 EST 2003


Yeah, but if you start depending on files then it makes having GL2 work
on multiple webservers more difficult. Let me think about this some more.

--Tony

Vincent Furia wrote:

> My idea was to store who registered which events in the database. But,

> thinking ahead, since event registration is not a frequent task (and

> therefore the table won't be changing all that much) I think we could

> easily use a php file as a cache. The php file would get updated

> everytime the event_handler table was altered. This would prevent

> unnecessary database calls.

>

> The cache file could look something like:

> <?php

> $eventListener['plugin']['event'][] = 'listening plugin';

> ?>

>

> And then once this file is loaded, and GL2 core gets notified of an

> event, all it has to do is:

> foreach ($eventListener[$plugin][$event] as $plugs) {

> require_once($plugs . '/functions.inc'); // or whatever file...

> $plugs::onEvent($plugin, $event, $vars);

> }

>

> The only problem I see with the method you suggest is that every

> plugin's functions.inc file (or whatever the equivilent we will use in

> GL2) will have to be loaded whenever any event occurs. The method

> recommended above, would only need to load the plugins that are

> listening for an event. Since I expect many more events to occur than

> are actually going to be handled by the different plugins, this will

> probably end up saving CPU and Memmory usage. It will allow us to stick

> with the MVCnPHP mantra of loading only what is necessary.

>

> -Vinny

>

> Tony Bibbs wrote:

>

>> I need more time to digest this but one quick note about your approach

>> to event handling. If I read it right, your method requires trip(s)

>> to the database to be able to determine which modules wanted to be

>> triggered when an event occurs. I would like to see us implement this

>> in a way that would avoid that overhead and I think we can do it. For

>> example, a module will know when it is shipped which modules it will

>> try to interact with. Here is a snippet that I think can handle this:

>>

>> /**

>> * This calls an event on any module

>> *

>> * NOTE: this is just a stub in the API

>> *

>> * @param string $eventName Name of the event that was fired

>> * @param string $module Name of the module that triggered an event

>> * @param array $args Array of arguments for the handler

>> *

>> */

>> function handleEvent($eventName, $module, $args)

>> {

>> }

>>

>> For example purposes let's assume the following is the API

>> implementation of the function above for the forum module:

>>

>> /**

>> * Proxies events to the appropriate non-API event handlers

>> *

>> *

>> * @param string $eventName Name of the event that was fired

>> * @param string $module Name of the module that triggered an event

>> * @param array $args Array of arguments for the handler

>> *

>> */

>> function handleEvent($eventName, $module, $args)

>> {

>> switch ($module) {

>> 'Geeklog':

>> // Call local non-API method to handle Messaging event

>> return handleGeeklogEvent($eventName);

>> 'Messaging':

>> // Call local non-API method to handle Messaging event

>> return handleMessagingEvent($eventName);

>> 'Stories':

>> // Call local non-API method to handle Story event

>> return handleStoryEvent($eventName);

>> default:

>> // For all other modules we don't care so bail

>> return false;

>> }

>> }

>>

>> Though you can see the trend, here is what you would have in one of

>> the event handlers. Let's assume this is the forum's event handler

>> for messaging:

>>

>> function handleMessagingEvent($eventName)

>> {

>> switch ($eventName) {

>> 'onPMSent':

>> return ForumEventHandler::hand

>> EventHandler::

>> }

>>

>> In this way you don't need to register events in a database. You may

>> be able to condense this a bit by using is_callable() or

>> method_exists() to avoid too many levels of event handling proxies but

>> this demonstrates my idea. Again, I think we should trim GL2 down to

>> essential DB calls and if we can avoid them here I'd like to. I'm

>> sure there may be arguments for doing it in the DB which is fine, just

>> let me know what they are (i.e. I'm not married to any decision yet).

>>

>> Thoughts or concerns?

>>

>> --Tony

>>

>> Vincent Furia wrote:

>>

>>> A couple comments I wanted to add about plugins and other GL2 stuff.

>>> First, I think that we should consider making some of the 'core'

>>> functionality into plugins instead. Specifically I'm referring to the

>>> comment engine, the (potential) ratings engine, and the messaging

>>> system (maybe even the logging system?). This would allow users to

>>> replace the functionality provided by these plugins. A good example

>>> of this might be replacing a standard comment system with a

>>> forum-like comment system. I think doing so would give GL2 even more

>>> flexibility.

>>>

>>> I know Tony didn't mean the core feautre list to be exhaustive, but

>>> one item I didn't see (but would like to see) was a configuration

>>> utility. I think, with GL2, we should get away from forcing GL

>>> administrators from editing config.php by hand and move to a fully

>>> web based configuration utility that can be used by the plugins as

>>> well being used for core feautres.

>>>

>>> On that subject I think it's time to start putting together a

>>> document that shows what core functionality GL2 will provide and any

>>> information we have on how it will provide that. Something like a

>>> design document. It's something that I'd be willing to work on, but

>>> I'd need a lot of information and support, especially from Tony.

>>> Maybe this is something that would best be done in a Wiki format?

>>>

>>> Finally, I have a few comments about event handling system and a few

>>> comments on plugins in general. If we do this well, and efficiently,

>>> we could have a really flexible, extensible system that will beat out

>>> every other open source system I've seen. For that reason I think

>>> its important to focus, briefly on how the plugin event calls might

>>> work in GL2. This is just a rough idea, and I'd really like to see

>>> input on what you all think of this.

>>>

>>> Each plugin should be able to register the fact it wants to be called

>>> when certain events occur:

>>> registerEventCallback(plugin registering callback, plugin raising

>>> event, event)

>>>

>>> Then, a plugin can notify GL2 that event has occurred with:

>>> raiseEvent(plugin raising event, event, parameters) //

>>> parameters: array of values

>>>

>>> Upon being notified that an event occurred, GL2 can call the plugin

>>> API for all plugins registered to recieve the event:

>>> onEvent(plugin raising event, event, parameters)

>>>

>>> Also plugins need to be able to invoke an event/function in another

>>> plugin:

>>> invokeEvent(plugin providing function, event, parameters)

>>>

>>> I'm still thinking about possible ways raiseEvent and invokeEvent can

>>> handle returned values. One possibility, at least for invokeEvent, is

>>> the functions could be required to return a small object containing

>>> status (-1, failure; 0, plugin function not found; 1, success; etc.)

>>> and the results of the call:

>>> $P = invokeEvent(plugin, event, parameters);

>>> if ($P->status > 0) {

>>> echo $P->result;

>>> }

>>>

>>> Of course all this leads to a question if we should have a severely

>>> simplified API where even core functionality such as the moderation

>>> fuctions, comment functions, etc should all be called through this

>>> event API (with a plugin name = 'core'). One advantage to doing it

>>> this way would allow us to extend plugin functionality in later

>>> releases without affecting the plugin API (which would prevent plugin

>>> obsolesence to an extent).

>>>

>>> Another issue I think we should start talking about is plugin

>>> dependency, and how to handle it gracefully. Obviously plugins will

>>> support, to one extent or another, the use of other plugins. This

>>> could run the gambit from a plugin being dependent on another plugin

>>> to work, to a plugin using another plugin in a non dependent way

>>> (i.e. the plugin isn't required for operation, just for extended

>>> functionality).

>>>

>>> I think that is more than enough to digest in one sitting. If anyone

>>> would like to chat with me I'll try to be available in #geeklog. Of

>>> couse, email discourse is always welcome as well.

>>>

>>> -Vinny

>>> Who is already having fun...

>>>

>>> _______________________________________________

>>> geeklog-devel mailing list

>>> geeklog-devel at lists.geeklog.net

>>> http://lists.geeklog.net/listinfo/geeklog-devel

>>

>>

>>

>

>

> _______________________________________________

> geeklog-devel mailing list

> geeklog-devel at lists.geeklog.net

> http://lists.geeklog.net/listinfo/geeklog-devel


--
+----------------------------------------------------------------------+

|Tony Bibbs |[R]egardless of what you may think of our penal |

|tony at tonybibbs.com |system, the fact is that every man in jail is one |

| |less potential fisherman to clutter up your |

| |favorite pool or pond. --Ed Zern |

+----------------------------------------------------------------------+




More information about the geeklog-devel mailing list