
Helper and Service Classes in Concrete CMS
In Concrete CMS, you can use Helper and Service classes to keep the application structured, modular, and reusable. Below, I’ll provide Concrete CMS-specific examples for both.
1. Helper Class in Concrete CMS
Concrete CMS uses Helpers for utility functions (e.g., date formatting, text manipulation, etc.). These are usually stateless and used globally.
Example: Creating a Custom Helper
You can create a custom Helper in a Concrete CMS package under src/Helper
:
File: packages/my_package/src/Helper/StringHelper.php
namespace MyPackage\Helper;
class StringHelper {
public static function toCamelCase(string $string): string {
return lcfirst(str_replace(' ', '', ucwords(str_replace('_', ' ', $string))));
}
public static function toSnakeCase(string $string): string {
return strtolower(preg_replace('/[A-Z]/', '_$0', lcfirst($string)));
}
}
Usage in a Controller or View
use MyPackage\Helper\StringHelper;
$camelCase = StringHelper::toCamelCase('hello_world'); // Output: helloWorld
$snakeCase = StringHelper::toSnakeCase('helloWorld'); // Output: hello_world
Using Core Concrete CMS Helpers
Concrete CMS provides built-in helpers. Example:
$textHelper = $app->make('helper/text');
echo $textHelper->camelcase('hello world'); // Output: HelloWorld
👉 Concrete CMS helpers are loaded using $app->make('helper/...')
2. Service Class in Concrete CMS
A Service class in Concrete CMS handles business logic and often interacts with repositories or APIs.
Example: Creating a Custom Service
File: packages/my_package/src/Service/UserService.php
namespace MyPackage\Service;
use Concrete\Core\Database\Connection\Connection;
class UserService {
protected $db;
public function __construct(Connection $db) {
$this->db = $db;
}
public function getUserById(int $id): ?array {
return $this->db->fetchAssoc("SELECT * FROM Users WHERE uID = ?", [$id]);
}
public function createUser(string $name, string $email): bool {
return $this->db->executeQuery("INSERT INTO Users (uName, uEmail) VALUES (?, ?)", [$name, $email]);
}
}
Registering the Service in the Concrete CMS Container
Concrete CMS uses dependency injection, so you should register the Service in a ServiceProvider
.
File: packages/my_package/src/ServiceProvider.php
namespace MyPackage;
use Concrete\Core\Foundation\Service\Provider as ServiceProvider;
use MyPackage\Service\UserService;
use Concrete\Core\Support\Facade\Application;
class MyServiceProvider extends ServiceProvider {
public function register() {
$this->app->singleton(UserService::class, function($app) {
return new UserService($app->make('database')->connection());
});
}
}
👉 Make sure to register the service provider in your package controller:
$this->app->register(new \MyPackage\MyServiceProvider($this->app));
Usage in a Controller
use MyPackage\Service\UserService;
use Concrete\Core\Support\Facade\Application;
$app = Application::getFacadeApplication();
$userService = $app->make(UserService::class);
$user = $userService->getUserById(1);
print_r($user);
Key Takeaways for Concrete CMS
- Helper Classes contain static utility functions (e.g., text manipulation).
- Service Classes handle business logic and use dependency injection.
- Use
app()
orApplication::getFacadeApplication()->make()
to retrieve services.
RELATED POSTS
View all