Skip to content

Instantly share code, notes, and snippets.

@everzet
Created November 29, 2011 22:40
Show Gist options
  • Select an option

  • Save everzet/1406938 to your computer and use it in GitHub Desktop.

Select an option

Save everzet/1406938 to your computer and use it in GitHub Desktop.
Symfony2.1 ResourceWatcher usage example
<?php
$watcher = new Symfony\Component\ResourceWatcher\ResourceWatcher;
// track any change inside directory:
$watcher->track('some/folder1', function($event) {
echo '['.$event->getType().'] '.$event->getResource()."\n"
});
// track only creations inside directory:
$watcher->track('some/folder2', function($event) {
echo $event->getResource()." was created\n"
}, Symfony\Component\ResourceWatcher\Event\Event::CREATED);
// track only *.xml file changes inside directory:
$watcher->track(
new Symfony\Component\Config\Resource\DirectoryResource('some/folder3', '/\.xml$/'),
function($event) use($watcher) {
echo '['.$event->getType().'] '.$event->getResource()."\n"
// stop tracking when first even occurs:
$watcher->stop();
}
);
// start tracking:
$watcher->start();
@schmittjoh
Copy link

I agree with you on both points. If we concur that using the EventDispatcher is a good idea, we could start to add some sugar to the raw version above.

a) When used inside Symfony2, we will probably have one watch command (php app/console watcher:start), and all interested components can hook up with this command via tagging respective services.

services:
    my_listener:
        tags:
            - { name: event_listener, event: watcher.file_changed }
            - { name: watcher.resource, dir: some/dir, pattern: *.xml }
            - { name: watcher.resource, dir: another/dir }

This would then be desugarized to the extended version above.

b) When used standalone, we could add a convenience method addListener to the Watcher class which could look like this:

<?php

class Watcher
{
    // ...
    public function addListener($resource, $event, $callable, $priority)
    {
        $this->track($resource);
        $this->dispatcher->addListener($event, new FilteredListener($resource, $callable), $priority);
    }
}

This way we get the best of both worlds. Simple and easy when used standalone and also fits nicely in the Symfony2 Framework context. What do you think?

@everzet
Copy link
Author

everzet commented Nov 30, 2011

What about adding tracking_id to event names? For example:

<?php
$watcher = new Watcher();

// We can require users to specify unique tracking id in `track()` method:
$watcher->track('twig_templates', new DirectoryResource('/some/dir', '/regex/'));

And this way, watcher will send both watcher.twig_templates.file_changed and
watcher.file_changed events for this particular tracking. In this case, user will be able to
choose whether he needs to receieve all or only specific-track events. This will remove
the need in FilteredListener, which complicates things a lot.

@datiecher
Copy link

I guess by now everyone are agreeing on accepting both a callable and an object so I would not jump in on that.

I'm more inclined towards @everzet last option. Way easier to understand and use.

@schmittjoh
Copy link

Yes, sounds good to me as well.

How about reversing the order of arguments function track($resource, $alias = null);?

@everzet
Copy link
Author

everzet commented Nov 30, 2011

Well, there should be 3 parameters at least - $resource, $trackingId and $trackedEvents because there's no reason to track any folder change if user only interested in a file_change

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment