17/08/2018, 20:24

[Tips] Sử dụng `traits` với FuelPHP (1.8 dev)

Sơ lược Mình thấy khi có một tính năng hay muốn chia sẻ giữa các class mà không cần phải kế thừa, thì traits là một công cụ khá là bổ ích. Ví dụ chỉ đơn giản như mình muốn xuất logs khi chạy câu lệnh migrations thôi, và mình không muốn bất kì file migration nào mình cũng phải thêm dòng xuất log ...

Sơ lược

Mình thấy khi có một tính năng hay muốn chia sẻ giữa các class mà không cần phải kế thừa, thì traits là một công cụ khá là bổ ích. Ví dụ chỉ đơn giản như mình muốn xuất logs khi chạy câu lệnh migrations thôi, và mình không muốn bất kì file migration nào mình cũng phải thêm dòng xuất log vào đó, mình sẽ dùng traits ở FuelPHP

Cấu trúc thư mục traits và thêm autoload traits

Cấu trúc thư mục

FuelPHP không hỗ trợ sẵn autoload traits, chúng ta phải tự tạo thư mục traits để các file traits vào trong đó và sửa app/bootstrap.php để autoload. (Khá là lằn nhằn nhỉ ). Thôi đơn giản mình sẽ tạo thư mục traits nằm bên trong fuel/app như hình

Nội dung file traits

File traits của mình chỉ đơn giản như bên dưới. Nó có 2 nhiệm vụ * Output Sql ra file được chỉ định sẵn * Get short name của 1 class (thay vì tên có đầy đủ namespace)

<?php

trait MigrationSqlOutputTrait{

	public static function outputSql(){
		//Output SQL 
		//Create new Log;
		$filePath = '..' .DS.'..' . APPPATH;
		file_put_contents($filePath. implode('_', [date('Ymd'), self::getName()]) .'.sql' , DB::last_query());

	}
	public static function getName() {
	    $path = explode(', __CLASS__);
	    return array_pop($path);
	}
}

Autoload

Để autoload traits, mình cần chỉnh lại file app/bootstrap.php

/**
 * Your environment.  Can be set to any of the following:
 *
 * Fuel::DEVELOPMENT
 * Fuel::TEST
 * Fuel::STAGE
 * Fuel::PRODUCTION
 */
Fuel::$env = (isset($_SERVER['FUEL_ENV']) ? $_SERVER['FUEL_ENV'] : Fuel::DEVELOPMENT);

// Initialize the framework with the config file.
Fuel::init('config.php');
//Load traits
Fuel::load(APPPATH.'traits' .DS . 'MigrationSqlOutputTrait.php');

Thêm đoạn Fuel::load thôi, vậy là khi bootstrap thì MigrationSqlOutputTrait sẽ được autoload.

Sử dụng

Để sử dụng thì đơn giản là chúng ta chỉ cần thêm đoạn use MigrationSqlOutputTrait và dùng thôi . Các bạn có thể xem code mẫu bên dưới

<?php

namespace FuelMigrations;

class AAA
{
	use MigrationSqlOutputTrait;

	public function up()
	{
		DBUtil::add_fields('xxx', array(
			'yyy' => array('type' => 'tinyint(1)', 'default' => 0),

		));
		$this->outputSql();
	}

	public function down()
	{
		DBUtil::drop_fields('xxx', array(
			'yyy'

		));
	}
}

Khi chạy migration, thì sẽ có file 20180716_AAA.sql xuất hiện trong thư mục logs

TL;DR

Traits là một cách để chia sẻ code ngang hàng giưã các class trong PHP. Nhờ dùng traits chúng ta có thể giảm thiểu việc copy/paste code. Khi dùng traits các bạn nhớ cẩn thận vì có thể các traits có tên methods trùng nhau, khi đó chúng ta phải resolve traits conflict đấy.

Nguồn

FuelPHPでTraitを使う方法

0