cakephp/datasource
CakePHP Datasource provides the core datasource layer used by CakePHP ORM, defining interfaces and base classes for connections, schema/statement handling, and query execution. A foundation for building and integrating database drivers and custom datasources.
Installation
Since cakephp/datasource is not Laravel-native, install via Composer (if needed for legacy CakePHP patterns):
composer require cakephp/datasource
(Note: Laravel’s Eloquent already handles most of this—this package is niche for custom data sources.)
First Use Case: Custom Data Source
Use the Cake\Datasource\ConnectionManager trait to manage non-DB connections (e.g., APIs, NoSQL):
use Cake\Datasource\ConnectionManager;
class ApiDataSource {
use ConnectionManager;
public function __construct() {
$this->loadConnection('api', [
'className' => 'Cake\Datasource\Connection\ClientConnection',
'driver' => 'Cake\Datasource\Connection\ClientConnection',
'config' => ['baseUrl' => 'https://api.example.com']
]);
}
}
Key Classes to Explore
ConnectionManager: Manages connections (like Laravel’s DB facade).Query: Builds queries for custom sources (similar to Eloquent’s Builder).Entity: Maps data to objects (like Eloquent models).DB facade for non-DB sources:
// In a service provider
$this->app->singleton('api', function ($app) {
return new ApiDataSource();
});
ConnectionManager::config() to switch sources at runtime.$query = $this->ApiDataSource->newQuery()
->select(['id', 'name'])
->where(['active' => true]);
Cake\Datasource\Connection\ClientConnection for APIs/NoSQL.use Cake\Datasource\Entity\Entity;
$user = new Entity(['id' => 1, 'name' => 'John'], ['alias' => 'User']);
Cake\Validation\Validator for data rules (like Laravel’s FormRequest).Query for complex joins, then hydrate with Eloquent:
$results = $this->ApiDataSource->execute($query);
return User::hydrate($results->toArray());
Laravel vs. CakePHP Quirks
Entity lacks Laravel’s mass assignment protection. Use protected $_accessible or Cake\ORM\Table::validate().->find('all') vs. Eloquent’s ->get()).Connection Caching
ConnectionManager::getConnection() to avoid leaks.No Built-in Migrations
Schema for custom sources requires manual setup.ConnectionManager::config('Log', ['enabled' => true, 'queries' => true]);
$query->sql(); // Returns raw SQL (or API request string for custom drivers).
Custom Drivers
Extend Cake\Datasource\Connection\ConnectionInterface for new data sources (e.g., GraphQL):
class GraphQLConnection implements ConnectionInterface {
public function execute($sql, $params = []) {
// Custom logic
}
}
Event Listeners
Hook into ConnectionManager::config() or Query::beforeExecute() for middleware.
Laravel Service Providers
Bind Cake’s TableRegistry to Laravel’s container:
$this->app->bind('Cake\ORM\TableRegistry', function ($app) {
return new TableRegistry($app['db']);
});
->batch([1, 2, 3]) for API calls (like Eloquent’s ->findMany()).contain() works similarly to Eloquent’s with().How can I help you explore Laravel packages today?