victorjonsson/markdowndocs
Generate single-page Markdown API docs from PHP DocBlocks. Install via Composer and run phpdoc-md to scan your source, include public/protected methods, respect @ignore, and infer missing types using reflection.
Installation:
composer require --dev victorjonsson/markdowndocs
This adds the package to require-dev and places the phpdoc-md executable in vendor/bin/.
First Use Case:
Document a single class (e.g., App\Models\User) or an entire directory (e.g., app/):
./vendor/bin/phpdoc-md generate App\Models\User > docs/User.md
Or for all classes in app/:
./vendor/bin/phpdoc-md generate app/ > docs/api.md
Verify Output:
Open docs/api.md to confirm the generated Markdown includes:
@class or file-level DocBlocks).@ignore).CI/CD Integration:
Add a script to composer.json to auto-generate docs on post-update-cmd:
"scripts": {
"post-update-cmd": [
"@phpdoc-md generate app/ > docs/api.md"
]
}
Trigger via:
composer update
Partial Documentation: Document only critical classes (e.g., API controllers):
./vendor/bin/phpdoc-md generate App\Http\Controllers\\*,App\Services\\* > docs/public-api.md
Bootstrapping: For non-Composer projects or custom autoloading:
./vendor/bin/phpdoc-md generate --bootstrap=bootstrap/app.php src/ > docs/api.md
Namespace Handling:
Use Laravel’s app/ namespace directly (e.g., App\Models\User).
Avoid relative paths (e.g., ./Models/User)—the tool relies on Composer autoloading.
DocBlock Standardization:
Align with Laravel’s conventions (e.g., @param string $name instead of @param $name string).
Example:
/**
* Fetches a user by ID.
* @param int $id
* @return \App\Models\User|null
* @throws \Exception If user not found.
*/
public function findUser(int $id) { ... }
Output Customization: Pipe output to a Laravel Blade template for dynamic rendering:
./vendor/bin/phpdoc-md generate app/ | ./vendor/bin/blade > docs/api.blade.md
File Naming:
src/UserModel.php for class App\Models\User.User.php or use --bootstrap to override autoloading.Ignored Directories:
tests/ or vendor/ despite --ignore.--ignore:
./vendor/bin/phpdoc-md generate --ignore=/full/path/to/tests app/ > docs/api.md
Return Type Guessing:
@return causes ambiguous type hints (e.g., array vs. stdClass).Protected Methods:
@internal to exclude protected methods entirely.Verbose Mode:
Add -v for debugging:
./vendor/bin/phpdoc-md generate -v app/
Outputs skipped classes/files and reflection errors.
Reflection Errors:
Class not found for namespaced classes.composer.json under autoload:
"autoload": {
"psr-4": { "App\\": "app/" }
}
Custom Templates:
Override the Markdown template by modifying the package’s src/Template.php (fork the repo or patch locally).
Pre/Post-Processing:
Use Laravel’s Artisan::command() to wrap phpdoc-md:
Artisan::command('docs:generate', function () {
$output = shell_exec('vendor/bin/phpdoc-md generate app/');
file_put_contents('docs/api.md', $output);
});
Git Hooks:
Auto-generate docs on pre-commit (via husky or Laravel Git hooks):
./vendor/bin/phpdoc-md generate --ignore=tests app/ > docs/api.md
git add docs/api.md
\n (Unix) or \r\n (Windows). Normalize with:
unix2dos docs/api.md # or dos2unix
void return types) manually.How can I help you explore Laravel packages today?