11/08/2018, 20:48

Sử dụng phinx để thực hiện migration trong PHP

Migration là gì Migration là một tính năng được "vay mượn" từ Rails - Ruby framework, rất hữu dụng khi chúng ta thay đổi database (thường là MySQL) và muốn quản lý version của những lần thay đổi đó. Thay đổi có thể là thêm bảng, thêm cột vào bảng hay thay đổi các cột trong cùng một bảng. Nếu các ...

Migration là gì

Migration là một tính năng được "vay mượn" từ Rails - Ruby framework, rất hữu dụng khi chúng ta thay đổi database (thường là MySQL) và muốn quản lý version của những lần thay đổi đó. Thay đổi có thể là thêm bảng, thêm cột vào bảng hay thay đổi các cột trong cùng một bảng. Nếu các bạn quen dùng Rails thì sẽ hiểu khái niệm này rất nhanh.

Cộng đồng dev của PHP đã "chế" ra một ứng dụng tương tự, làm được các tính năng y hệt như Active Record của Rails, gọi là phinx.

Dĩ nhiên nếu bạn đã dùng các framework lớn của PHP thì migration sẽ được tích hợp như là built-in, có thể kể ra doctrin của Symfony, bundle của CakePHP hay devtools của Phalcon. Tuy nhiên nếu codebase hiện tại không dùng các framework kể trên thì một giải pháp độc lập sẽ hũu ích nhất. Và phinx chính xác sẽ là thứ bạn cần.

Cài đặt

phinx có thể cài đặt dễ dàng bằng composer. Bạn có thể thêm những dòng sau vào composer.json và chạy composer install

{
  "require": {
    "robmorgan/phinx": "*"
  },
}

Nếu không thì chạy thẳng luôn 2 dòng

composer require robmorgan/phinx
composer install --no-dev

Sử dụng

Sử dụng thì rất đơn giản, trước hết có thể dùng câu lệnh create để tạo một file migration

phinx create CityMigration

như thế một file với tên YYYYMMDDHHMMSS_city_migration.php sẽ được tạo ra tự động và có nội dung là

<?php

use PhinxMigrationAbstractMigration;

class CityMigration extends AbstractMigration
{
    /**
     * Change Method.
     *
     * More information on this method is available here:
     * http://docs.phinx.org/en/latest/migrations.html#the-change-method
     *
     * Uncomment this method if you would like to use it.
     *
    public function change()
    {
    }
    */

    /**
     * Migrate Up.
     */
    public function up()
    {

    }

    /**
     * Migrate Down.
     */
    public function down()
    {

    }
}

File mẫu này có rất nhiều nội dung từ document của phinx, Ở đây có 3 hàm up, down và change. up dùng để chạy các thay đổi database lần đầu được thực hiện, như là thêm một cột hoàn toàn mới, bảng hoàn toàn mới v.v... down dùng cho những lúc bạn muốn "undo", "rollback" lại các thay đổi lần trước. Hàm change thì hơi đặt biệt một chút, bạn viết trình tự cho up vào hàm change và phinx sẽ tự hiểu đến lúc down phải làm thế nào. Khi dùng hàm change thì phinx sẽ ignore hết các đoạn code viết vào up hay down ở trên cùng một file.

Mình giả sử cần tạo một table city với 3 trường name, country và population thì có thể viết gọn như sau.

use PhinxMigrationAbstractMigration;

class CityMigration extends AbstractMigration {
    public function up() {
        $table = $this->table('city');
        $table
            ->addColumn('name', 'string', array('limit' => 20))
            ->addColumn('country', 'string', array('limit' => 20))
            ->addColumn('population', 'integer', ['limit'=>5000000])
            ->save();
    }
    public function down() {}
}

Ngoài ra phinx còn khá nhiều cách dùng linh hoạt khác, bạn có thể đọc thêm tại document

Kết luận

Migration thực sự là một kĩ thuật làm nhẹ gánh bớt nhức đầu rất nhiều cho lập trình backend bằng PHP. Nếu bạn còn chưa ứng dụng vào dự án của mình thì mình khuyên là rất nên thử, sẽ đến lúc bạn muốn cảm ơn migration rất nhiều.

0