【自分用メモ】Laravel 7.30.4 新規開発時の準備でいつもやってることメモ

2023年4月11日

どんな記事?

何度かLaravelでシステムを開発する機会があったのに慣れない事ばかりで毎回苦戦していたので速攻準備出来るようにメモを残しておく。

目的

Laravel開発の時に何度も環境が変わることが想定されるのでその都度準備を素早く出来るようにこの記事を書きます。
また、何もわからない初心者でもなんとなく動くような設計にする予定です。
全然わかんねえよって人はコメントください。

下準備

Laravelのインストール

https://getcomposer.org/
Composerがインストールされていることが前提です。
インストール方法はWindowsの場合はダウンロードしてインストールするだけです。
Linux系の人の場合は
https://bistro.site/post-2439/#toc_id_2
こっちに書きましたのでよろしくお願いします。

Composerが手に入ったら
プロジェクトのディレクトリを作成したいディレクトリに移動して

composer create-project --prefer-dist laravel/laravel blog

通常このようにしてインストールします。
後は待っているだけでディレクトリが出来ます。

参考:Laravel7.xのインストール

インストールが成功したら

php artisan serve

でローカルサーバーを立ち上げます。

通常
[code]
Laravel development server started: http://127.0.0.1:8000
[/code]
のような表示が出て
http://127.0.0.1:8000/
にアクセスすると

こんな画面が出ます。
これが出たら成功です。

各種設定

データベースの作成

Windowsの方でXAMMP使ってる方・Linux系の方は
http://localhost/phpmyadmin/
にアクセスします。
Linuxの方はLAMP環境とか整えてください。
わからない方は↓こちら
https://bistro.site/post-2435/
データベースを作成したら.envの設定に移ります。

この記事では"bistrodb"という名前のデータベースを作成したことにします。

日本語と時間の指定

先に日本で使う場合の設定をしておきます。config/app.phpを編集します。

'timezone' => 'Asia/Tokyo',
'locale' => 'ja',

.envの設定

.envというファイルがプロジェクトのルートディレクトリにあるかと思います。

これを編集します。

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=データベース名を入力します。
DB_USERNAME=データベースのユーザー名を入力します
DB_PASSWORD=データベースのユーザーのパスワードをここに入力します

つまり

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=bistrodb
DB_USERNAME=bistro
DB_PASSWORD=bistropassword

こんな感じになります。

その後おまじないをかけておきます。
Laravel では .env ファイルに環境設定を等を記述し、
PHPから利用することになります。
キャッシュに .env の内容を保持しているため.envを書き換えてもPHP側に反映されない場合があるので
キャッシュを削除するためのコマンドをプロジェクト内のルートディレクトリでターミナルを開き

php artisan config:cache

をしておくと確実です。

データベースに接続する場合

基本時にターミナルでDB弄らないんですよねえって方は読み飛ばしです。

php artisan tinker

で接続できます。
ここまでの手順でこの辺でエラーが出ることは特殊な環境でない限りあまりないと思います。
ここでエラーが出る場合おそらく.envがちゃんと設定されていない。

もうダメだ.env設定ちゃんとしてるのに全然動かねえわって方は
プロジェクト内のルートディレクトリで

composer install

を行ってください。何故か動くことがほとんどです。
これについてはまだ知識が無い為、試してみて毎回ちゃんと動いたって経験談です。

DBのマイグレーション準備

まずマイグレーションってなんだよって話ですが、

マイグレーションとはデータベースのバージョンコントロールのような機能です。 アプリケーションデータベースのスキーマの更新をチームで簡単に共有できるようにしてくれます。 マイグレーションは基本的にLaravelのスキーマビルダとペアで使い、アプリケーションのデータベーススキーマの作成を楽にしてくれます。

何言ってるかわかりませんね。

要するに

  • 複数人で開発する際、コマンドひとつでDBの設定をみんな同じ状態にできる
  • DBのカラム変更等を手動ですると本来は残らない設定変更の履歴が、コードで残る

というメリットが有るため、DBの構造をコードで管理する、という方法です。

初めてデータベースを構築する場合や、
データベース構造を変更したくなった時にマイグレーションファイルを記述します。
マイグレーションファイルにはデータベースの構造を記述します。
データベースの構造を変更する場合もをどうやって変更するかを記述します。
これを利用することで数カ月後忘れている状態で見たときやチームで作る時に混乱を防ぐ事が出来ます。

絶対にマイグレーションファイルを使わなくてはいけないわけではないですが、
使うと便利です。面倒ですが勉強しましょう。
絶対に使わないという強い意志を持った方は読み飛ばし。

app/Providers/AppServiceProvider.phpに下のような部分があるので書き直します。

public function boot()
{
//
}

public function boot()
{
\Schema::defaultStringLength(191);
}

理由

文字列の最大文字数を191文字にしておかないとマイグレーション時にエラーになるようです。

DBのマイグレーション

マイグレーションファイルは /database/migrations/ に予め準備されています。
中を覗いてみると

<?php</p>
<p>use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;</p>
<p>class CreateUsersTable extends Migration
{
/**</p>
<ul>
<li>Run the migrations.</li>
<li>
</li>
<li>
<p>@return void
*/
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}</p>
<p>/**</p>
</li>
<li>Reverse the migrations.</li>
<li>
</li>
<li>@return void
*/
public function down()
{
Schema::dropIfExists('users');
}
}

のようなものが入っています。
これはusersというテーブルを作ってid,name.email,email_verified_at,password,remember_token,created_at,updated_atというカラムを作りますよー
という記述です。
なんとなく読んで見ればわかると思いますので割愛します。

早速マイグレーションしてみましょう。テーブルが出来るはずです。

php artisan migrate

データを作成する場合

Usersテーブルが出来たのでこの中にサンプルユーザーを作りたい場合もあると思います。
作りたくないよって人は読み飛ばし。

Seederの準備

Seederはその名の通り種ですね。

php artisan make:seeder UserSeeder

これでSeederが準備できます。
/database/seeds/ に
UserSeeder.phpが生成されたと思います。
中身はこんな感じ

<?php</p>
<p>use Illuminate\Database\Seeder;</p>
<p>class UserSeeder extends Seeder
{
/**</p>
<ul>
<li>Run the database seeds.</li>
<li>
</li>
<li>@return void
*/
public function run()
{
//
}
}

これを書き換えます。

<?php</li>
</ul>
<p>use Illuminate\Database\Seeder;</p>
<p>class UserSeeder extends Seeder
{
/**</p>
<ul>
<li>Run the database seeds.</li>
<li>
</li>
<li>@return void
*/
public function run()
{
DB::table('users')->insert([
'name' => 'test',
'email' => 'test@test.test',
'password' => bcrypt('test')
]);
}
}</li>
</ul>
<p>

名前 : test
email : test@test.test
パスワード : test

で作成します。
パスワードはハッシュ化されますのでデータベースにはハッシュ化された文字列が入ります。

また、同ディレクトリ内に DatabaseSeeder.php というものがあると思います。
中身は

<?php</p>
<p>use Illuminate\Database\Seeder;</p>
<p>class DatabaseSeeder extends Seeder
{
/**</p>
<ul>
<li>Seed the application's database.</li>
<li>
</li>
<li>@return void
*/
public function run()
{
// $this->call(UserSeeder::class);
}
}</li>
</ul>
<p>

となっていますので書き換え。

<?php</p>
<p>use Illuminate\Database\Seeder;</p>
<p>class DatabaseSeeder extends Seeder
{
/**</p>
<ul>
<li>Seed the application's database.</li>
<li>
</li>
<li>@return void
*/
public function run()
{
$this->call(UserSeeder::class);
}
}</li>
</ul>
<p>

$this->call(UserSeeder::class);のコメントアウトを外します。
これで準備完了です。

サンプルデータを入れる

php artisan db:seed --class=UserSeeder

Usersテーブルにデータが入ってのが確認出来たら成功です。
ここまで準備できたら開発に取りかかれます。

データベースの操作

マイグレーションファイルの追加

データベースを操作するのにマイグレーションファイルを使うとスムーズ、というか記録が残ることで沢山のメリットがあることがわかりました。
Git管理する場合も楽だしね。

ユーザーに権限を付与することはよくあるパターンなのでここではその作業をメモしたいと思います。

マイグレーションファイルを追加するには

Usersテーブルに権限(ロールと呼びます)を追加するので、ターミナルから

php artisan make:migration add_column_role_users_table --table=users

とします。

/database/migrations/ に 2021_08_19_094806_add_column_role_users_table.php のようなファイルが追加されます。
ここに追加分を記述していきます。
中身は

<?php</p>
<p>use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;</p>
<p>class AddColumnRoleUsersTable extends Migration
{
/**</p>
<ul>
<li>Run the migrations.</li>
<li>
</li>
<li>
<p>@return void
*/
public function up()
{
Schema::table('users', function (Blueprint $table) {
//
});
}</p>
<p>/**</p>
</li>
<li>Reverse the migrations.</li>
<li>
</li>
<li>@return void
*/
public function down()
{
Schema::table('users', function (Blueprint $table) {
//
});
}
}</li>
</ul>
<p>

のようになっているので

<?php</p>
<p>use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;</p>
<p>class AddColumnRoleUsersTable extends Migration
{
/**</p>
<ul>
<li>Run the migrations.</li>
<li>
</li>
<li>
<p>@return void
*/
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->tinyInteger('role')->default(0)->after('password')->index('index_role')->comment('ロール');
});
}</p>
<p>/**</p>
</li>
<li>Reverse the migrations.</li>
<li>
</li>
<li>@return void
*/
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('role');
});
}
}</li>
</ul>
<p>

のように追記します。

up()とdown()両方に追記されています。
upメソッドは マイグレート(php artisan migrate)の時の処理、
downメソッドは ロールバック(php artisan migrate:rollback)の時の処理です。

up()に記述したのは意味は”カラム名「role」をTINYINT型でpasswordカラムの後に追加してインデックスを付与する。”です。

実際に追加してみる

ルートディレクトリをターミナルで開いたら

php artisan migrate

とします。

$ php artisan migrate
Migrating: 2021_08_19_094806_add_column_role_users_table
Migrated:  2021_08_19_094806_add_column_role_users_table (0.03 seconds)

となるはずです。

ロールが追加されました。

権限(ロール)の設定

下準備

下準備せずにロールを設定しようとすると

RuntimeException
In order to use the Auth::routes() method, please install the laravel/ui package.

というエラーが出ると思うので
まずはlaravel/ui packageをインストールします。

これはLaravelの認証機能uiです。

composer require laravel/ui

Package manifest generated successfully. と表示されたらOKです。

Package phpunit/php-token-stream is abandoned, you should avoid using it. No replacement was suggested.

と出る場合はPHPUnit9に更新する必要があります。
今回はちょっと無視します。

vueの追加

php artisan ui vue --auth

Vue scaffolding installed successfully. と表示されたらOKです。

npmのインストール

npmから不足するパッケージをインストールします。

npm install
npm run dev

これで下準備は整いました。

ロールの追加

/App/Providers/AuthServiceProvider.php を開きます。
中身は、

<?php</p>
<p>namespace App\Providers;</p>
<p>use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Gate;</p>
<p>class AuthServiceProvider extends ServiceProvider
{
/**</p>
<ul>
<li>The policy mappings for the application.</li>
<li>
</li>
<li>
<p>@var array
*/
protected $policies = [
// 'App\Model' => 'App\Policies\ModelPolicy',
];</p>
<p>/**</p>
</li>
<li>Register any authentication / authorization services.</li>
<li>
</li>
<li>
<p>@return void
*/
public function boot()
{
$this->registerPolicies();</p>
<pre><code>//</code></pre>
<p>}
}</p>
</li>
</ul>
<p>

となっています。
'App\Model’ => 'App\Policies\ModelPolicy’, のコメントアウトを外します。
また、

<?php</p>
<p>namespace App\Providers;</p>
<p>use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Gate;</p>
<p>class AuthServiceProvider extends ServiceProvider
{
/**</p>
<ul>
<li>The policy mappings for the application.</li>
<li>
</li>
<li>
<p>@var array
*/
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
];</p>
<p>/**</p>
</li>
<li>Register any authentication / authorization services.</li>
<li>
</li>
<li>
<p>@return void
*/
public function boot()
{
$this->registerPolicies();</p>
<pre><code>// 開発者のみ許可
Gate::define('system-only', function ($user) {
    return ($user-&gt;role == 1);
});
// 管理者以上(管理者&システム管理者)に許可
Gate::define('admin-higher', function ($user) {
    return ($user-&gt;role &gt; 0 &amp;&amp; $user-&gt;role &lt;= 5);
});
// 一般ユーザ以上(全ロール)に許可
Gate::define('user-higher', function ($user) {
    return ($user-&gt;role &gt; 0 &amp;&amp; $user-&gt;role &lt;= 10);
});</code></pre>
<p>}
}</p>
</li>
</ul>
<p>

のように追記します。

403エラーページの作成

ロール制限がかかった場合403エラーページに遷移します。

このページはまだ作成されていませんので追加しておきます。
/resources/views/errors/403.blade.php を手動で作成します。
中身を

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>403 Forbidden</title>
<style>
.error-wrap {
padding: 5px 20px;
border: 1px solid #dcdcdc;
display: inline-block;
box-shadow: 0px 0px 8px #dcdcdc;
}
h1 { font-size: 18px; }
p { margin-left: 10px; }
</style>
</head>
<body>
<div class="error-wrap">
<section>
<h1>403 Forbidden</h1>
<p>You do not have access.</p>
</section>
</div>
</body>
</html>

のようにしておけば問題無いかと思います。

権限で表示/非表示を設定する

@can('system-only')
{{-- ここはシステム管理者権限のみに表示されます --}}
@elsecan('admin-higher')
{{-- ここは管理者権限以上に表示されます --}}
@elsecan('user-higher')
{{-- ここは全権限に表示されます --}}
@endcan

のように切り分けが可能になりました。

bladeに書き込んで動作テスト

welcome.blade.phpに

<div class="content">
@can('system-only')
システム管理者でログインしています。
@elsecan('admin-higher') 
管理者でログインしています。
@elsecan('user-higher')
一般ユーザーでログインしています。
@endcan
</div>

等、記述して動作確認を行います。
データベースの「role」の数値を色々変えて試してみましょう。

Controllerの作成

コントローラーを作成するにはルートディレクトリでターミナルから

php artisan make:controller AdminController

のようにコマンドを打ちます。
Controller created successfully.
と表示されれば成功です。

/app/Http/Controllers に、AdminController.phpが生成されたはずです。
中身は、

<?php</p>
<p>namespace App\Http\Controllers;</p>
<p>use Illuminate\Http\Request;</p>
<p>class AdminController extends Controller
{
//
}</p>
<p>

のようになっています。

<?php</p>
<p>namespace App\Http\Controllers;</p>
<p>use Illuminate\Http\Request;</p>
<p>class AdminController extends Controller
{
public function index()
{
return view('admin.index');
}
}

のように変更するとhttp://127.0.0.1:8000/admin/で表示するための準備ができます。

Viewの作成

/resources/views/admin/index.blade.php を手動で作成します。

@extends('layouts/app')
@section('title','管理者:')
@section('content')
<h1>管理者ページ</h1>
<p>ここは管理者ページです</p>
@endsection

のようにします。

Routeの作成

/routes/web.php を開きます。

use App\Http\Controllers\AdminController;
Route::get('admin/', 'AdminController@index');

のように記述します。
※追記 Laravel8以上だと上のコードは動きません。Target class [AdminController] does not exist.になります。
Laravel8 は “class@method" の文字列形式を受け入れなくなりました。

<?php</p>
<p>use Illuminate\Support\Facades\Route;
use App\Http\Controllers\AdminController;</p>
<table>
<thead>
<tr>
<th>/*</th>
<th>--------------------------------------------------------------------------</th>
<th>Web Routes</th>
</tr>
</thead>
<tbody>
<tr>
</tr>
<tr>
<td>Here is where you can register web routes for your application. These</td>
</tr>
<tr>
<td>routes are loaded by the RouteServiceProvider within a group which</td>
</tr>
<tr>
<td>contains the "web" middleware group. Now create something great!</td>
</tr>
<tr>
</tr>
</tbody>
</table>
<p>*/</p>
<p>Route::get('/', function () {
return view('welcome');
});</p>
<p>Route::get('admin/', [AdminController::class,'index']);

のようにする必要があります。
RouteServiceProvider.phpファイルからデフォルトの名前空間を削除されたようです。

あと、@extends('layouts/app’)でlayoutを読み込んでいますが、
存在しないので読み込めなくなっていました。

ここまで準備ができたら
http://127.0.0.1:8000/admin/ で表示できます。

続きはLaravel8の記事で。

Laravel

Posted by bistro