First 50 of 200 questions. Each one lists the choices, the correct answer, and an explanation. The checker at the top of this page saves progress in this browser when it is available.
Continue in the practice tool above to load more questions, 50 at a time.
Question 1Adobe Commerce Architecture and Solution Design
In Adobe Commerce, which file is the primary declaration point for a module's identity, version, and dependency list?
- registration.php
- etc/di.xml
- etc/module.xml Correct answer.
- composer.json
Explanation
etc/module.xml declares the module name, its setup version, and the sequence of modules it depends on, which controls load order and schema ordering. composer.json governs package installation but does not define the module's setup version or sequence.
Question 2Adobe Commerce Architecture and Solution Design
A solution requires a new storefront theme that changes layout XML and static assets without altering Magento_Theme module files. Where should the customization live?
- lib/web/css
- app/code/<Vendor>/<Module>/view/frontend
- app/design/frontend/<Vendor>/<theme> Correct answer.
- pub/static/deployed
Explanation
Theme-level customizations belong in app/design/frontend under a vendor/theme directory, which can inherit from a parent theme and override layout and assets without touching module code. Module view directories are for module-owned assets, and pub/static holds generated output.
Question 3Adobe Commerce Architecture and Solution Design
Which Adobe Commerce architectural layer is responsible for serving REST and GraphQL requests to external clients?
- The cron scheduler defined in crontab.xml
- The presentation layer rendered by PHTML templates
- The persistence layer implemented by resource models
- The service contracts layer exposed through web APIs Correct answer.
Explanation
Service contracts define stable interfaces that are exposed through both REST and GraphQL web APIs, decoupling external clients from internal implementation. Presentation and persistence layers are internal concerns not directly exposed to API clients.
Question 4Adobe Commerce Architecture and Solution Design
What is the primary purpose of a dependency injection preference in di.xml?
- To map an interface to a concrete implementation for the object manager Correct answer.
- To register a new route in the frontend router
- To declare a database foreign key between two entity tables
- To define a cron job schedule for a class
Explanation
A preference tells the object manager which concrete class should satisfy a given interface or virtual type request. It is a configuration-level substitution and does not involve database schema or routing.
Question 5Adobe Commerce Architecture and Solution Design
In the Adobe Commerce layered architecture, which layer contains blocks, controllers, and layout XML?
- The presentation layer Correct answer.
- The persistence layer
- The integration layer
- The domain layer
Explanation
Controllers, blocks, and layout XML orchestrate the response and belong to the presentation layer, which sits above the domain and persistence layers. The domain layer holds business logic and the persistence layer handles data access.
Question 6Adobe Commerce Architecture and Solution Design
Which mechanism allows a module to modify the output of another module's block without editing that module's template?
- A plugin on the block's method or a layout XML block argument override Correct answer.
- A new database index on the block's table
- A composer patch applied at deploy time
- A cron job that rewrites the template file
Explanation
Plugins intercept public method calls, and layout XML can set or override block arguments, both letting a module change behavior or output without editing the original module. Composer patches alter files directly and are not a runtime extension mechanism.
Question 7Adobe Commerce Architecture and Solution Design
What does a virtual type in di.xml allow an architect to do?
- Register a new admin menu item
- Declare a new database table for the entity
- Create a configured instance of an existing class without a new PHP class Correct answer.
- Define a new GraphQL schema type
Explanation
A virtual type instantiates an existing class with pre-set constructor arguments, avoiding boilerplate subclasses. It does not create database tables, menus, or schema types.
Question 8Adobe Commerce Architecture and Solution Design
Which file declares a module's database table structure in modern Adobe Commerce?
- etc/webapi.xml
- etc/config.xml
- etc/db_schema.xml Correct answer.
- etc/events.xml
Explanation
db_schema.xml declaratively defines tables, columns, indexes, and constraints, and the system generates the schema from it. config.xml holds configuration defaults and the others handle events and web API routes.
Question 9Adobe Commerce Architecture and Solution Design
A merchant needs B2B company accounts with requisition lists and shared catalogs. Which Adobe Commerce offering provides these natively?
- Adobe Commerce with the B2B module set enabled Correct answer.
- Magento Open Source with a custom module only
- Adobe Commerce Cloud Starter with no additional modules
- Adobe Commerce Open Source without extensions
Explanation
B2B features such as company accounts, requisition lists, and shared catalogs ship as a module set available in Adobe Commerce. Open Source lacks these native capabilities and would require custom development.
Question 10Adobe Commerce Architecture and Solution Design
An architect must ensure a custom module's setup runs after Magento_Catalog schema is created. Which declaration achieves this?
- Declare the dependency in webapi.xml
- List Magento_Catalog in the sequence node of the module's module.xml Correct answer.
- Create a preference for Magento_Catalog in di.xml
- Add Magento_Catalog to the module's composer.json require block only
Explanation
The sequence node in module.xml controls module load order and therefore the order in which schema and data setup run. Composer requirements govern package installation but not runtime setup sequencing.
Question 11Adobe Commerce Architecture and Solution Design
A team wants to expose a new service to both REST and GraphQL clients while keeping a stable interface. What should the architect define first?
- A cron observer in the module's Cron directory
- A controller in the module's Controller directory
- A block class in the module's Block directory
- A service contract interface in the module's Api directory with a webapi.xml route Correct answer.
Explanation
Service contracts in the Api directory define stable interfaces that can be exposed through webapi.xml for REST and through GraphQL resolvers. Controllers and blocks are presentation concerns, not stable API surfaces.
Question 12Adobe Commerce Architecture and Solution Design
An architect needs to intercept a public method on a class and change its return value only when a condition is met, otherwise preserving the original result. Which plugin type fits?
- An around plugin that conditionally returns early or calls the proceed callback Correct answer.
- An after plugin that ignores the original result
- A preference that replaces the class entirely
- A before plugin that returns a modified argument
Explanation
An around plugin receives a proceed callback and can short-circuit by returning a value or delegate by invoking proceed, which suits conditional result modification. Before plugins cannot change the return value and after plugins receive the result but cannot prevent execution.
Question 13Adobe Commerce Architecture and Solution Design
A catalog with millions of SKUs shows slow category pages. Which architectural approach best addresses read scalability?
- Increase the PHP memory limit on each web node
- Convert all category pages to AJAX-only rendering
- Disable the full page cache to avoid stale content
- Move read traffic to replica connections and cache rendered blocks with appropriate invalidation Correct answer.
Explanation
Read replicas distribute query load and block caching reduces repeated rendering work, together improving read scalability. Raising memory limits or disabling caching does not scale reads and can worsen performance.
Question 14Adobe Commerce Architecture and Solution Design
When designing a multi-store setup with different currencies and languages but a shared catalog, which scope should hold currency and locale settings?
- Store view scope Correct answer.
- Module scope
- Global scope
- Website scope
Explanation
Currency display and locale are store-view scoped because they vary per language and presentation, while the shared catalog remains at global or website scope. Website scope suits pricing and tax structures shared across store views.
Question 15Adobe Commerce Architecture and Solution Design
An architect must add a custom attribute to the quote and order entities that persists through checkout. Which approach is most appropriate?
- Add a column only to the quote table and read it at order placement
- Declare the attribute in extension attributes and persist it via a plugin on the quote-to-order conversion Correct answer.
- Store the value in a customer session variable
- Encode the value in the order increment ID
Explanation
Extension attributes extend service contract data for entities like quote and order, and a plugin on conversion copies the value from quote to order. Storing only in the quote table or session loses the value at order creation.
Question 16Adobe Commerce Architecture and Solution Design
A project requires that a third-party module's behavior be changed without modifying its files and without a global class replacement. Which combination is preferred?
- Plugins for behavior changes and layout XML or preferences scoped narrowly for structure Correct answer.
- A fork of the vendor module committed into app/code
- Composer patches that rewrite the vendor files
- Direct edits to the vendor module's PHP files
Explanation
Plugins and narrowly scoped layout or DI configuration extend vendor behavior while keeping the vendor package upgradable. Editing or forking vendor code creates maintenance debt and complicates upgrades.
Question 17Adobe Commerce Architecture and Solution Design
Which caching layer should an architect configure to store page cache and session data across multiple web nodes?
- APCu on each web node
- A shared Redis instance for backend and page cache Correct answer.
- Local file-based cache on each web node
- The default database cache backend
Explanation
A shared Redis backend lets multiple web nodes share page cache and session data, avoiding per-node divergence. Local file, database, and APCu caches are node-local or slow and do not coordinate across nodes.
Question 18Adobe Commerce Architecture and Solution Design
An architect is designing a headless storefront that consumes catalog and cart data. Which Adobe Commerce capability is central to that design?
- The admin grid UI components
- The cron-based indexers
- The GraphQL API with customer and cart mutations Correct answer.
- The PHTML template layer
Explanation
A headless storefront relies on the GraphQL API for queries and mutations covering catalog, cart, and customer flows. PHTML templates and admin UI are server-rendered presentation concerns irrelevant to a decoupled client.
Question 19Adobe Commerce Architecture and Solution Design
A merchant wants different product prices per website while sharing one product catalog. Which scope configuration supports this?
- Disable the price indexer per website
- Set the price attribute to global scope
- Set the price attribute to store view scope only
- Set the price attribute to website scope Correct answer.
Explanation
Website-scoped price attributes allow different prices per website while the catalog remains shared. Global scope forces one price everywhere, and store-view scope is not the standard scope for base price.
Question 20Adobe Commerce Architecture and Solution Design
An architect needs to guarantee that an inventory decrement and an order record creation succeed or fail together within one database. Which mechanism applies?
- Use a cron job to reconcile the two later
- Dispatch an asynchronous message for the decrement
- Wrap both operations in a single database transaction Correct answer.
- Log the decrement and retry on failure
Explanation
A database transaction provides atomicity so both writes commit or roll back together. Asynchronous messaging and cron reconciliation introduce eventual consistency windows rather than atomic guarantees.
Question 21Adobe Commerce Architecture and Solution Design
A module must react to an order placement event but the handler performs a slow third-party call. Which design avoids blocking checkout?
- Call the third-party API from the order success controller
- Register a synchronous observer that performs the call inline
- Run the call in a cron job scheduled every minute
- Publish a message to a queue and process it with a consumer Correct answer.
Explanation
Publishing to a message queue and processing asynchronously with a consumer removes the slow call from the checkout request path. Synchronous observers and controller calls block the customer, and minute-level cron is not event-driven.
Question 22Adobe Commerce Architecture and Solution Design
An architect is choosing between a plugin and an observer for intercepting a service method to alter its arguments. Which statement is accurate?
- Both can modify arguments but only observers can change return values
- A before plugin can modify arguments, while an observer cannot alter the method call Correct answer.
- Neither can modify arguments without a preference
- An observer can modify arguments, while a plugin cannot
Explanation
Before plugins receive and can return modified arguments for a method call, whereas observers react to dispatched events and cannot alter the intercepted method's arguments or return value. Preferences replace implementations rather than intercept calls.
Question 23Adobe Commerce Architecture and Solution Design
A solution must support multiple frontend clients with different caching and rate-limit policies against the same catalog. Which architecture best isolates those concerns?
- Disabling web APIs for all but one client
- A single shared Varnish instance with one global policy
- A dedicated API gateway in front of the Commerce web APIs applying per-client policies Correct answer.
- Per-client duplicate Commerce installations
Explanation
An API gateway centralizes per-client authentication, rate limiting, and caching policy while keeping one Commerce backend. A single global policy cannot differentiate clients, and duplicate installations multiply operational cost.
Question 24Adobe Commerce Architecture and Solution Design
An architect must ensure indexers and cron do not compete with storefront traffic during peak hours. Which approach is most sound?
- Switch all indexers to update-on-save and run cron continuously
- Run indexers in update-on-schedule mode and schedule cron in off-peak windows with separate consumers Correct answer.
- Disable cron entirely and rely on manual reindexing
- Run reindexing synchronously inside each storefront request
Explanation
Scheduled indexing plus off-peak cron windows and dedicated consumers separates heavy background work from customer-facing requests. Update-on-save under continuous cron or synchronous reindexing increases contention during peak traffic.
Question 25Adobe Commerce Architecture and Solution Design
A multi-website deployment needs different payment methods per website while sharing code and catalog. Which configuration strategy is correct?
- Configure payment methods at global scope for all websites
- Configure payment methods at website scope and verify the scope hierarchy resolves per website Correct answer.
- Configure payment methods at store view scope only
- Hardcode the payment method in the checkout controller
Explanation
Payment method configuration supports website scope, allowing different methods per website while sharing code and catalog. Global scope forces one method set everywhere, and hardcoding bypasses configuration.
Question 26Adobe Commerce Architecture and Solution Design
In Adobe Commerce, which configuration file is the primary place to declare a preference that maps an interface to a concrete implementation for dependency injection?
- di.xml Correct answer.
- webapi.xml
- routes.xml
- module.xml
Explanation
Dependency injection configuration, including preferences, virtual types, and argument overrides, is declared in di.xml. module.xml only declares module identity and dependencies. The other files govern routing or web API exposure.
Question 27Adobe Commerce Architecture and Solution Design
Which Adobe Commerce architectural layer is responsible for enforcing that a service input meets declared constraints before business logic executes?
- The repository implementation
- The service contract interface
- The input validation and web API layer Correct answer.
- The presentation view layer
Explanation
Validation of incoming service data is handled at the boundary, typically via web API input validation and service contract data interfaces. Business logic in repositories assumes validated input. The view layer is downstream of service execution.
Question 28Adobe Commerce Architecture and Solution Design
An architect is deciding how to structure a deployment where admin users, cron consumers, and storefront traffic must scale independently. Which architecture aligns best with Adobe Commerce Cloud and standard Adobe Commerce guidance?
- A single node group with vertical scaling only
- Separate node groups for web, cron, and admin with shared services such as database, cache, and search Correct answer.
- A single monolithic node running all roles to simplify operations
- One node per website with its own dedicated database per website
Explanation
Adobe Commerce supports splitting roles across node groups so web, cron, and admin workloads scale and deploy independently while sharing stateful services. Dedicated databases per website are not a supported scaling pattern for shared catalog data. Vertical-only scaling limits elasticity.
Question 29Adobe Commerce Architecture and Solution Design
A merchant needs catalog price rules recalculated promptly after bulk imports, but full reindexing during business hours degrades storefront performance. Which design best balances freshness and availability?
- Disable indexers entirely and rely on a nightly full reindex
- Run full reindex synchronously on every product save
- Use update-on-save where feasible and schedule full reindex via cron in low-traffic windows with partial reindex for changed items Correct answer.
- Increase PHP memory limit so reindex completes faster during peak traffic
Explanation
Indexing strategy should match data volatility: update-on-save or partial reindex keeps frequently changing data fresh, while full reindex is batched into low-traffic windows. Disabling indexers leaves stale storefront data. Synchronous full reindex per save creates contention.
Question 30Adobe Commerce Architecture and Solution Design
A solution must serve a native mobile app and a web storefront from the same catalog with different cache lifetimes and rate limits per client. Which design is most appropriate?
- A single shared cache keyed only by URL with one global TTL
- Duplicating the catalog into a second Adobe Commerce instance per client
- Disabling caching for the mobile client to avoid stale data
- Separate GraphQL endpoints or client identifiers with per-client cache tags and rate-limit policies in front of a shared catalog service Correct answer.
Explanation
A shared catalog service can back multiple clients while caching and throttling are applied per client identity or endpoint. Cache keys must include client context to avoid cross-client leakage. Duplicating the catalog multiplies operational cost and drift.
Question 31Adobe Commerce Architecture and Solution Design
An architect must expose a custom service to third-party integrators with a versioned, stable contract while allowing internal implementation changes. Which approach best satisfies this?
- Allow integrators to call controllers directly
- Publish the database schema so integrators can query tables
- Define a service contract interface with data interfaces and expose it via webapi.xml, keeping implementation behind a preference Correct answer.
- Expose the concrete model class methods directly through webapi.xml
Explanation
Service contracts provide a stable, versioned API surface decoupled from implementation, and webapi.xml exposes those interfaces. Exposing concrete classes or tables couples integrators to internals that may change. Controllers are not a supported integration surface.
Question 32Adobe Commerce Architecture and Solution Design
A merchant operates several brands, each needing its own base currency, tax rules, and checkout configuration, while sharing one product catalog and codebase. Which scoping design is correct?
- Use a single store view and switch currency dynamically per customer session
- Set all differing values at global scope and override per store view
- Create one website per brand and set currency, tax, and checkout configuration at website scope Correct answer.
- Use a single website with multiple store views and set currency at store view scope only
Explanation
Website scope is the correct level for currency, tax, and checkout configuration that varies by brand while catalog data is shared globally. Store view scope is intended for presentation-level differences such as locale and translations.
Question 33Adobe Commerce Architecture and Solution Design
An architect is designing checkout so that a payment authorization and an order record commit atomically within the same database. Which mechanism should be used?
- A database transaction wrapping the writes with rollback on failure Correct answer.
- Separate cron jobs that reconcile records later
- A message queue consumer that writes asynchronously without idempotency
- Nested observers that each write independently
Explanation
Atomicity across multiple writes in one database requires a transaction that commits or rolls back together. Asynchronous or observer-based writes without a shared transaction can leave partial state. Reconciliation jobs address symptoms rather than preventing inconsistency.
Question 34Adobe Commerce Architecture and Solution Design
A custom module must add a new step to the checkout flow without forking the vendor checkout module. Which extension approach is most appropriate?
- Override the vendor module's templates by copying them into the custom module
- Edit the vendor module's JavaScript files directly
- Use layout XML and DI configuration to inject a new step component and extend the existing checkout configuration Correct answer.
- Replace the entire checkout module with a custom implementation
Explanation
Adobe Commerce extensibility favors layout XML, DI, and declarative configuration to add components without modifying vendor code. Copying or editing vendor files creates upgrade conflicts. Replacing the whole checkout module increases maintenance burden unnecessarily.
Question 35Adobe Commerce Architecture and Solution Design
An architect must guarantee that a long-running third-party enrichment call triggered by order placement never blocks the checkout response and is retried on transient failure. Which design best meets both requirements?
- Fire the call from a JavaScript client after the success page loads
- Use a cron job that scans all orders every minute
- Call the third party synchronously inside the order placement observer
- Publish a message to a queue consumed by a worker with retry and dead-letter handling Correct answer.
Explanation
Asynchronous messaging decouples the checkout response from the enrichment call, and queue consumers provide retry and dead-letter semantics. Synchronous observers block the request, while polling cron and client-side calls lack reliable delivery guarantees.
Question 36Adobe Commerce Architecture and Solution Design
A merchant requires that a subset of customers see negotiated prices while the public catalog remains unchanged, and the solution must scale to many customer groups. Which architecture is most appropriate?
- Apply a client-side price override based on the logged-in customer
- Maintain negotiated prices in an external spreadsheet consulted by support staff
- Duplicate all products into a separate website per customer group
- Use customer-group-scoped price attributes and shared catalogs with indexers to resolve effective price at query time Correct answer.
Explanation
Customer-group price scoping combined with shared catalogs lets one catalog serve many groups while indexers resolve effective pricing efficiently at query time. Duplicating products per group multiplies catalog size and maintenance. Client-side overrides and manual lookups are neither secure nor scalable.
Question 37Custom Module and Extension Development
In an Adobe Commerce module, which file is required to declare the module and its version to the framework?
- composer.json
- registration.php
- etc/di.xml
- etc/module.xml Correct answer.
Explanation
A module declares its name and setup version in etc/module.xml, which the framework reads to register the module and drive setup versioning. registration.php only registers the component with the autoloader/component registrar.
Question 38Custom Module and Extension Development
Which PHP file is used to register a module's base directory with Adobe Commerce so it can be discovered?
- etc/module.xml
- etc/config.xml
- registration.php Correct answer.
- Setup/InstallSchema.php
Explanation
registration.php calls the component registrar with the module name and its path, allowing the framework to discover the module's location. Schema and config files are consumed only after the module is discovered.
Question 39Custom Module and Extension Development
A developer needs a module to load after another module so its preferences take effect. Where is this ordering declared?
- In composer.json require section
- In registration.php
- In etc/module.xml sequence node Correct answer.
- In etc/di.xml preference node
Explanation
Module load order is controlled by the sequence element inside etc/module.xml, which lists modules that must be loaded before this one. Preferences do not influence load order.
Question 40Custom Module and Extension Development
Which XML file is the standard location for declaring a class preference (interface-to-implementation mapping) in a module?
- etc/routes.xml
- etc/events.xml
- etc/di.xml Correct answer.
- etc/module.xml
Explanation
Dependency injection configuration, including preferences, virtual types, and argument replacements, lives in etc/di.xml (and area-specific di.xml files).
Question 41Custom Module and Extension Development
A module must intercept a public method of another module's class without modifying it. Which mechanism is designed for this?
- A preference replacing the class
- A plugin (interceptor) declared in di.xml Correct answer.
- An observer on a controller event
- A virtual type
Explanation
Plugins (interceptors) wrap public methods of a target class, allowing before, after, and around behavior without changing the original code. Preferences replace the implementation entirely rather than intercepting a method.
Question 42Custom Module and Extension Development
A plugin defines only an after method for a target method that returns a value. What must the after method's signature include?
- The original arguments only
- The result only
- The subject followed by the original result Correct answer.
- The subject followed by the original arguments and result
Explanation
After plugins receive the subject instance and the result of the original method, and must return a (possibly modified) result. They do not receive the original arguments unless declared via additional parameters.
Question 43Custom Module and Extension Development
What is the defining characteristic of an around plugin?
- It cannot modify the return value
- It must call the proceed callable to invoke the original method Correct answer.
- It runs only when the original method throws an exception
- It replaces the method body permanently
Explanation
An around plugin receives a proceed callable representing the next plugin or original method; it must invoke proceed to run the chain and can modify arguments or the returned result.
Question 44Custom Module and Extension Development
Which plugin type cannot be used to change the arguments passed to the original method?
- After plugin Correct answer.
- Before plugin
- Around plugin
- None; all can change arguments
Explanation
After plugins run after the original method executes, so they can only observe or modify the result, not the arguments. Before and around plugins can alter arguments.
Question 45Custom Module and Extension Development
A developer wants to observe the event catalog_product_save_after. Which file declares the observer mapping?
- etc/webapi.xml
- etc/di.xml
- etc/module.xml
- etc/events.xml Correct answer.
Explanation
Event-to-observer mappings are declared in etc/events.xml (or an area-specific events.xml). The observer class is referenced there with its event name.
Question 46Custom Module and Extension Development
Which method must an observer class implement to handle an event?
- execute() Correct answer.
- process()
- handle()
- __invoke()
Explanation
Observers implement the execute method of the observer interface, receiving an Observer object from which event data is retrieved.
Question 47Custom Module and Extension Development
A module needs to add a new column to an existing table and support fresh installs and upgrades. Which approach is the current recommended practice?
- A direct SQL ALTER in a controller
- A Data Patch class Correct answer.
- Editing the vendor's db_schema.xml
- A new InstallSchema class
Explanation
Data patches (and schema patches) are the recommended declarative, versioned mechanism for schema and data changes, replacing legacy install and upgrade scripts. They run once and are tracked.
Question 48Custom Module and Extension Development
In declarative schema, which file defines the database table structure that Adobe Commerce applies during setup?
- etc/db_schema.xml Correct answer.
- etc/di.xml
- etc/schema.xml
- Setup/InstallSchema.php
Explanation
etc/db_schema.xml declares tables, columns, indexes, and constraints, and the framework generates and applies the resulting DDL during setup.
Question 49Custom Module and Extension Development
A developer registers a route for a custom frontend controller. Which file and location are used?
- etc/adminhtml/routes.xml
- etc/routes.xml in the module root
- etc/frontend/routes.xml Correct answer.
- etc/webapi.xml
Explanation
Frontend routes are declared in etc/frontend/routes.xml with a route id, frontName, and module reference. The area-specific directory ensures the route applies to the frontend area.
Question 50Custom Module and Extension Development
For a controller at Vendor\Module\Controller\Index\Index, what is the default frontend URL path when the route frontName is 'custom'?
- /vendor/module/index
- /module/custom/index
- /custom/controller
- /custom/index/index Correct answer.
Explanation
The URL is built from the frontName, then the controller directory and action, so /custom/index/index maps to the Index controller's Index action. The trailing index/index may be omitted in practice.