{"id":51926982,"url":"https://github.com/milirezai/milirulepilot","last_synced_at":"2026-07-31T06:00:53.537Z","repository":{"id":373040738,"uuid":"1310885916","full_name":"milirezai/milirulepilot","owner":"milirezai","description":"A flexible business decision engine for laravel with fluent Api.","archived":false,"fork":false,"pushed_at":"2026-07-25T11:55:41.000Z","size":80,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-30T05:12:55.841Z","etag":null,"topics":["decision-making","decision-support","decision-tree","decision-trees","iran","iranian","laravel","laravel-package","module","modules","oop","oop-principles","package","packagist","php","rule","rule-based","rule-engine","rules","rules-engine"],"latest_commit_sha":null,"homepage":"https://packagist.org/packages/milirezai/milirulepilot","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/milirezai.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-07-24T09:51:38.000Z","updated_at":"2026-07-25T11:55:46.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/milirezai/milirulepilot","commit_stats":null,"previous_names":["milirezai/milirulepilot"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/milirezai/milirulepilot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/milirezai%2Fmilirulepilot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/milirezai%2Fmilirulepilot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/milirezai%2Fmilirulepilot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/milirezai%2Fmilirulepilot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/milirezai","download_url":"https://codeload.github.com/milirezai/milirulepilot/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/milirezai%2Fmilirulepilot/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":36105293,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"online","status_checked_at":"2026-07-31T02:00:06.731Z","response_time":112,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["decision-making","decision-support","decision-tree","decision-trees","iran","iranian","laravel","laravel-package","module","modules","oop","oop-principles","package","packagist","php","rule","rule-based","rule-engine","rules","rules-engine"],"created_at":"2026-07-28T03:00:58.500Z","updated_at":"2026-07-31T06:00:53.469Z","avatar_url":"https://github.com/milirezai.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\u003cimg src=\"resources/images/milirulepilot.png?raw=true\"\u003e\u003c/p\u003e\n\n\n```php\n\nmilirulepilot/\n├─ src/\n│  ├─ Commands/\n│  │  ├─ DecisionBuilderCommand::class\n│  │  ├─ DecisionDeleteCommand::class\n│  │  ├─ DecisionListCommand::class\n│  ├─ Comparison/\n│  │  ├─ Operator /\n│  │  │ ├─ EqualOperator::class\n│  │  │ ├─ GreaterThanOperator::class\n│  │  │ ├─ LessThanOperator::class\n│  │  │ ├─ NotEqualOperator::class\n│  │  │ ├─ OperatorBase::class\n│  │  ├─ Comparison::class\n│  ├─ Condition/\n│  │  ├─ Builder/\n│  │  │ ├─ ConditionBuilder::class\n│  │  ├─ Dto\n│  │  │ ├─ ConditionDto::class\n│  │  ├─ ConditionBase::class\n│  ├─ Core/\n│  │  ├─ RulePIlotEngine::class\n│  ├─ Decision/\n│  │  ├─ DecisionBuilder/\n│  │  │ ├─ DecisionBuilder::class\n│  │  ├─ DecisionBase::class\n│  ├─ Facade/\n│  │  ├─ MiliRulePilot::class\n│  ├─ Result/\n│  │  ├─ Result::class\n│  ├─ RulePilot/\n│  │  ├─ MiliRulePilot::class\n│  ├─ Stub/\n│  │  ├─ decision::stub\n│  ├─ Support/\n│  │  ├─ Contracts/\n│  │  │ ├─ ConditionBuildContract::interface\n│  │  │ ├─ ConditionContentContract::interface\n│  │  │ ├─ DecisionBaseContract::interface\n│  │  ├─ Helper/\n│  │  ├─ Trait/\n│  ├─ MiliRulePilotServiceProvider::class\n├─ composer.json\n└─ README.md\n└─ RODMAP.md\n\n```\n\n\n\n\n\nMilirulepilot یک موتور مدیریت قوانین کسب‌وکار (Business Rule Engine) برای برنامه‌های Laravel است که با هدف ساده‌سازی، مدیریت و اجرای تصمیم‌های پیچیده در سیستم‌ها ساخته شده است.\n\n\n\u003ch3\u003e چرا Milirulepilot ساخته شد؟\u003c/h3\u003e\n\nدر بسیاری از پروژه‌ها، با رشد سیستم، قوانین کسب‌وکار نیز بیشتر و پیچیده‌تر می‌شوند.\n\nبرای مثال:\n\n- کاربران VIP تخفیف متفاوتی دریافت کنند.\n- کاربران بر اساس سطح دسترسی، امکانات خاصی داشته باشند.\n- قیمت محصولات بر اساس شرایط مختلف تغییر کند.\n- کمپین‌های بازاریابی فقط برای گروه خاصی از کاربران فعال شوند.\n- فرآیندهای سیستم بر اساس چندین شرط مختلف تصمیم‌گیری کنند.\n\nمعمولاً این منطق‌ها به صورت شرط‌های زیاد در کنترلرها، سرویس‌ها و بخش‌های مختلف برنامه نوشته می‌شوند.\n\nبا افزایش تعداد قوانین، مشکلاتی مانند موارد زیر ایجاد می‌شود:\n\n- سخت شدن نگهداری کد\n- پیچیده شدن تست‌ها\n- سخت شدن اضافه کردن قوانین جدید\n- وابستگی زیاد منطق کسب‌وکار به بخش‌های اصلی برنامه\n\nMilirulepilot برای حل این مشکل ایجاد شده است تا قوانین کسب‌وکار از منطق اصلی برنامه جدا شوند.\n\n## هدف Milirulepilot چیست؟\n\nهدف اصلی این پکیج ایجاد یک لایه تصمیم‌گیری مستقل در برنامه است؛ به شکلی که توسعه‌دهندگان بتوانند قوانین سیستم را به صورت ساختاریافته تعریف، مدیریت و اجرا کنند.\n\nبا استفاده از Milirulepilot می‌توان:\n\n- قوانین را از کدهای اصلی برنامه جدا کرد.\n- شرایط مختلف را به صورت قابل مدیریت تعریف کرد.\n- تصمیم‌گیری‌های پیچیده را ساده‌تر پیاده‌سازی کرد.\n- تغییر قوانین کسب‌وکار را بدون تغییر بخش‌های اصلی سیستم انجام داد.\n\n## Milirulepilot چه مشکلی را حل می‌کند؟\n\nبه جای اینکه منطق‌هایی مانند:\n\n- اگر کاربر VIP بود و مقدار خرید بیشتر از مقدار مشخصی بود، تخفیف بده.\n- اگر کاربر سطح خاصی داشت، دسترسی مشخصی فعال کن.\n- اگر شرایط سفارش برقرار بود، فرآیند خاصی اجرا شود.\n\nدر قسمت‌های مختلف برنامه پخش شوند، این قوانین در یک ساختار مشخص قرار می‌گیرند و موتور Milirulepilot مسئول بررسی و اجرای آن‌ها خواهد بود.\n\n## موارد استفاده\n\nMilirulepilot می‌تواند در بخش‌هایی مانند موارد زیر استفاده شود:\n\n- سیستم تخفیف و قیمت‌گذاری\n- سطح‌بندی کاربران\n- مدیریت دسترسی‌ها\n- سیستم‌های پیشنهاددهی\n- قوانین سفارش و پرداخت\n- فرآیندهای خودکار کسب‌وکار\n\n## فلسفه طراحی\n\nMilirulepilot با تمرکز بر توسعه‌پذیری و جداسازی مسئولیت‌ها طراحی شده است.\n\nهدف این است که اضافه کردن قوانین جدید یا تغییر قوانین موجود، نیازمند تغییر در هسته اصلی سیستم نباشد و هر بخش مسئولیت مشخص خود را داشته باشد.\n\n\n\n\n\u003ch3\u003eروش نصب:\u003c/h3\u003e\n\n```php\ncomposer require milirezai/milirulepilot\n```\n\n\n\nنسخه php مور نیاز:\n\nphp 8.2 به بعد\n\n\nنسخه laravel مور نیاز:\n\nlaravel 12 به بعد\n\n\n\n\u003ch3\u003eروش استفاده\u003c/h3\u003e\n\n\nبرای استفاده از کلاس ابتدا باید کلاس های decision اختصاصی برای خود تعریف کنید و شرط ها و تصمیم های بیزینسی خودتون رو اونجا بنویسید ساختار این کلاس ها رو میتونید ببینید\n\n\nاین کلاس ها داخل دایرکتوری به اسم  Decisions تویه دایرکتوری app ساخته می شوند\n\n\n```php\n\n\u003c?php\n\nnamespace App\\Decisions;\n\nuse MiliRulePilot\\Decision\\DecisionBase;\n\nclass VipDiscountDecision extends DecisionBase\n{\n\n    public function name(): string\n    {\n        return 'VipDiscount';\n    }\n\n    public function conditions(): array\n    {\n       return [\n           $this-\u003econdition-\u003efield('userLevel')-\u003eequal('vip')-\u003emake(),\n           $this-\u003econdition-\u003efield('cartPrice')-\u003eequal(200000)-\u003emake()\n       ];\n    }\n\n    public function result(): mixed\n    {\n        return 20;\n    }\n}\n\n\n```\n\n\nخوب این کلاس سه متد داره \n\nمتد name: اسم  اختصاصی برای هر کدام از کلاس ها اینجا باید بنویسید \n\nمتد conditions : اصلی ترین قسمت این کلاس این متد هست در اینجا قوانین و تصمیم های خودتون رو تعریف می کنید\n\nمتد result : خوب اینجا هم باید مقداری رو قرار بدید که هنگام درست بودن فوانین و شرایط باید به عنوان جروجی ارسال بشه\n\n\nبرای ساخت این کلاس ها باید از دستور زیر استفاده کنید\n\n\n```php\nphp artisan decision:make VipDiscountDecision\n```\n\n\nتعریف قوانین داخل کلاس های decision  : \n\nقواین رو باید داخل متد conditions به صورت یک ارایه نوشت \n\n\n\n```php\npublic function conditions(): array\n    {\n       return [\n           $this-\u003econdition-\u003efield('userLevel')-\u003eequal('vip')-\u003emake(),\n           $this-\u003econdition-\u003efield('cartPrice')-\u003eequal(200000)-\u003emake()\n       ];\n    }\n```\n\nبرای تعریف یک قانون می تونید از متد های زیر استفاده کنید  :\n\n\n```php\nfield(string $field)\nequal(mixed $value)\nnotEqual(mixed $value)\ngreaterThan(mixed $value)\nlessThan(mixed $value)\nstopOrFail()\n```\n\n\nاین متد برای اسم rule هست\n\n\n```php\n$this-\u003econdition-\u003efield('userLevel')\n```\n\n\noperator ها :\n\n\n```php\nequal(mixed $value) // operator ==\nnotEqual(mixed $value) // operator !=\ngreaterThan(mixed $value) // operator \u003e\nlessThan(mixed $value) // operator \u003c\n```\n\n \nاگر بخوایید که یک کاندیشن وقتی که شکتست خورد و مقدارش فالس شد سیستم کاندیشن های بعدی رو برسی نکنه می تونید برای کاندیشن ها از متد stopOrFail استفاده کنید \n\n\nکلا فلسفه  پکیج به این صورت هست که شما تویه یک سری کلاس تصمیم ها و کانیدشن های خودتون رو تعریف می کنید و در جای دیگه چه کنترلر چه داخل سرویس های دیگه میتونید این با دتیا ها و کاندیشن های متغییر مقایسه کنید \n\nبرای استفاده از  پکیج می تونید از کللاس اصلی یا فساد آن استفاده کنید \n\n\n\n```php\nuse MiliRulePilot\\RulePilot\\MiliRulePilot;\nuse MiliRulePilot\\Facade\\MiliRulePilot;\n\n\npublic function index(MiliRulePilot $miliRulePilot){\n\n$milirulepilot-\u003eevaloate(DecisionBaseContract $decision,array $conditions)\n\n\nMiliRulePilot::evaloate(DecisionBaseContract $decision,array $conditions)\n\n}\n\n```\n\nمتد evaloate  : خوب این متد دو مقدار می گیره\n\nاولین مقدار در یه نمونه از کلاس decision است \n\n\nدومین مقدار یک ارایه از کاندیشن هایی است که باید با کاندیشن های تعریف شده داخل decision کلاس مقایسه شوند\n\n\nنمونه\n\n\n\n```php\nuse MiliRulePilot\\RulePilot\\MiliRulePilot;\nuse App\\Decisions\\VipDiscountDecision;\n\n\npublic function index(MiliRulePilot $miliRulePilot,VipDiscuntDecision $vipDiscountDecision){\n\n $ruleResult = $milirulepilot-\u003eevaloate($vipDiscountDecision,[\n                 [\n                     'field' =\u003e 'userLevel',\n                     'value' =\u003e 'vip'\n                 ],\n                 [\n                     'field' =\u003e 'cartPrice',\n                     'value' =\u003e $request-\u003einput('price')\n                 ]\n             ]);\n\n}\n\n```\n\n\nمشاهده result   :\n\n پکیج خروجی رو به یک دیتا ابجکت از نوع DecisionResult  تبدیل می کنه که متد های کاربری و مفیدی داره\n\n\nمتد ها : \n\n```php\n$ruleResult-\u003edecisionName() // return decision name\n$ruleResult-\u003ematched() // return result boolean if conditions and decision condition matched\n$ruleResult-\u003econditionsProcessResult() // return process result for all decision conditions\n$ruleResult-\u003econditionsProcessResult('userLevel') // return process result for one decision conditions\n$ruleResult-\u003edecisionResult() // return value method result in decision class\n$ruleResult-\u003eprocess() // return info process for decision\n```\n\n\n\nنمونه \n\n\n\n```php\npublic function index(MiliRulePilot $miliRulePilot,VipDiscuntDecision $vipDiscountDecision){\n\n $ruleResult = $milirulepilot-\u003eevaloate($vipDiscountDecision,[\n                 [\n                     'field' =\u003e 'userLevel',\n                     'value' =\u003e 'vip'\n                 ],\n                 [\n                     'field' =\u003e 'cartPrice',\n                     'value' =\u003e $request-\u003einput('price')\n                 ]\n             ]);\n\n$ruleResult-\u003ematched();\n\n}\n\n```\n\nدستورات artisan  :\n\n\n```php\n```\n\n\n\n```php\nphp artisan decision:make VipDiscountDecision // create a decision class\nphp artisan decision:delete VipDiscountDecision // remove a decision class\nphp artisan decision:list  // list all decision class\n\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmilirezai%2Fmilirulepilot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmilirezai%2Fmilirulepilot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmilirezai%2Fmilirulepilot/lists"}