PHPでログイン機能を実装してみる【1】

はじめに

開発環境構築の参考

環境

ローカル開発環境
Mac
centos 7
192.168.33.10

作業ディレクトリ

/home/vagrant/login

今回はドットインストールを参考に、PHPを使ったログイン画面の作成を実装してみます。

設計のモデルはMVCを採用しており、事前段階で準備しておくファイルの構成は以下の通りです。

home/vagrant/
    └ login/
      ├ lib/
      │ └ Controller.php  
      │ └ Model.php
      │ └ functions.php
      ├ public_html/
      │ └ index.php
      └ config/
        └ 

MVCモデルとは

MVCとはModel・View・Controllerの略で、処理を3つの役割に分割して実装する手法です。
MVCは通常それぞれ独立しているの場合が多く、分業しやすいメリットがあります。
あくまで「MVCモデル」であり、「これが正解」というものでは無いです。

・Model
システムロジックやデータアクセスの処理を担当。
実際にデータの処理を行う。

・View
画面表示や入出力の処理。
デザインやレイアウトに関わる部分を担当し、HTMLの生成を担っている。

・Controller
ModelとViewが行う処理の橋渡しを担当。
ModelやViewを制御すると言われたりする。

lib(ライブラリ)ディレクトリは汎用性の高いプログラムをまとめておく。

今回はController.phpとModel.phpを最初に作っておく。

ViewはWebサーバーから見ることができるようにする必要があるので、public_htmlディレクトリにindex.phpを作成。

その他にも、名前空間,オートロードの仕組みに関しては予備知識として事前に調べておいたほうがいいかもしれません。

各種設定を入れる

configディレクトリ内に設定を入れていく

config/
  ├ init.sql
  ├ config.php
  └autoload.php

まず、init.sqlを参照してデータベースを作る
init.sql

create database login_php;
grant all on login_php.* to dbuser@localhost identified by 'Ku7+Lz9(';
use login_php
create table users (
 id int not null auto_increment primary key,
 email varchar(255) unique,
 password varchar(255),
 created datetime,
 modified datetime
);
desc users;

アプリ全体の設定をする
config.php

<?php

ini_set('display_errors', 1);
define('DSN', 'mysql:host=localhost;dbname=login_php');
define('DB_USERNAME', 'dbuser');
define('DB_PASSWORD', 'Ku7+Lz9(');
require_once(__DIR__ . '/../lib/functions.php');
require_once(__DIR__ . '/autoload.php');
session_start();

クラスのオートロード設定
autoload.php

<?php
/*
MyApp
index.php controller
MyApp\Controller\Index
-> lib/Controller/Index.php
*/

spl_autoload_register(function($class) {
 $prefix = 'MyApp\\';
 if (strpos($class, $prefix) === 0) {
   $className = substr($class, strlen($prefix));
   $classFilePath = __DIR__ . '/../lib/' . str_replace('\\', '/', $className) . '.php';
   if (file_exists($classFilePath)) {
     require $classFilePath;
   }
 }
});

IndexのControllerを作っていく

public.htmlディレクトリに、index.phpファイルを作成。
configの情報を呼び出す。
今いるディレクトリのひとつ上の config ディレクトリの config.php を読み込む。
※ログインしている場合はユーザー一覧が表示される
/public_html/index.php

<?php
// ユーザーの一覧

require_once(__DIR__ . '/../config/config.php');
$app = new MyApp\Controller\Index();
$app->run();

ログイン画面に飛ばすコードを書く

ログインしているかどうかは、共通処理を書いたControllerクラスに記述する。
Controllerクラスを作成し、isLoggedInメソッドを作る。
/lib/Controller.php

<?php
namespace MyApp;
class Controller {
 protected function isLoggedIn() {
   // $_SESSION['me']
   return isset($_SESSION['me']) && !empty($_SESSION['me']);
 }
}

ログインしていない場合はログイン画面に飛ばす
/lib/Controller/Index.php
※先頭が大文字になっているので注意

<?php
namespace MyApp\Controller;
class Index extends \MyApp\Controller {
  public function run() {
    if (!$this->isLoggedIn()) {
      // ログインしていない場合はログイン画面にリダイレクトをかける
      header('Location: ' . SITE_URL . '/login.php');
      exit;
    }
    // get users info
  }
}

SITE_URLをconfig.php内に定義する
config.php

 <?php
ini_set('display_errors', 1);

define('DSN', 'mysql:dbhost=localhost;dbname=dotinstall_sns_php');
define('DB_USERNAME', 'dbuser');
define('DB_PASSWORD', 'mu4uJsif');
 
 define('SITE_URL', 'http://' . $_SERVER['HTTP_HOST']); //追加
 
require_once(__DIR__ . '/../lib/functions.php');
require_once(__DIR__ . '/autoload.php');

session_start();


Viewにlogin.phpを作成する。
configの設定はindex.phpと同じなので一部コピー。

/public_html/login.php

<?php
// ログイン

require_once(__DIR__ . '/../config/config.php');

// $app = new MyApp\Controller\Login();
//
// $app->run();

echo "login screen";
exit;

ログイン画面が表示されるか確認。
ビルトイン Web サーバーを立ち上げる。
※ -tオプションを使ってディレクトリを指定

[vagrant@localhost sns-login]$ php -S 192.168.33.10:8000 -t public_html/

今回は各種設定からindexのコントローラーの作成、ログイン画面を表示するところまでをメモしました。

次回はログイン画面の作成や新規登録周りの処理についてメモしていきたいと思います。

この記事が気に入ったらサポートをしてみませんか?