search
LoginSignup
11

More than 5 years have passed since last update.

posted at

updated at

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

表題の件で小ネタ。

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
11