Biplob Hossain

Helper and Service Classes in Concrete CMS

January 25, 2025 | by biplob.ice

concrete_CMS_logo_-_handat2x

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() or Application::getFacadeApplication()->make() to retrieve services.

RELATED POSTS

View all

view all