跳到正文
cccskills
免费在 GitHub 公开

acc-create-policy

Generates Policy pattern for PHP 8.5. Creates encapsulated business rules for authorization, validation, and domain constraints. Includes unit tests.

中文简介正在准备中。当前显示原文说明。

查看安装方法

包含的文件(2)

  • SKILL.md5.0 KB
  • source.json685 B

SKILL.md(原文)

安装前可以查看交给 AI 代理的指令内容。

Policy Pattern Generator

Creates Policy pattern infrastructure for encapsulating business rules and authorization logic.

When to Use

ScenarioExample
Authorization checksCan user cancel order?
Business rule validationIs discount applicable?
Complex conditionsMultiple rules combined
Auditable decisionsLog why access denied

Component Characteristics

PolicyInterface

  • Single responsibility rule
  • Returns authorization result
  • Provides denial reasons

Policy Implementation

  • Encapsulates one business rule
  • Stateless evaluation
  • Composable with other policies

PolicyResult

  • Success/failure status
  • Denial reasons
  • Metadata for logging

Generation Process

Step 1: Generate Shared Components

Path: src/Domain/Shared/Policy/

  1. PolicyResult.php — Result value object with and/or composition
  2. CompositionMode.php — Enum for AllMustPass/AnyMustPass

Step 2: Generate Policy Interface

Path: src/Domain/{BoundedContext}/Policy/

  1. {Name}PolicyInterface.php — Policy contract

Step 3: Generate Concrete Policies

Path: src/Domain/{BoundedContext}/Policy/

  1. {Rule1}Policy.php — First rule implementation
  2. {Rule2}Policy.php — Second rule implementation
  3. {Name}Policy.php — Composite policy combining rules

Step 4: Generate Exception

Path: src/Domain/Shared/Exception/

  1. PolicyViolationException.php — Exception with policy context

Step 5: Generate Tests

  1. {Rule}PolicyTest.php — Individual rule tests
  2. {Name}PolicyTest.php — Composite policy tests
  3. PolicyResultTest.php — Result composition tests

File Placement

ComponentPath
Policy Interfacesrc/Domain/{BoundedContext}/Policy/
Policy Implementationsrc/Domain/{BoundedContext}/Policy/
PolicyResultsrc/Domain/Shared/Policy/
Exceptionsrc/Domain/Shared/Exception/
Unit Teststests/Unit/Domain/{BoundedContext}/Policy/

Naming Conventions

ComponentPatternExample
Interface{Name}PolicyInterfaceOrderCancellationPolicyInterface
Implementation{Rule}PolicyOrderOwnershipPolicy
Composite{Name}PolicyOrderCancellationPolicy
ResultPolicyResultPolicyResult
ExceptionPolicyViolationExceptionPolicyViolationException
Test{ClassName}TestOrderOwnershipPolicyTest

Quick Template Reference

PolicyInterface

interface {Name}PolicyInterface
{
    public function evaluate({SubjectType} $subject, {ResourceType} $resource): PolicyResult;
    public function getRuleName(): string;
}

PolicyResult

final readonly class PolicyResult
{
    public static function allow(): self;
    public static function deny(string $reason, array $metadata = []): self;
    public function isAllowed(): bool;
    public function isDenied(): bool;
    public function and(self $other): self; // Both must pass
    public function or(self $other): self;  // Either can pass
}

Policy Implementation

final readonly class {Rule}Policy implements {Name}PolicyInterface
{
    public function evaluate({Subject} $subject, {Resource} $resource): PolicyResult
    {
        if ({condition}) {
            return PolicyResult::allow();
        }
        return PolicyResult::deny('{reason}', ['context' => 'data']);
    }

    public function getRuleName(): string
    {
        return '{rule_name}';
    }
}

Composite Policy

final readonly class {Name}Policy implements {Name}PolicyInterface
{
    public function evaluate({Subject} $subject, {Resource} $resource): PolicyResult
    {
        return $this->rule1Policy->evaluate($subject, $resource)
            ->and($this->rule2Policy->evaluate($subject, $resource))
            ->and($this->rule3Policy->evaluate($subject, $resource));
    }
}

Usage Example

// In UseCase
$result = $this->cancellationPolicy->evaluate($user, $order);

if ($result->isDenied()) {
    throw new PolicyViolationException(
        $this->cancellationPolicy->getRuleName(),
        $result->getReason(),
        $result->metadata
    );
}

$order->cancel($reason);

Anti-patterns to Avoid

Anti-patternProblemSolution
Side EffectsPolicy modifies stateKeep evaluation pure
Boolean ReturnsNo denial reasonUse PolicyResult
Fat PoliciesToo many rulesSplit into composable policies
Hardcoded ValuesCan't configureInject thresholds
No Logging ContextCan't debugInclude metadata

References

For complete PHP templates and examples, see:

  • references/templates.md — Policy, composite, result templates
  • references/examples.md — Order cancellation policies and tests

评价

还没有评价。欢迎分享你的使用感受。

评论

无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。

还没有评论。来写第一条吧。

提交后会立即公开。请勿填写邮箱、电话等个人信息。URL 最多 2 个。

0 / 1000 字

此表单受 reCAPTCHA 保护,适用 Google 的隐私权政策和服务条款。

同一仓库的技能

007

免费

Security audit, hardening, threat modeling (STRIDE/PASTA), Red/Blue Team, OWASP checks, code review, incident response, and infrastructure security for any project.

中文简介正在准备中。当前显示原文说明。

aibot88/sec_skill_store52026年5月27日 更新

Guides the creation of agile user stories and Gherkin feature files. Use when the user wants to create a user story, write acceptance criteria, define Gherkin scenarios, or author BDD feature files. This should trigger for requests such as Create a user story; Write a user story; I need to write a user story. Part of cursor-rules-java project

中文简介正在准备中。当前显示原文说明。

aibot88/sec_skill_store52026年5月27日 更新

Facilitates conversational discovery to create Architectural Decision Records (ADRs) for non-functional requirements using the ISO/IEC 25010:2023 quality model. Use when the user wants to document quality attributes, NFR decisions, security/performance/scalability architecture, or design systems with measurable quality criteria. This should trigger for requests such as Create ADR for Non-functional requirements; Document Non-functional requirements; Capture Non-functional requirements; Generate Non-functional requirements in an ADR. Part of cursor-rules-java project

中文简介正在准备中。当前显示原文说明。

aibot88/sec_skill_store52026年5月27日 更新

Run a health check on an existing project: dependency audit, security scan, test runner detection, CI/CD evaluation, and missing configuration analysis. Maps the three execution gates (pre/in/post) from /10x-bootstrapper to an assessment framework for existing codebases. Reads optional context/foundation/stack-assessment.md from /10x-stack-assess to focus checks on identified gaps. Writes context/foundation/health-check.md with findings, prioritized fixes, and an agent-readiness verdict. Use when the user has an existing project and wants to verify its health before working with an agent. Trigger phrases: "health check", "check my project", "audit my project", "is my project healthy", "sprawdź projekt", "audyt projektu", "health-check", "project health". Use AFTER /10x-stack-assess (brownfield chain), BEFORE agent onboarding (m1-l4).

中文简介正在准备中。当前显示原文说明。

aibot88/sec_skill_store52026年5月27日 更新

10x-team

免费

You MUST use this when building projects end-to-end. Orchestrates all 12 team roles — automatically switches between CTO, architect, PM, engineers, SRE, security, DBA, QA, and EM based on the current phase of work. Starts with brainstorming before any implementation.

中文简介正在准备中。当前显示原文说明。

aibot88/sec_skill_store52026年5月27日 更新

Use when you need to add or configure Maven plugins in your pom.xml — including quality tools (enforcer, surefire, failsafe, jacoco, pitest, spotbugs, pmd), security scanning (OWASP), code formatting (Spotless), version management, container image build (Jib), build information tracking, and benchmarking (JMH) — through a consultative, modular step-by-step approach that only adds what you actually need. This should trigger for requests such as Add Maven plugins in pom.xml; Improve Maven plugins in pom.xml. Part of cursor-rules-java project

中文简介正在准备中。当前显示原文说明。

aibot88/sec_skill_store52026年5月27日 更新

查看 aibot88 的全部技能

报告此技能的问题