Override (almost) any core file in 5.7

When building complex concrete5 sites, you may find yourself needing to change some core functionality. Modern versions
of concrete5 offer a few ways that we can do this without sacrificing updatability or performance.

Service Provider Overrides

Most of concrete5's core functionality is bundled into what we call "services", you can find services in subdirectories
of the /concrete/src/ directory.
In order to start these services up, concrete5 employs a pattern known as "Service Provider". A service provider
manages booting up a service and adding it onto our Application instance so if we want to modify what a service is
doing, this is the place to start.

For example, what if you wanted to swap the core logger with a custom one?

Open up the core app config group, this is located in /concrete/config/app.php

Find where we list "LoggingServiceProvider" and determine the config key. It looks to be app.providers.core_logging

Open up our application's app config group, this is located in /application/config/app.php

Now instead of the core logging service provider, our own logging service provider is registered and our own custom
logger is used everywhere!

Path Based Overrides

Many files can be overridden in concrete5 simply by providing a file at a specific path. Pretty much the only
exclusion to what can be overridden by path is the contents of concrete/src/. Today, we can use paths to override
essentially everything that is not a service.

Essentially all path overrides follow an extremely simply pattern: find the path of the file you want to override
within the concrete directory, and create a file at that same path within your application directory.

That's not all we can override, we can do this same thing with any file in the /concrete/blocks/content/ directory. All
you need to do is create the file in your /application/blocks/content/ directory!

Adding a Custom Template

Custom Templates allow us to create custom views for blocks that we can optionally enable.

For example, to modify the HTML block to render as code:

In /application/blocks/html/templates/code_block/view.php

<pre><code><?= h(trim($content)) ?></code></pre>

Custom templates can be used to replace any javascript, css, or view files but they cannot be used to replace the controller.