OpenCart 🇺🇦

Статья "Registry Opencart: принцип работы"

Реестр в opencart сделан с целью хранения в нем объектов различных компонентов системы. Не знаю, почему ребята не использовали синглтон в разработке (ведь с ним реестр вовсе не понадобился-бы), но суть не в том. Реест есть и с ним нужно что-то делать. Что он в себе хранит? В файле index.php в корне сайта можно увидеть примерно следующий код:
$registry = new Registry();

// Loader
$loader = new Loader($registry);
$registry->set('load', $loader);

// Config
$config = new Config();
$registry->set('config', $config);
Что в нем происходит? Сначала создается объект класса реестр, затем по очереди в него помещаются различные компоненты. В данном случае, loader и config. Ну допустим, компоненты загружены. Что с ними происходит дальше и как его теперь использовать? Если мы посмотрим на исходники абстракного класса Controller, то увидим следующий код:
abstract class Controller {
	protected $registry;	
	// ----

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

	public function __get($key) {
		return $this->registry->get($key);
	}

	public function __set($key, $value) {
		$this->registry->set($key, $value);
	}
То есть при вызове какого-либо контроллера произойдет передача ему указателя на тот самый наш реестр, а при вызове магических методов __get() && __set() произойдет передача вызовов на реестр. Что это даст? Будет понятно на примере:
class SomeController extends Controller {
 
    public function index() {
        
        $this->load->model('...');
        $this->config->get('param');
    }
}
При вызове обоих аттрибутов класса на самом деле произел вызов из реестра. А уже в реестре, как мы видели ранее, хранится 2 компонента: config и load. Именно к ним идет обращение в данном случае (к объектам класса Config и Loader соответственно). Точно так-же работает и модель: там, правда, обращение идет в основном к базе данных (компонент db), компоненту config, load. Но механизм работы у нее такой-же. В этом и весь секрет работы реестра в opencart :)