For more information please check composer website.
$ composer require 'devhelp/piwik-silex-provider:dev-master'
Working example can be found at devhelp/piwik-silex-provider-sandbox
Provides integration of Piwik API into Silex. Adds services to the dependency injection container that allows to use Piwik API methods as services. It uses devhelp/piwik-api library - check its documentation for more advanced usage.
$app = new Silex\Application();
$app->register(new Devhelp\Silex\Piwik\PiwikApiServiceProvider(array(
'client' => 'my_piwik.client',
'api' => array(
'reader' => array(
'url' => 'http://my_piwik_instance.piwik.pro',
'default_params' => array(
'token_auth' => 'piwik_token_auth',
'idSite' => 123
)
)
)
)));
This example uses PiwikGuzzleClient
class that is responsible for making http request to Piwik.
You can include this extension by including devhelp/piwik-api-guzzle in your project
//'guzzle' service must implement GuzzleHttp\ClientInterface
$app['my_piwik.client'] = $app->share(function () use ($app) {
return new Devhelp\Piwik\Api\Guzzle\Client\PiwikGuzzleClient($app['guzzle']));
});
add service to the container
$app['my_service'] = $app->share(function () use ($app) {
return new Acme\DemoBundle\Service\MyService($app['devhelp_piwik.api']);
});
example service definition
namespace Acme\DemoBundle\Service;
use Devhelp\Piwik\Api\Api;
class MyService
{
/**
* @var Api
*/
private $piwikApi;
public function __construct(Api $piwikApi)
{
$this->piwikApi = $piwikApi;
}
public function doSomething()
{
//...
$this->piwikApi->getMethod('PiwikPlugin.pluginAction')->call();
//...
}
}
You are allowed to set services as a params. If you do that then the service will be used to resolve the parameter
at runtime. For example have a service that would return token_auth
of logged in user
$app = new Silex\Application();
$app->register(new Devhelp\Silex\Piwik\PiwikApiServiceProvider(array(
'client' => 'my_piwik.client',
'api' => array(
'reader' => array(
'url' => 'http://my_piwik_instance.piwik.pro',
'default_params' => array(
'token_auth' => 'my_token_auth_provider',
'idSite' => 123
)
)
)
)));
my_token_auth_provider
service definition (assumes that SecurityServiceProvider is registered)
$app['my_token_auth_provider'] = $app->share(function () use ($app) {
return new Acme\DemoBundle\Param\MyTokenAuthProvider($app['security.token_storage']);
});
MyTokenAuthProvider
class definition (assumes that User class has getPiwikToken method)
namespace Acme\DemoBundle\Param;
use Devhelp\Piwik\Api\Param\Param;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
class MyTokenAuthProvider implements Param
{
/**
* @var TokenStorageInterface
*/
private $tokenStorage;
public function __construct(TokenStorageInterface $tokenStorage)
{
$this->tokenStorage = $tokenStorage;
}
public function value()
{
$token = $this->tokenStorage->getToken();
return $token instanceof TokenInterface ? $token->getUser()->getPiwikToken() : null;
}
}
$app['my_piwik_method'] = $app->share(function () use ($app) {
return $app['devhelp_piwik.api']->getMethod('VisitFrequency.get');
});
Feel free to create an issue if you think that something is missing or needs fixing. Feedback is more than welcome!
Brought to you by : devhelp.pl