xternalsoft/laravel-patrowl
Laravel Patrowl integrates the Patrowl security scanning orchestrator with your Laravel application, offering a simple wrapper to configure connections, launch scans, and manage findings so teams can bring automated security monitoring into their existing Laravel workflows.
controls()->assets($controlId) is the only way to get impacted/potentially-impacted assets, because the control detail endpoint returns empty assets_impacted and assets_warning. Any "which assets does this control affect?" screen depends on this method — treat it as a hard dependency when scoping that feature, not an implementation detail.assets()->move($assetId, $targetOrganizationId, deleteSource: true) turns org consolidation (M&A, customer offboarding, re-org) into a workflow we can ship instead of a manual ops runbook. Product decision it forces: owners, teams, and groups are not copied and are returned in the result — so either we require re-assignment as an explicit step, or we surface a "needs owner" queue. Decide which before committing the feature.organizations()->default() — combined with DTOs no longer reading Laravel's config() (which previously overrode the connector's default org) — means tenant resolution is now an explicit product decision per request context rather than an ambient fallback. Good for correctness, but it is a real behavior change to design around.assetTags()->all() and get() are removed because the API no longer serves those routes, and assets()->replace() is gone. Any tag-catalog UI or upsert-style idempotent sync design is invalidated. Tag management becomes attach/detach-only; sync jobs need a read-modify-write path. Scope these as follow-on work, not silent regressions.UPGRADE.md), not folded into a feature sprint on the assumption of drop-in replacement.Adopt when:
Look elsewhere or defer when:
organizations()->default(), assets()->replace(), assetTags()->all()/get(), or organizations()->all() returning something other than OrganizationLiteData[]. If you can't absorb that migration this quarter, pin and defer.move() deliberately doesn't copy them; if that's a hard requirement, this isn't the tool.config() for connector behavior. DTOs no longer read it by design (it crashed outside Laravel and overrode the connector's default organization) — verify your configuration path before upgrading.Also worth a review gate: assets()->create() now throws AssetAlreadyExistsException on HTTP 208. If your sync logic previously treated "already exists" as success, that is a silent behavior change in an error path — test it before rollout. Conversely, assets()->delete(), addTag(), removeTag() now hit current endpoints (the old routes return 403/404), so previously broken write paths may actually start working; re-test rather than assuming prior behavior.
For executives: The Patrowl integration now exposes read-only EASM data — external attack surface visibility covering certificates, technologies, services, and CVE detections per asset. We can ship this as a reporting capability without building a scanner or maintaining a bespoke API client. The v2.0.0 upgrade is a bounded, documented engineering task with a published upgrade path, not a rewrite; cost concentrates in a handful of removed convenience methods. Net: a new customer-facing security surface at integration cost, not platform cost.
For engineering: v2.0.0 adds typed DTOs for the full EASM read surface with README documentation, auto-pagination on the control→asset lookup (controls()->assets()), and a first-class cross-org asset move that reports back the fields it does not copy. DTOs are decoupled from Laravel's config(), so the same code runs in queue workers and CLI. Breaking changes are enumerated in UPGRADE.md; the ones that matter are the removal of assetTags()->all()/get(), assets()->replace(), and organizations()->default(), the changed return type of organizations()->all(), the new AssetAlreadyExistsException on HTTP 208, AssetInListData::$relatedTechnologies becoming an array, and CreateAssetGroupData::$criticality becoming non-nullable. Several write paths were also fixed against current endpoints (delete, addTag, removeTag, bulk update with trailing slash), so retest them rather than trusting existing test assumptions.
Risk posture: pin the version, run a targeted search for the removed methods, review the 208 "already exists" path, and schedule the upgrade as discrete work with a compatibility pass.
How can I help you explore Laravel packages today?