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

表題の件で小ネタ。  

[CodeIgniter](http://www.codeigniter.com/) の認証系ライブラリといえば [Tank Auth](http://konyukhov.com/soft/tank_auth/) が有名だけど、もう何年もメンテされておらず CodeIgniter **3** にも対応してないので、
[Cartalyst](https://cartalyst.com/) というところが作ってる「**[Sentry](https://cartalyst.com/manual/sentry)**」をメインに使っていこうと思ってる。

**Sentry** は [Laravel](http://laravel.com/) での動作がメインだけど、CodeIgniter でも動くように作られてる（というかフレームワーク関係なく単体でも動く）。
Sentry で使用されるMySQLのテーブル名は「groups」や「users」といった他でカブりそうな名前になっているので、これを「auth_groups」「auth_users」といったプレフィクスを付けた状態で使いたかったのでメモ。

## MySQLテーブルの作成

MySQLにテーブルを作る際、Sentry が用意している 「**[mysql.sql](https://github.com/cartalyst/sentry/blob/v2.1.4/schema/mysql.sql)**」というファイルを使う。
この中に `CREATE TABLE` 群があるので、そのテーブル名を全て変更する。
今回はテーブル名に「**auth_**」というプレフィクスを付けることにした。

```sql: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 をインストール](https://cartalyst.com/manual/sentry/2.1#installation)した後（ autoload も必要）、
CodeIgniter 側で使うには以下のようにするのが良さげ。

```php:例として「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();
    }

    ...
```

通常利用ではこれで準備ができたので、あとは[公式マニュアル](https://cartalyst.com/manual/sentry/2.1#authentication)での **`Sentry::xxxxx`** の部分を **`$this->sentry->xxxxx`** に置き換えて使える。


## プレフィクスありで使う

Sentry のソースを見ると、CodeIgniter の `application/config/database.php` にある設定からデフォルトのプレフィクスを読み込んでる。
なので、一時的にそこを書き換えることで動いてくれた。

```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/database`](https://github.com/illuminate/database) や [`illuminate/http`](https://github.com/illuminate/http) が必要だった。
これは Laravel のライブラリ。
で、`illuminate/http` には [`symfony/HttpFoundation`](https://github.com/symfony/HttpFoundation) 等が必要。
これは [Symfony](https://symfony.com/) のライブラリ。
CodeIgniter で使うのに上記2つのライバルフレームワークのものを使うのがなんか面白かったw