Command Line Tools
wheels generate code
wheels generate code
Section titled “wheels generate code”Generate code snippets and boilerplate code for common Wheels patterns.
Synopsis
Section titled “Synopsis”wheels generate code [pattern] [options]wheels g code [pattern] [options]Description
Section titled “Description”The wheels generate code command creates code snippets for common Wheels patterns and best practices. It provides ready-to-use code blocks that can be customized for your specific needs, helping you implement standard patterns quickly and consistently.
Arguments
Section titled “Arguments”| Argument | Description | Default |
|---|---|---|
pattern | Code pattern to generate | Shows available patterns |
Options
Section titled “Options”| Option | Description | Valid Values | Default |
|---|---|---|---|
--list | List all available code snippets | true/false | false |
--category | Filter by category | authentication, model, controller, view, database | All categories |
--output | Output format | console, file | console |
--path | Output file path (required when output=file) | Any valid file path | |
--customize | Show customization options | true/false | false |
--create | Create custom code template | true/false | false |
--force | Overwrite existing files | true/false | false |
Available Code Snippets
Section titled “Available Code Snippets”List All Code Snippets
Section titled “List All Code Snippets”wheels generate code --listOutput:
================================================== Available Code Snippets==================================================
Authentication: - login-form - Login form with remember me - auth-filter - Authentication filter - password-reset - Password reset flow - user-registration - User registration with validation
Model: - soft-delete - Soft delete implementation - audit-trail - Audit trail with timestamps - sluggable - URL-friendly slugs - versionable - Version tracking - searchable - Full-text search
Controller: - crud-actions - Complete CRUD actions - api-controller - JSON API controller - nested-resource - Nested resource controller - admin-controller - Admin area controller
View: - form-with-errors - Form with error handling - pagination-links - Pagination navigation - search-form - Search form with filters - ajax-form - AJAX form submission
Database: - migration-indexes - Common index patterns - seed-data - Database seeding - constraints - Foreign key constraints
Next steps: 1. Generate a code snippet: wheels g code <pattern-name>Authentication Snippets
Section titled “Authentication Snippets”Login Form
Section titled “Login Form”wheels generate code login-formGenerates:
#startFormTag(action="create")# #textField(objectName="user", property="email", label="Email")# #passwordField(objectName="user", property="password", label="Password")# #checkBox(objectName="user", property="rememberMe", label="Remember me")# #submitTag(value="Login")##endFormTag()#Note: This is a basic snippet. You can customize it by saving to a file and editing:
wheels generate code login-form --output=file --path=app/views/sessions/new.cfmAuthentication Filter
Section titled “Authentication Filter”wheels generate code auth-filterGenerates:
function init() { filters(through="authenticate", except="new,create");}
private function authenticate() { if (!StructKeyExists(session, "userId")) { redirectTo(route="login"); }}Password Reset
Section titled “Password Reset”wheels generate code password-resetGenerates:
function requestReset() { user = model("User").findOne(where="email='#params.email#'"); if (IsObject(user)) { token = Hash(CreateUUID()); user.update(resetToken=token, resetExpiresAt=DateAdd("h", 1, Now())); // Send email with token }}User Registration
Section titled “User Registration”wheels generate code user-registrationGenerates:
#startFormTag(action="create")# #textField(objectName="user", property="firstName", label="First Name")# #textField(objectName="user", property="email", label="Email")# #passwordField(objectName="user", property="password", label="Password")# #submitTag(value="Register")##endFormTag()#Model Patterns
Section titled “Model Patterns”Soft Delete
Section titled “Soft Delete”wheels generate code soft-deleteGenerates:
function init() { property(name="deletedAt", sql="deleted_at"); beforeDelete("softDelete");}
private function softDelete() { this.deletedAt = Now(); this.save(validate=false, callbacks=false); return false;}Audit Trail
Section titled “Audit Trail”wheels generate code audit-trailGenerates:
function init() { property(name="createdBy", sql="created_by"); property(name="updatedBy", sql="updated_by"); beforeSave("setAuditFields");}
private function setAuditFields() { if (StructKeyExists(session, "userId")) { if (this.isNew()) this.createdBy = session.userId; this.updatedBy = session.userId; }}Sluggable
Section titled “Sluggable”wheels generate code sluggableGenerates:
function init() { property(name="slug"); beforeSave("generateSlug");}
private function generateSlug() { if (!len(this.slug) && len(this.title)) { this.slug = lCase(reReplace(this.title, "[^a-zA-Z0-9]", "-", "all")); }}Versionable
Section titled “Versionable”wheels generate code versionableGenerates:
function init() { property(name="version", default=1); beforeUpdate("incrementVersion");}
private function incrementVersion() { this.version = this.version + 1;}Searchable
Section titled “Searchable”wheels generate code searchableGenerates:
function search(required string query) { return findAll(where="title LIKE '%#arguments.query#%' OR content LIKE '%#arguments.query#%'");}Controller Patterns
Section titled “Controller Patterns”CRUD Actions
Section titled “CRUD Actions”wheels generate code crud-actionsGenerates:
function index() { users = model("User").findAll();}
function show() { user = model("User").findByKey(params.key);}
function create() { user = model("User").create(params.user); if (user.valid()) { redirectTo(route="user", key=user.id); } else { renderView(action="new"); }}API Controller
Section titled “API Controller”wheels generate code api-controllerGenerates:
function init() { provides("json");}
function index() { users = model("User").findAll(); renderWith(data={users=users});}Nested Resource
Section titled “Nested Resource”wheels generate code nested-resourceGenerates:
function init() { filters(through="findParent");}
private function findParent() { user = model("User").findByKey(params.userId);}Admin Controller
Section titled “Admin Controller”wheels generate code admin-controllerGenerates:
function init() { filters(through="requireAdmin");}
private function requireAdmin() { if (!currentUser().isAdmin()) { redirectTo(route="home"); }}View Patterns
Section titled “View Patterns”Form with Errors
Section titled “Form with Errors”wheels generate code form-with-errorsGenerates:
#errorMessagesFor("user")#
#startFormTag(action="create")# #textField(objectName="user", property="firstName", label="First Name")# <cfif user.errors("firstName").len()> <span class="error">#user.errors("firstName").get()#</span> </cfif> #submitTag(value="Submit")##endFormTag()#Pagination Links
Section titled “Pagination Links”wheels generate code pagination-linksGenerates:
<cfif users.totalPages gt 1> <nav> <cfif users.currentPage gt 1> #linkTo(text="Previous", params={page: users.currentPage - 1})# </cfif> <cfloop from="1" to="#users.totalPages#" index="pageNum"> #linkTo(text=pageNum, params={page: pageNum})# </cfloop> <cfif users.currentPage lt users.totalPages> #linkTo(text="Next", params={page: users.currentPage + 1})# </cfif> </nav></cfif>Search Form
Section titled “Search Form”wheels generate code search-formGenerates:
#startFormTag(method="get")# #textField(name="q", value=params.q, placeholder="Search...")# #submitTag(value="Search")##endFormTag()#AJAX Form
Section titled “AJAX Form”wheels generate code ajax-formGenerates:
#startFormTag(action="create", id="userForm")# #textField(objectName="user", property="name")# #submitTag(value="Submit")##endFormTag()#
<script>$("#userForm").submit(function(e) { e.preventDefault(); $.post($(this).attr("action"), $(this).serialize());});</script>Database Snippets
Section titled “Database Snippets”Migration Indexes
Section titled “Migration Indexes”wheels generate code migration-indexesGenerates:
t.index("email");t.index(["last_name", "first_name"]);t.index("email", unique=true);t.index("user_id");Seed Data
Section titled “Seed Data”wheels generate code seed-dataGenerates:
execute("INSERT INTO users (name, email) VALUES ('Admin', 'admin@example.com')");Constraints
Section titled “Constraints”wheels generate code constraintsGenerates:
t.references("user_id", "users");t.references("category_id", "categories");Custom Code Snippets
Section titled “Custom Code Snippets”Create Custom Code Snippet
Section titled “Create Custom Code Snippet”wheels generate code --create my-custom-snippetThis creates a directory structure in app/snippets/my-custom-snippet/:
my-custom-snippet/└── template.txtYou can then edit the template file and use your custom code snippet:
wheels generate code my-custom-snippetOutput Options
Section titled “Output Options”Output to Console (Default)
Section titled “Output to Console (Default)”wheels generate code login-form# or explicitly:wheels generate code login-form --output=consoleSave to File
Section titled “Save to File”wheels generate code api-controller --output=file --path=app/controllers/Api.cfcUse --force to overwrite existing files:
wheels generate code api-controller --output=file --path=app/controllers/Api.cfc --forceCustomization Options
Section titled “Customization Options”wheels generate code [pattern] --customizeShows available customization options for code snippets.
Filter by Category
Section titled “Filter by Category”List code snippets from a specific category:
wheels generate code --list --category=modelwheels generate code --list --category=authenticationwheels generate code --list --category=controllerwheels generate code --list --category=viewwheels generate code --list --category=databaseBest Practices
Section titled “Best Practices”- Review generated code: Customize for your needs
- Understand the patterns: Don’t blindly copy
- Keep snippets updated: Maintain with framework updates
- Share useful patterns: Contribute back to community
- Document customizations: Note changes made
- Test generated code: Ensure it works in your context
- Use consistent patterns: Across your application
See Also
Section titled “See Also”- wheels generate controller - Generate controllers
- wheels generate model - Generate models
- wheels scaffold - Generate complete resources