I did not have command line access on a few of the servers that hosted the projects I was working on. And currently Codeigniter 4 only has documentation on running database migrations / rollbacks / seeds in the command line.
Therefore I asked around and made a special controller for the migrations / rollbacks / seeding on those servers. Now I can run these database operations in the browser, by accessing the methods of that controller like this:
https://example.com/admintools/migrate
<?php namespace App\Controllers; use Exception; class Admintools extends BaseController { public function migrate() { // uncomment this after running migrations // exit; if (! service('ionAuth')->isAdmin()) { return; } // Load the migrations library $migrate = \Config\Services::migrations(); try { // Run all available migrations $migrate->latest(); // Alternatively, you can specify a specific version: // $migrate->version(3); echo 'Migrations were executed successfully.<br>'; } catch (Exception $e) { echo 'Error: ' . $e->getMessage(); } } public function seed() { // uncomment this after running seeds // exit; if (! service('ionAuth')->isAdmin()) { return; } $seeder = \Config\Database::seeder(); try { echo 'Seeding Certificates...<br>'; $seeder->call('CertificatesSeeder'); echo 'Seeding executed successfully.<br>'; } catch (Exception $e) { echo 'Error: ' . $e->getMessage(); } // add more seeds here if needed } public function rollback() { // uncomment this after running rollback // exit; if (! service('ionAuth')->isAdmin()) { return; } // Load the migrations library $migrate = \Config\Services::migrations(); try { // Run rollback; see the last batch that is to be kept // (find it in table „migrations") // and reference it in $target variable $target = 3; // if set "3", both migrations with that no and and those below will be unaffected $migrate->regress($target); echo 'Migration rollback executed successfully.<br>'; } catch (Exception $e) { echo 'Error: ' . $e->getMessage(); } } }
As you can see, there are multiple precautions here:
- I have an „exit;“ statement on all methods by default, so I have to comment those out if I want the methods to do stuff (and comment them out again after stuff is done). This prevents from re-running commands accidentally by accidentally opening a migration-related address in the browser (which is extremely easy to do).
- I also do not pass any data to controller methods via url segments or via get variables; and
- I check for the user to be admin.
And it is ever advisable to do db backup before executing migrations, whichever way you do it.
Parašykite komentarą