Я думал о том, чтобы сделать это в определенный момент времени, и придумал хороший способ сделать это.
Прежде всего, примечание: я считаю, что вашему приложению необходим доступ на запись к app / config / database.php, чтобы вы могли написать правильную информацию. У меня есть обходной путь, но позвольте мне объяснить метод, с помощью которого работает установщик.
PHP-скрипты могут переписывать себя (или удалять себя) на лету. Поскольку скрипт загружается в память, а затем выполняется байт-код, он не зависит от файла после его работы. Таким образом, теоретически у вас может быть что-то, что переопределяет класс AppError для запуска определенного контроллера (скажем, вашего SetupWizardController) со всеми обычными загруженными вещами CakePHP. После того, как вы пройдете весь мастер, запишите файл database.php / настройте все остальное, перезапишите файлы AppError и AppController (я вижу, что вам нужен AppController для работы по-другому, если приложение в некоторых случаях не было установлено) с те, которые хранятся где-то как в app / vendors / myapp. Сценарий завершил выполнение, и теперь ваши проверки не будут выполняться при последующих запусках.
Это позволит избавиться от проблемы, возникшей у Билла Карвина, использовать AppError и создать установщик.
Другой способ сделать это - включить идею среды в ваше приложение. Допустим, вы храните свои среды в app / config / environment.php. Этому файлу будет предоставлен доступ для записи (и этот доступ будет удален в конце установки), или он может быть перезаписан. В любом случае, он существует, когда кто-то пытается развернуть ваше приложение, и database.php автоматически импортирует базы данных из файла environment.php. Затем конструктор класса database.php перезапишет свою базу данных $ default с базой данных, указанной в environment.php. $ Default в database.php будет ссылаться на источник данных NoDB, который вы можете проверить в AppController (я думаю, вы сможете создать фиктивную модель и проверить ее источник данных), а затем нажать требуемый установщик. Очевидно, что и после этого вы перезапишете AppController.