Bringing the power of the CakePHP ORM to your favourite webservices.
Using Composer:
composer require muffin/webservice
You then need to load the plugin. You can use the shell command:
bin/cake plugin load Muffin/Webservice
In your app.php
, add a new webservice
config under Datasources
:
'Datasources' => [
// Other db config here
'webservice' => [
'className' => \Muffin\Webservice\Datasource\Connection::class,
'service' => 'Articles',
// Any additional keys will be set as Driver's config.
],
],
If you are making a plugin then conventionally the datasource config key name should be underscored version of plugin name.
<?php
namespace App\Webservice\Driver;
use Cake\Http\Client;
use Muffin\Webservice\Driver\AbstractDriver;
class Articles extends AbstractDriver
{
/**
* Initialize is used to easily extend the constructor.
*/
public function initialize(): void
{
$this->setClient(new Client([
'host' => 'example.com'
]));
}
}
<?php
namespace App\Webservice;
use Muffin\Webservice\Datasource\Query;
use Muffin\Webservice\Datasource\ResultSet;
use Muffin\Webservice\Webservice\Webservice;
class ArticlesWebservice extends Webservice
{
/**
* Executes a query with the read action using the Cake HTTP Client
*/
protected function _executeReadQuery(Query $query, array $options = [])
{
$response = $this->getDriver()->getClient()->get('/articles.json');
if (!$response->isOk()) {
return false;
}
$resources = $this->_transformResults($query->endpoint(), $response->json['articles']);
return new ResultSet($resources, count($resources));
}
}
<?php
namespace App\Model\Endpoint;
use Muffin\Webservice\Model\Endpoint;
class ArticlesEndpoint extends Endpoint
{
}
<?php
namespace App\Model\Resource;
use Muffin\Webservice\Model\Resource;
class Article extends Resource
{
}
<?php
namespace App\Controller;
use Muffin\Webservice\Model\EndpointLocator;
class ArticlesController extends AppController
{
// Either set the default model type to "Endpoint" or explicitly specify
// model type in loadModel() call as shown below.
protected $_modelType = 'Endpoint';
public function index()
{
// This is required only if you haven't set `$_modelType` property to
// "Endpoint" as shown above.
$this->loadModel('Articles', 'Endpoint');
$articles = $this->Articles->find();
}
}
You can also use this plugin as a base to a separate plugin or to manage custom webservice drivers connections.
Until official documentation is written, David Yell wrote a good post to get you started.
The following plugins use the Webservice ORM to give you easy access to all kinds of webservices:
- GitHub plugin - Provides access to the GitHub REST APIs.
- NS plugin - Provides access to the NS (Nederlandse Spoorwegen) APIs.
- Stagemarkt plugin - Provides access to the SBB Stagemarkt REST APIs.
- Twitter plugin - Provides access to the Twitter REST and streaming APIs.
The following plugins implement a Webservice driver with their own methods:
- GitHub plugin - Provides access to the GitHub REST APIs.
- Pusher plugin - Provides access to the Pusher APIs.
- TMDB plugin - Provides access to the TMDB APIs.
- Fork
- Mod, fix
- Test - this is important, so it's not unintentionally broken
- Commit - do not mess with license, todo, version, etc. (if you do change any, bump them into commits of their own that I can ignore when I pull)
- Pull request - bonus point for topic branches
To ensure your PRs are considered for upstream, you MUST follow the CakePHP coding standards.
http://github.com/usemuffin/webservice/issues
Copyright (c) 2015-Present, [Use Muffin] and licensed under The MIT License.