google/common-protos
Generated PHP classes for Google’s common Protocol Buffer types used across the Google API ecosystem. Distributed as the google/common-protos Composer package under Apache 2.0 and designed to be stable for use in your applications.
Installation:
composer require google/common-protos
This installs the generated Protocol Buffer (protobuf) classes for Google API common types.
First Use Case: Use the package to define request/response payloads for Google Cloud APIs. For example, to work with quota limits:
use Google\Api\QuotaSettings;
use Google\Api\QuotaLimit;
$quotaLimit = new QuotaLimit();
$quotaLimit->setMaxRequestsPerMinute(1000);
$quotaSettings = new QuotaSettings();
$quotaSettings->setLimit($quotaLimit);
Key Classes to Explore:
google/api/Service.proto (API service definitions)google/api/FieldBehavior.proto (Field behavior metadata)google/api/MethodSettings.proto (Method-level configurations)google/api/ResourceDescriptor.proto (Resource definitions)Documentation:
Use the generated classes to structure API payloads. Example for a custom API:
use Google\Api\MethodSettings;
use Google\Api\ResourceDescriptor;
$methodSettings = new MethodSettings();
$methodSettings->setIdempotencyLevel(MethodSettings::IDEMPOTENCY_LEVEL_UNSPECIFIED);
$resourceDescriptor = new ResourceDescriptor();
$resourceDescriptor->setName('projects');
Leverage FieldBehavior and FieldInfo for metadata-driven validation:
use Google\Api\FieldBehavior;
use Google\Api\FieldInfo;
$fieldInfo = new FieldInfo();
$fieldInfo->setBehavior(FieldBehavior::OPTIONAL);
$fieldInfo->setJsonName('custom_field');
Define quota limits for API methods:
use Google\Api\QuotaSettings;
use Google\Api\QuotaLimit;
$quotaLimit = new QuotaLimit();
$quotaLimit->setMaxRequestsPerMinute(1000);
$quotaLimit->setMaxRequestsPer100Seconds(10000);
$quotaSettings = new QuotaSettings();
$quotaSettings->setLimit($quotaLimit);
Define resources and their permissions:
use Google\Api\ResourceDescriptor;
use Google\Api\ResourcePermission;
$resourcePermission = new ResourcePermission();
$resourcePermission->setName('projects.update');
$resourcePermission->setTitle('Update Project');
$resourceDescriptor = new ResourceDescriptor();
$resourceDescriptor->setName('projects');
$resourceDescriptor->setPermissions([$resourcePermission]);
Use these classes alongside Google Cloud PHP SDKs (e.g., google/cloud-logging):
use Google\Cloud\Logging\V2\LogEntry;
use Google\Api\LogBucket;
$logBucket = new LogBucket();
$logBucket->setAnalyticsEnabled(true);
Extend Laravel's FormRequest to validate against protobuf schemas:
use Illuminate\Foundation\Http\FormRequest;
use Google\Api\QuotaSettings;
class StoreQuotaRequest extends FormRequest
{
public function rules()
{
return [
'max_requests_per_minute' => 'required|integer',
'max_requests_per_100_seconds' => 'required|integer',
];
}
public function validated()
{
$data = parent::validated();
$quotaSettings = new QuotaSettings();
$quotaSettings->setLimit(new QuotaLimit([
'max_requests_per_minute' => $data['max_requests_per_minute'],
'max_requests_per_100_seconds' => $data['max_requests_per_100_seconds'],
]));
return $quotaSettings;
}
}
Convert protobuf responses to Laravel-friendly formats:
use Illuminate\Http\JsonResponse;
use Google\Api\MethodSettings;
public function show(MethodSettings $methodSettings)
{
return new JsonResponse([
'idempotency_level' => $methodSettings->getIdempotencyLevel(),
'name' => $methodSettings->getName(),
]);
}
Bind protobuf classes to Laravel's service container for dependency injection:
$app->bind(
Google\Api\Service::class,
function ($app) {
return new Google\Api\Service();
}
);
Dispatch events with protobuf payloads:
use Illuminate\Support\Facades\Event;
Event::dispatch(new QuotaUpdated(
$quotaSettings
));
Create custom Artisan commands to interact with protobuf schemas:
use Illuminate\Console\Command;
use Google\Api\ResourceDescriptor;
class GenerateResourceDescriptorCommand extends Command
{
protected $signature = 'protobuf:generate-resource {name}';
protected $description = 'Generate a ResourceDescriptor for a given name';
public function handle()
{
$resource = new ResourceDescriptor();
$resource->setName($this->argument('name'));
// Save or log the resource
}
}
Protobuf Version Compatibility:
google/protobuf dependency is updated:
composer require google/protobuf:^4.0
Naming Conventions:
QuotaLimit), while JSON fields may use snake_case or camelCase.getJsonName() or setJsonName() to align with API expectations:
$fieldInfo->setJsonName('snake_case_field');
Immutable Fields:
$methodSettings->setIdempotencyLevel(MethodSettings::IDEMPOTENCY_LEVEL_REQUIRED);
// ❌ Avoid modifying after serialization!
Circular References:
$resource->setParent($parentResource); // Valid
$parentResource->setChild($resource); // May cause infinite loops!
Deprecated Fields:
Endpoint.aliases) were un-deprecated in later versions. Check the changelog for updates.Serialization Errors:
json_encode() with JSON_PRETTY_PRINT to debug malformed protobuf payloads:
$json = json_encode($protobufObject, JSON_PRETTY_PRINT);
dd($json); // Inspect for missing/incorrect fields
Field Validation:
if (!$quotaLimit->getMaxRequestsPerMinute()) {
throw new \InvalidArgumentException('Max requests per minute is required.');
}
Logging Protobuf Objects:
\Log::debug('Protobuf payload', [
'data' => json_decode(json_encode($protobufObject), true),
]);
Protobuf Schema Inspection:
$reflection = new \ReflectionClass(QuotaLimit::class);
foreach ($reflection->getProperties() as $property) {
\Log::debug($property->getName());
}
oneof or extensions:
$methodSettings->
How can I help you explore Laravel packages today?