midgard/createphp
CreatePHP is a lightweight PHP library to integrate Create.js into existing apps and frameworks. Implement RdfMapperInterface to map domain models to RDF metadata, enabling in-place content editing and semantic data handling.
Install via Composer:
composer require midgard/createphp
(Note: Due to age, verify compatibility with your PHP version—this package was last updated in 2015.)
Basic Integration:
RdfMapperInterface for your domain models (e.g., User, Post).Mapper/ (e.g., AbstractRdfMapper) to reduce boilerplate.use Midgard\CreatePHP\RdfMapperInterface;
class UserMapper implements RdfMapperInterface {
public function objectToName($object) { return 'user'; }
public function objectToRdf($object) { /* Convert to RDF */ }
public function rdfToObject($rdf) { /* Convert RDF to PHP object */ }
public function store($entity, $object) { /* Save to backend */ }
}
First Use Case:
Manager:
$manager = new \Midgard\CreatePHP\Manager();
$manager->setMapper('user', new UserMapper());
RestService to handle Create.js requests (e.g., CRUD operations):
$restService = $manager->getRestHandler();
$restService->handleRequest(); // Process incoming Create.js API calls
Quick Demo:
Model Mapping:
User → user:hasName, user:hasEmail).ChainRdfMapper (since v1.1.0) to combine mappers for complex models (e.g., Post + Author).
$chainMapper = new \Midgard\CreatePHP\ChainRdfMapper([$userMapper, $postMapper]);
REST API Integration:
Route::post('/api/createjs', function () {
$manager = app(\Midgard\CreatePHP\Manager::class);
return $manager->getRestHandler()->handleRequest();
});
RestService auto-parses Create.js payloads (JSON) and returns RDF responses.Data Persistence:
store() in your mapper to save RDF to your backend (e.g., Doctrine, Eloquent, or raw SQL).public function store($entity, $object) {
$model = User::create([
'name' => $object->name,
'email' => $object->email,
]);
return $model->toArray(); // Return data for Create.js
}
Workflow Management (v1.0.0+):
RestService (not Manager):
$restService->registerWorkflow('publish_post', function ($data) {
// Custom logic (e.g., publish logic)
return ['status' => 'success'];
});
Manager and RestService in AppServiceProvider:
public function register() {
$this->app->singleton(\Midgard\CreatePHP\Manager::class, function ($app) {
$manager = new \Midgard\CreatePHP\Manager();
$manager->setMapper('user', new UserMapper());
return $manager;
});
}
Route::post('/api/createjs', [CreateJSController::class, 'handle'])
->middleware('auth:api');
Deprecation Warnings:
RdfMapperInterface::objectToName added in v1.1.0).Manager to RestService in v1.0.0 (update calls if using older code).RDF Complexity:
objectToRdf() output against the demo.rdfToObject() when models reference each other (e.g., User ↔ Post).Performance:
memory_get_usage().Archived Status:
json_encode() flags).Logging RDF: Add debug output in mappers:
public function objectToRdf($object) {
$rdf = $this->buildRdf($object);
\Log::debug('RDF Output:', ['rdf' => $rdf]);
return $rdf;
}
Create.js Payloads:
$requestData = json_decode(file_get_contents('php://input'), true);
\Log::debug('Create.js Request:', $requestData);
Mapper Validation:
// Test empty objects
$mapper->rdfToObject([]);
// Test nested objects
$mapper->objectToRdf((object) ['name' => 'Test', 'children' => []]);
Custom RDF Vocabulary:
Extend AbstractRdfMapper to add domain-specific predicates:
class CustomRdfMapper extends \Midgard\CreatePHP\AbstractRdfMapper {
protected function getCustomPredicates() {
return [
'http://example.com#customProperty' => 'custom_property',
];
}
}
Event Hooks: Use Laravel events to trigger actions on RDF operations:
// In your mapper's store() method:
event(new \App\Events\RdfStored($entity, $object));
Alternative Backends:
Replace the default store() implementation to integrate with:
rdflib-php for SPARQL endpoints.Node Types:
The config format changed in v0.9.0. Ensure your nodeType and childtypes are defined as arrays:
// Old (pre-0.9.0)
'nodeType' => 'user',
// New (0.9.0+)
'nodeType' => ['user'],
'childtypes' => ['post' => ['type' => 'post']],
Chained Mappers:
ChainRdfMapper are executed in sequence. Place more specific mappers first.user:email vs. author:email).Error Handling:
response()->json() to customize:
return response()->json(['success' => true, 'warnings' => ['field' => 'Invalid value']], 200);
How can I help you explore Laravel packages today?