Using the Logger in Classes

Want to use the default logger in classes using dependency injection? It's easy. Simply call the logger in your constructor:

namespace MyVendor\Something;

use Concrete\Core\Logging\Logger;

class MyClass
{

    protected $logger;

    public function __construct(Logger $logger) {
        $this->logger = $logger;    
    }

}

Then create the class via the application container.

$myClass = $this->app->make('MyVendor\Something\MyClass');

This will create an instance of MyClass, with the logger already configured for use with the application channel.

Most controllers should have access to $this->app. However, if you're outside the controller, you'll need to create an instance of the container object. You can always call:

$app = Facade::getFacadeApplication();

Or, simply call

$myClass = \Core::make('MyVendor\Something\MyClass');

Using the logger with a new Channel

Don't want to use the default Application channel when injecting the Logger via dependency injection? It's easy to switch channels.

class MyClass
{

    protected $logger;

    public function __construct(Logger $logger) {
        $logger = $logger->withName('shopping_cart');
        $this->logger = $logger;    
    }

}

Alternatively, simply subclass the core logger:

class ShoppingCartLogger extends Concrete\Core\Logging\Logger
{

    public function __construct()
    {
        parent::__construct('shopping_cart');
    }

}

class MyClass
{

    protected $logger;

    public function __construct(ShoppingCartLogger $logger) {
        $this->logger = $logger;    
    }

}