Generate Mermaid-js class diagram from php code.
This tool focuses on the relationships between classes and omits the details of class internals at this stage.
Via Composer
composer require --dev tasuku43/mermaid-class-diagram
vendor/bin/mermaid-class-diagram generate --path <path> [options]
--path <string>
: Required. Directory (recursively scanned) or single PHP file.--exclude-relationships <csv>
: Hide edge types; case-insensitive; aliases supported.dependency|dependencies|dep|deps
composition|compositions|comp
inheritance|inheritances|extends
realization|realizations|implements
--trait-mode <mode>
: Trait rendering mode. Default:flatten
.with-traits
(aliases:with_traits
,with
): show trait nodes anduse
edges; suppress class-level comp/dep duplicates provided by traits.flatten
(aliases:flat
): hide trait nodes anduse
edges; reassign trait-origin comp/dep to using classes; supports trait→trait→class chains; deduplicates.
$ vendor/bin/mermaid-class-diagram generate --path tests/data/Project
classDiagram
class AbstractController {
<<abstract>>
}
class AuditLogger {
}
class AuditTarget {
}
class User {
}
class UserController {
}
class UserRepository {
}
class UserRepositoryInterface {
<<interface>>
}
class UserService {
}
class UserStatus {
<<enum>>
}
User *-- UserStatus: composition
AbstractController <|-- UserController: inheritance
UserController *-- UserService: composition
UserRepository ..> User: dependency
UserRepositoryInterface <|.. UserRepository: realization
UserRepositoryInterface ..> User: dependency
UserService *-- AuditLogger: composition
UserService ..> AuditTarget: dependency
UserService ..> InvalidArgumentException: dependency
UserService ..> User: dependency
UserService *-- UserRepositoryInterface: composition
classDiagram
class SomeAbstractClass {
<<abstract>>
}
class SomeClassA {
}
class SomeClassB {
}
class SomeClassC {
}
class SomeClassD {
}
class SomeClassE {
}
class SomeInterface {
<<interface>>
}
SomeInterface <|.. SomeAbstractClass: realization
SomeAbstractClass <|-- SomeClassA: inheritance
SomeClassA *-- SomeClassB: composition
SomeClassA *-- SomeClassC: composition
SomeClassA ..> SomeClassD: dependency
SomeClassE *-- SomeClassA: composition
SomeClassE ..> SomeClassB: dependency
SomeClassE ..> SomeClassC: dependency
$ vendor/bin/mermaid-class-diagram generate --path tests/data/Project/Controller/UserController.php
classDiagram
class UserController {
}
AbstractController <|-- UserController: inheritance
UserController *-- UserService: composition
classDiagram
class SomeClassA {
}
SomeAbstractClass <|-- SomeClassA: inheritance
SomeClassA *-- SomeClassB: composition
SomeClassA *-- SomeClassC: composition
SomeClassD <.. SomeClassA: dependency
You can hide specific relationship types via CSV with --exclude-relationships
.
- Allowed values (case-insensitive, aliases supported):
dependency
|dependencies
|dep
|deps
composition
|compositions
|comp
inheritance
|inheritances
|extends
realization
|realizations
|implements
Examples
# Hide dependencies and compositions
$ vendor/bin/mermaid-class-diagram generate --path src --exclude-relationships dependency,composition
# Hide only dependencies
$ vendor/bin/mermaid-class-diagram generate --path src --exclude-relationships dependency
There are two render modes for traits (the CLI uses Flatten by default):
- Flatten (default)
- Hides trait nodes and
use
edges. - Reassigns trait-origin composition/dependency edges to the using classes.
- Supports transitive trait chains (TraitA uses TraitB); edges are reassigned to the final class users.
- Hides trait nodes and
- WithTraits
- Shows trait nodes and
use
edges. - Keeps trait-origin composition/dependency edges on the trait.
- Suppresses duplicate class-level composition/dependency when already provided by a used trait.
- Shows trait nodes and
Example
trait HasUserDeps {
private UserRepository $repo;
public function findById(UserId $id): ?User {}
}
class UserController {
use HasUserDeps;
}
Output examples (order simplified):
Flatten (default)
classDiagram
class UserController {
}
class UserRepository {
}
class UserId {
}
UserController *-- UserRepository: composition
UserController ..> UserId: dependency
WithTraits
classDiagram
class UserController {
}
class HasUserDeps {
<<trait>>
}
class UserRepository {
}
class UserId {
}
UserController --> HasUserDeps: use
HasUserDeps *-- UserRepository: composition
HasUserDeps ..> UserId: dependency
The MIT License (MIT). Please see LICENSE for more information.