Edited at

CodeIgniter3 + 認証系ライブラリ「Cartalyst Sentry」で、MySQLのテーブル名にプレフィクスをつけたい

More than 3 years have passed since last update.

表題の件で小ネタ。

CodeIgniter の認証系ライブラリといえば Tank Auth が有名だけど、もう何年もメンテされておらず CodeIgniter 3 にも対応してないので、

Cartalyst というところが作ってる「Sentry」をメインに使っていこうと思ってる。

SentryLaravel での動作がメインだけど、CodeIgniter でも動くように作られてる(というかフレームワーク関係なく単体でも動く)。

Sentry で使用されるMySQLのテーブル名は「groups」や「users」といった他でカブりそうな名前になっているので、これを「auth_groups」「auth_users」といったプレフィクスを付けた状態で使いたかったのでメモ。


MySQLテーブルの作成

MySQLにテーブルを作る際、Sentry が用意している 「mysql.sql」というファイルを使う。

この中に CREATE TABLE 群があるので、そのテーブル名を全て変更する。

今回はテーブル名に「auth_」というプレフィクスを付けることにした。


sentry/schema/mysql.sqlの例(抜粋)

# Dump of table groups

# ------------------------------------------------------------

-- DROP TABLE IF EXISTS `groups`; ↓変更
DROP TABLE IF EXISTS `auth_groups`;

-- CREATE TABLE `groups` ( ↓変更
CREATE TABLE `auth_groups` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`permissions` text COLLATE utf8_unicode_ci,
`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
UNIQUE KEY `groups_name_unique` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

# Dump of table users
# ------------------------------------------------------------

-- DROP TABLE IF EXISTS `users`; ↓変更
DROP TABLE IF EXISTS `auth_users`;

-- CREATE TABLE `users` ( ↓変更
CREATE TABLE `auth_users` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
...
以下くりかえし


とりあえずこの mysql.sql をMySQLに取り込んでテーブルを作成。


普通に使う場合(プレフィクスなし)

Composer で Sentry をインストールした後( autoload も必要)、

CodeIgniter 側で使うには以下のようにするのが良さげ。


例として「MY_Controller」の場合その1

<?php

(! defined('BASEPATH')) and exit('No direct script access allowed');

class MY_Controller extends CI_Controller {

// Sentryのインスタンスを入れる用
protected $sentry;

public function __construct()
{
parent::__construct();

// ここで Sentry のインスタンスをセット
$this->sentry = \Cartalyst\Sentry\Facades\CI\Sentry::createSentry();
}

...


通常利用ではこれで準備ができたので、あとは公式マニュアルでの Sentry::xxxxx の部分を $this->sentry->xxxxx に置き換えて使える。


プレフィクスありで使う

Sentry のソースを見ると、CodeIgniter の application/config/database.php にある設定からデフォルトのプレフィクスを読み込んでる。

なので、一時的にそこを書き換えることで動いてくれた。


例として「MY_Controller」の場合その2

<?php

(! defined('BASEPATH')) and exit('No direct script access allowed');

class MY_Controller extends CI_Controller {

// Sentryのインスタンスを入れる用
protected $sentry;

public function __construct()
{
parent::__construct();

// デフォルトのプレフィクスをとっておく
$default_prefix = $this->db->dbprefix;

// 今回つけた「auth_」というプレフィクス名で一時的に上書き
$this->db->set_dbprefix('auth_');

// Sentry のインスタンスをセット
$this->sentry = \Cartalyst\Sentry\Facades\CI\Sentry::createSentry();

// デフォルトのプレフィクスに戻す
$this->db->set_dbprefix($default_prefix);
}

...


ということで以上です。


以下蛇足

Sentry を Composer でインストールする際、 illuminate/databaseilluminate/http が必要だった。

これは Laravel のライブラリ。

で、illuminate/http には symfony/HttpFoundation 等が必要。

これは Symfony のライブラリ。

CodeIgniter で使うのに上記2つのライバルフレームワークのものを使うのがなんか面白かったw