Skip to content

Commit a6f9b22

Browse files
authored
[symfony] Add NoBundleResourceConfigRule (#203)
1 parent ea28d97 commit a6f9b22

File tree

4 files changed

+65
-0
lines changed

4 files changed

+65
-0
lines changed

README.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1526,6 +1526,17 @@ return static function (ContainerConfigurator $configurator): void {
15261526

15271527
<br>
15281528

1529+
### NoBundleResourceConfigRule
1530+
1531+
Avoid using configs in `*Bundle/Resources` directory. Move them to `/config` directory instead
1532+
1533+
```yaml
1534+
rules:
1535+
- Symplify\PHPStanRules\Rules\Symfony\ConfigClosure\NoBundleResourceConfigRule
1536+
```
1537+
1538+
<br>
1539+
15291540
### NoRoutingPrefixRule
15301541

15311542
Avoid global route prefixing. Use single place for paths in @Route/#[Route] and improve static analysis instead.

config/symfony-config-rules.neon

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
rules:
22
- Symplify\PHPStanRules\Rules\Symfony\ConfigClosure\ServicesExcludedDirectoryMustExistRule
3+
- Symplify\PHPStanRules\Rules\Symfony\ConfigClosure\NoBundleResourceConfigRule

src/Enum/SymfonyRuleIdentifier.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,6 @@ final class SymfonyRuleIdentifier
4343
public const REQUIRE_ROUTE_NAME_TO_GENERATE_CONTROLLER_ROUTE = 'symfony.requireRouteNameToGenerateControllerRoute';
4444

4545
public const SERVICES_EXCLUDED_DIRECTORY_MUST_EXIST = 'symfony.servicesExcludedDirectoryMustExist';
46+
47+
public const NO_BUNDLE_RESOURCE_CONFIG = 'symfony.noBundleResourceConfig';
4648
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Symplify\PHPStanRules\Rules\Symfony\ConfigClosure;
6+
7+
use PhpParser\Node;
8+
use PhpParser\Node\Expr\Closure;
9+
use PHPStan\Analyser\Scope;
10+
use PHPStan\Rules\IdentifierRuleError;
11+
use PHPStan\Rules\Rule;
12+
use PHPStan\Rules\RuleErrorBuilder;
13+
use Symplify\PHPStanRules\Enum\SymfonyRuleIdentifier;
14+
use Symplify\PHPStanRules\Symfony\NodeAnalyzer\SymfonyClosureDetector;
15+
16+
/**
17+
* @implements Rule<Closure>
18+
*/
19+
final class NoBundleResourceConfigRule implements Rule
20+
{
21+
/**
22+
* @var string
23+
*/
24+
private const ERROR_MESSAGE = 'Avoid using configs in Bundle/Resources directory. Move them to "/config" directory instead';
25+
26+
public function getNodeType(): string
27+
{
28+
return Closure::class;
29+
}
30+
31+
/**
32+
* @param Closure $node
33+
* @return IdentifierRuleError[]
34+
*/
35+
public function processNode(Node $node, Scope $scope): array
36+
{
37+
if (! SymfonyClosureDetector::detect($node)) {
38+
return [];
39+
}
40+
41+
if (! str_contains($scope->getFile(), 'Resources/config')) {
42+
return [];
43+
}
44+
45+
$identifierRuleError = RuleErrorBuilder::message(self::ERROR_MESSAGE)
46+
->identifier(SymfonyRuleIdentifier::NO_BUNDLE_RESOURCE_CONFIG)
47+
->build();
48+
49+
return [$identifierRuleError];
50+
}
51+
}

0 commit comments

Comments
 (0)