parziphal/parse
A Laravel-friendly wrapper for Parse Server that simplifies models, queries, authentication, and data storage, helping PHP developers integrate Parse into their apps with less boilerplate and more natural Laravel-style workflows.
composer require parziphal/parse
config/parse.php) and wire credentials in .env: PARSE_APP_ID, PARSE_REST_KEY, PARSE_MASTER_KEY (server-side only), and PARSE_SERVER_URL pointing at your Parse Server (or https://api.parse.com/1 if you're still on legacy Parse—unlikely today).Model base class in src/. Everything hinges on it: it proxies attribute access to a backing Parse object and exposes static query/find entry points. Skim the README examples before writing code—the Eloquent-shaped surface hides a much smaller feature set than Eloquent.use Parse\Model;
class Post extends Model
{
protected $className = 'Post';
}
$post = Post::find('abc123objectId');
$post->title = 'Hello Parse';
$post->save();
This is the shortest path to verifying config, credentials, and the class-name mapping all work together.Model-per-Parse-class. Treat each Parse class as an Eloquent-style model. That gives you find, where(...)->get(), first(), save(), delete(), plus attribute get/set. Keep model classes thin—there's no migration, no schema, and no observer system to hang logic on.
Query building mirrors Eloquent, not Parse. Prefer the fluent style so your code stays portable:
$posts = Post::where('published', true)
->where('createdAt', '>', $since)
->orderBy('createdAt', 'desc')
->limit(25)
->get();
Fall back to the raw Parse SDK query ($post->query()) only when you need Parse-only operators (geo, regex, $inQuery, $relatedTo).
Pointers and relations. Parse relationships are pointer fields, not Laravel relations. Load related objects explicitly—either by fetching the pointer's objectId and calling Related::find($id), or by using include() in the query so the pointer resolves in one round trip. There is no lazy-loading; if you expect $post->author to be a model instance, you must include it.
Server-side controllers. This package shines in Laravel controllers/jobs where you act as a trusted backend: use the master key in config so you can read protected classes, bypass ACLs, and query users. Never ship the master key to the client—this package assumes server execution.
Auth flows. For signup/login, use the Parse SDK's user class directly rather than shoehorning it through models. On success, persist the session token in your Laravel session and reconstruct the user on subsequent requests via the SDK's become().
Bulk writes. save() is one object per call. For imports, batch by instantiating many models and saving in a loop, or drop to the SDK's batch request support—wrap it in a Laravel job so it can retry.
composer require just works on newer Laravel.protected $className mismatch with the actual class on the server yields empty results rather than an error. Log the resolved class name when debugging "why is my query empty."skip/limit or you'll silently truncate large result sets.ParseDateTime type; the package's attribute access may hand you strings or Parse date objects rather than Carbon. Convert at the boundary (a small accessor/mutator on your model) so the rest of your app deals only in Carbon..env values per environment.ParseException and translate to your app's domain errors rather than letting Parse codes leak to users.Model is the place to extend: add $fillable-style guards, custom casts, or a boot hook for common scopes. Keep the subclasses minimal so upgrades to the package remain trivial.parse/php-sdk calls or a newer Eloquent-like wrapper without touching domain code.How can I help you explore Laravel packages today?