laravelのログイン認証を勉強しよう

# ディレクトリを作成します
[vagrant@localhost app]$ mkdir angel

# 作成したディレクトリに移動
[vagrant@localhost app]$ cd angel
[vagrant@localhost angel]$ ls

# composerをインストール
[vagrant@localhost angel]$ curl -sS https://getcomposer.org/installer | php
[vagrant@localhost angel]$ ls
composer.phar

# composerでlaravelをインストール。ディレクトリ名は適当にangelとしておきます。
php composer.phar create-project –prefer-dist laravel/laravel angel

# mysqlにログイン
[vagrant@localhost ~]$ mysql -u root -p
Enter password:
mysql> show databases;

# mysqlでDBの作成
mysql> create database angel;
Query OK, 1 row affected (0.12 sec)

# .envファイルを編集

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=angel
DB_USERNAME=root
DB_PASSWORD=secret

# migration 実行
[vagrant@localhost angel]$ cd angel
[vagrant@localhost angel]$ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated: 2014_10_12_100000_create_password_resets_table

# 作成されたtable確認
mysql> use angel;
mysql> show tables;
+—————–+
| Tables_in_angel |
+—————–+
| migrations |
| password_resets |
| users |
+—————–+
3 rows in set (0.00 sec)

mysql> describe migrations;
+———–+——————+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+———–+——————+——+—–+———+—————-+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| migration | varchar(255) | NO | | NULL | |
| batch | int(11) | NO | | NULL | |
+———–+——————+——+—–+———+—————-+
3 rows in set (0.08 sec)

mysql> describe password_resets;
+————+————–+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+————+————–+——+—–+———+——-+
| email | varchar(255) | NO | MUL | NULL | |
| token | varchar(255) | NO | | NULL | |
| created_at | timestamp | YES | | NULL | |
+————+————–+——+—–+———+——-+
3 rows in set (0.00 sec)

mysql> describe users;
+——————-+———————+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+——————-+———————+——+—–+———+—————-+
| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
| email | varchar(255) | NO | UNI | NULL | |
| email_verified_at | timestamp | YES | | NULL | |
| password | varchar(255) | NO | | NULL | |
| remember_token | varchar(100) | YES | | NULL | |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
+——————-+———————+——+—–+———+—————-+
8 rows in set (0.00 sec)

# 認証機能を生成
[vagrant@localhost angel]$ php artisan make:auth
Authentication scaffolding generated successfully.

# routes/web.phpに追加されている

Auth::routes();

Route::get('/home', 'HomeController@index')->name('home');

# php artisan serveでサーバを立てる
[vagrant@localhost angel]$ php artisan serve –host 192.168.35.10 –port 8000
Laravel development server started:

# ${domain}/register にアクセス

おおおおおおおおおお、これはちょっと勉強が必要だ。

migrationファイルによるカラム修正

<?php

use Illuminate\Support\Facades\Schema\;
use Illuminate\Database\Schema\Blueprint\;
use Innuminate\Database\Migrations\Migration;

class AddColumnSalesHogeTable extends Migration{

	public function up(){
		Schema::table('books', function(Blueprint $table){
			$table->integer('sales')->default(0)->index('index_sales')->after('price')->comment('販売数');
		});
	}

	public function down()
	{
		Schema::table('books', function(Blueprint $table){
			$table->dropColumn('sales');
		});
	}
}

Laravel5.7 バリデーションのエラーメッセージをカスタマイズ

Laravel5.7 バリデーションのエラーメッセージをカスタマイズしたいと思います。
複雑なことやってんのかな? いえ、こんなに奇怪なことはやってません。

まず、app/Http/Requests 配下にフォームリクエストのCompanyRequest.phpがあります。

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class CompanyRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'company_name' => 'required',
            'agent_name' => 'required',
        ];
    }
}

この状態だと、fieldの値がnullだと、「The ${value} field is required.」とアラートメッセージが表示されます。

公式ドキュメントバリデーション(https://readouble.com/laravel/5.7/ja/validation.html)のページ中段にあるエラーメッセージのカスタマイズを実装します。
public function rulesの下、overrideするメッセージを書きます。
適当に日本語で、「会社名を入力してください」「代理店名を入力してください」としておきましょう。

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class CompanyRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'company_name' => 'required',
            'agent_name' => 'required',
        ];
    }
    public function messages()
    {
        return [
            'company_name.required' => '会社名を入力してください',
            'agent_name.required' => '代理店名を入力してください',
        ];
    }
}

日本語で表示されるようになりました。

おお、割と簡単だった。

Laravelアプリケーション開発の進め方

どのような流れで開発していけばいいか。DBのテーブル、モデル、フロントは出来ている前提。

1. make artisanでControllerページ作成
2. Controllerにfunctionを書く
3. Routingを設定
4. Controllerに処理を書く
5. Viewを書く
6. バリデーション

つまり、Controllerをつくって、routingして、Viewを書いて、Controllerの処理を編集していく。

あ、小俣さんの会社も上のようなホワイトボードにcontrollerの流れを書いてた。。

Laravel5.7 ControllerからMySQLへupdate, delete

DB::updateで、update文を書けばOKです。

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Account;

class AccountController extends Controller
{
    //
    public function index()
    {
    	// $account = Account::first();
    	// dd($account->login_id);
    	DB::update('update account set login_id = "adminUser" where id = ?', ['1']); 	
    }
}

deleteの場合

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Account;

class AccountController extends Controller
{
    //
    public function index()
    {
    	// $account = Account::first();
    	// dd($account->login_id);
    	DB::delete('delete from account where id = ?', ['2']); 	
    }
}

Laravel5.7 ControllerからMySQLへレコードインサート

公式ドキュメントにならって、Controllerから接続しているDBにinsertしたいと思います。

公式ドキュメントhttps://readouble.com/laravel/5.7/ja/database.html

AccountController.phpからaccount tableに入れたいと思います。Http\RequestとApp\Accouontは特に使っていませんmm

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Account;

class AccountController extends Controller
{
    //
    public function index()
    {
    	// $account = Account::first();
    	// dd($account->login_id);
    	DB::insert('insert into account(login_id, company_id) values(?, ?)', ['user1', 0001]);		
    }
}

mysql側でinsertされているか確認します。

入っているようです。OKかな。次は、recordをdeleteしたいと思います。

Laravel5.7でコントローラーからモデルの呼び出し

大まかな流れです。Controllerからのモデルの呼び出しは、Controllerでモデルを引っ張てくればいいだけです。

1. SeederでMySQLにデータを入れる
2. MySQLにデータが入っているか確認する
3. Controllerを作成する
4. Routingで作成したコントローラーの設定をする
5. Controllerでモデルを呼び出す
6. Viewの確認

Controllerの作成から見てみましょう。
1. php artisan make:controllerでコントローラーを作成する
AccountControllerをつくります。

[vagrant@localhost zeus]$ php artisan make:controller AccountController
Controller created successfully.

するとapp/Http/Controllers 配下にAccountController.phpが作成されます。
AccountController.phpの中身は以下の通りです。後程、モデルを呼び出す際に編集していきます。

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class AccountController extends Controller
{
    //
}

2. Routingで作成したコントローラーの設定をする
routes/web.phpを編集していきます。ホーム(“/”)にGetリクエストがあった場合に、AccountController@indexを呼び出すよう書きます。

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

// Route::get('/', function () {
//     return view('welcome');
// });
Route::get('/', 'AccountController@index');

3. Controllerでモデルを呼び出す
まず、use App\Accountで、Accountモデルを呼び出すと定義し、Account::first();を変数に格納します。$account->login_idで呼び出します。

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Account;

class AccountController extends Controller
{
    //
    public function index()
    {
    	$account = Account::first();

    	dd($account->login_id);
    }
}

4. php artisan serveでサーバーを立てます
[vagrant@localhost zeus]$ php artisan serve –host=192.168.35.10
Laravel development server started:

5. viewで確認する
ブラウザでhttp://192.168.35.10:8000/にアクセスする
mysqlからデータをひっぱてきています。

OK!
テーブルごとにモデルを作る必要があるか。

Laravel5.7でClass ${class_name} does not exist

コマンドラインでシーダーを実行しようとすると、Class ${class_name} does not existのエラーが出た時の対処法。

[vagrant@localhost zeus]$ php artisan db:seed
Seeding: AccountTableSeeder

   ReflectionException  : Class AccountTableSeeder does not exist

  at /home/vagrant/local/zeus/vendor/laravel/framework/src/Illuminate/Container/Container.php:779
    775|         if ($concrete instanceof Closure) {
    776|             return $concrete($this, $this->getLastParameterOverride());
    777|         }
    778|
  > 779|         $reflector = new ReflectionClass($concrete);
    780|
    781|         // If the type is not instantiable, the developer is attempting to resolve
    782|         // an abstract type such as an Interface of Abstract Class and there is
    783|         // no binding registered for the abstractions so we need to bail out.

  Exception trace:

  1   ReflectionClass::__construct("AccountTableSeeder")
      /home/vagrant/local/zeus/vendor/laravel/framework/src/Illuminate/Container/Container.php:779

  2   Illuminate\Container\Container::build("AccountTableSeeder")
      /home/vagrant/local/zeus/vendor/laravel/framework/src/Illuminate/Container/Container.php:658

  Please use the argument -v to see more details.

1.DatabaseSeeder.phpと読み込むclassが存在するか確認する

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call([
		AccountTableSeeder::class,
	 ]);
    }
}
use Illuminate\Database\Seeder;

class AccountTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        //
        DB::table('account')->insert([
            'login_id' => str_random(10),
            'company_id' => '001',
        ]);
        //
    }
}

問題ない。何故だ?

composer dump-autoload で直る
コマンドラインでたたきます。

[vagrant@localhost zeus]$ php composer.phar dump-autoload
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover
Discovered Package: beyondcode/laravel-dump-server
Discovered Package: fideloper/proxy
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.

改めてphp artisan db:seedとすると、今度は上手くいくのがわかります。

[vagrant@localhost zeus]$ php artisan db:seed
Seeding: AccountTableSeeder
Database seeding completed successfully.

Good Job!

Laravel5.7のseeder

シーダー?
シーザーサラダのことでしょうか? シャキシャキした機能?

とりあえず公式ドキュメントを見てみます。
https://readouble.com/laravel/5.7/ja/seeding.html
「テストデーターをデーターベースに設定するシンプルな方法」と記載があります。なるほど、seed(種)から派生しているのです。それならseedと言ってくれればいいのに。。

それはさておき、/database/seeds/ 配下に設置されます。

シーダークラスの定義
make:seeder tablenameでAccountTableをつくります。

$ php artisan make:seeder AccountTableSeeder
Seeder created successfully.

make:seederでAccountTableSeeder.phpが作られたので、中のソースコードを見てみます。

runの部分で挿入するテーブルを指定して、レコードをinsertしてきます。

use Illuminate\Database\Seeder;
class AccountTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        //
    }
}

thinkerもあるので、seederを使うメリットがイマイチわかりません。

public function run()
    {
    	DB:table('account')->insert([
    		'login_id' => str_random(10),
    		'company_id' => ''

    	]);
        //
    }

シーダの実行
[vagrant@localhost zeus]$ php artisan db:seed
Database seeding completed successfully.

mysqlでデータを見てみます。

select * from account で見ても、empty set。何故だ?

Laravel5.7でモデル(model)を使ったデータベース操作

Laravel5.7でモデル(model)を使ったデータベース操作をやりたいと思います。Laravelではモデルを通してDBのデータ操作を行います。なお、DBとモデルオブジェクトを対応付ける機能をEloquentという。

php artisan make:model によるmodelの作成
ドキュメントを斜め読みしていましたが、一向に理解が深まらないので、まずmodelを作ってみます。Accountというモデルを作成します。

php artisan make:model ${model_name}

[vagrant@localhost zeus]$ php artisan make:model Account
Model created successfully.

すると、appディレクトリ配下に${model_name}.phpが作られます。