Laravel7をComposerでインストールおよび初期設定

事前条件

Git Bashなどコマンドラインツールを使えるようにしておく。
2021年1月現在、Windowsなら開発環境はxamppにしておくことが無難。 下手にDockerに手を出すと莫大な時間を犠牲にする。安定したDocker設定ができるまで当分待ったほうがいいかも。 昨今増えているmacユーザーとは敵対することにはなるが。
mysqlにてプロジェクトのデータベースを先に作成しておく。(下記の例ではred_bookデータベースを作成)

手順

  1. php.iniをテキストエディタで開き、「;」を外して「extension=php_intl.dll」を有効にする。
  2. コマンドラインツールを立ち上げ、プロジェクトのルートへ移動する。
    $ cd ~/git/red_book
  3. Windows環境でGit bashのターミナルを使うとttyなんとかのエラーが出るため、それ防止用に下記コマンドを実行。
    $ exec winpty bash

    composer.pharをダウンロードする
    $ php -r "readfile('https://getcomposer.org/installer');" | php
  4. Laravel7をルートのディレクトリにダウンロードする。
    $ php composer.phar create-project "laravel/laravel=7.*" dev
  5. 「http://localhost/red_book/dev/public/」にアクセスし、下記のようなLaravelのページが表示されたらとりあえずOK.
  6. artisanコマンドが使えるか試しに動かしてみる。
    $ cd ~/git/red_book/dev
    $ php artisan list
  7. DB接続設定 .envファイルにてDB接続設定をする。

    .env

    ~ 略 ~
    DB_CONNECTION=mysql
    DB_HOST=127.0.0.1
    DB_PORT=3306
    DB_DATABASE=red_book
    DB_USERNAME=root
    DB_PASSWORD=
    ~ 略 ~
    			
  8. artisanコマンドでDB接続確認
    「$ php artisan tinker」を押してPHPプログラムをお試し実行できる状態にする。
    「DB::select('select 1');」を動かしてみて正常なレスポンスがでたらDB接続設定は上手くいっている。
    キーボードの「q」を押すと、お試し実行状態を解除できる。
  9. とりあえずここまでやれば、最低限の開発環境は整う。
    終わり。

Laravelの定数

「ホーム/config」ディレクトリにconst.phpを作成。
const.phpに定数を記述する。

const.php

	<?php
	return [
			'TEST_PATH' => '大きな猫と小さな犬',
			'TEST_LIST' => ['猫','ネズミ','ウシ'],
	];
	

コントローラにて定数を呼び出す

	class NekoController extends Controller
	{
	
		public function index(){
			$data = ['neko'=>'猫', 'yagi'=>'山羊'];
			
			echo '<pre>';
			echo config('const.TEST_PATH');
			echo '<br>';
			var_dump(config('const.TEST_LIST'));
			echo '</pre>';
	

出力

	大きな猫と小さな犬
	array(3) {
	  [0]=>
	  string(3) "猫"
	  [1]=>
	  string(9) "ネズミ"
	  [2]=>
	  string(6) "ウシ"
	}
	

各種パスを取得する | ルートURL | 基本URL

関数説明
url()->current();現在のURLを取得する。ただし、クエリは含まない。
$full_url = url()->full();クエリを含めた現在のURLを取得する
$root_url = url()->to('/');ルートURLを取得する。ドメイン名とスキームの部分を含む。
$rootPath = request()->getPathInfo();ドメイン名とスキームの部分を含まないルートURLを取得する
app_path()appディレクトリのパス 例:Windowsのローカル環境の場合→ C:\Users\user\git\animal\public
base_path()ホームのパス(ルートパス)
config_path()configディレクトリのパス
database_path()databaseディレクトリのパス
public_path()publicディレクトリのパス
resource_path()resourcesディレクトリのパス
storage_path()storageディレクトリのパス

Laravel7に「$this->beforeFilter(...)」がないことに対する考察

Laravel7にて、コントローラに事前処理である「$this->beforeFilter(...)」を組み込もうとしたらエラーになった。
継承元のController.phpを調べてもbeforeFilterメソッドは存在しない。 Controller.phpはBaseControllerを継承しているが、BaseController.phpクラスファイル自体が存在しない。 必要なら自前でBaseController.phpとbeforeFilterメソッドを用意するということらしい。 こうした仕様は、恐らく、各所に見られると思われる。

//class NekoController extends Controller 
class NekoController // → 「Controller」を継承しなくても動作する
{

ダンプ dump() | デバッグ

dump('XXX');
「var_dump()」と同じ感覚で利用できる。dump関数での出力は色分けされているので見やすい。
もちろん、配列のダンプも可。


ログ出力 info()

info関数でログ出力ができる。
info('Hello World!');

出力先の場所とログファイルは以下の通り
ルート/storage/logs/laravel.log

ログ出力、日付ごとに

ルート/.envファイルを開き、下記のように修正する。

変更前(デフォルト)
LOG_CHANNEL=stack

変更後
LOG_CHANNEL=daily

適当なソースコード中で「info('今日の猫はいかがでしょう');」と記述して実行すると、下記のログファイルが作成され、そこにログが出力される。
/storage/logs/laravel-2020-11-09.log
[2020-11-09 15:25:21] local.INFO: 今日の猫はいかがでしょう  

他にslackへの出力などいくつかの設定などができる。
参考:Laravel 7.x ログ


Laravelのモデル

Laravelのモデルに対する考え方

「開発者ごとにモデルに対する考えは異なる」という理由から、Modelsディレクトリは用意されていない。 必要なら自分でModelsディレクトリを用意してもいいし、別のディレクトリ名を付けてもいい。 Laravelはモデルについて型を厳密に定めておらず、それぞれの開発者に任せているようだ。 Laravel7の場合、デフォルトでのモデルクラスの置き場所は、appディレクトリの直下になっている。

モデルの基本仕様

モデル名(クラス名)はテーブル名と紐づいている。(例 モデル名:BigYagi() → テーブル名:big_yagis)
モデルクラスのメンバにて明示的にテーブル名と紐づけることも可能。
protected $table = 'xxx_yagis';

CakePHPと同様、主キーの概念がある。主キーはデフォルトでidフィールド(カラム)になっている。(idは整数)
主キーはオートインクリメントという扱いになっている(設定でOFFにもできる。$incrementing)
モデルクラスのメンバにて明示的に主キーのフィールドを指定することも可能
protected $primaryKey = 'yagi_id';

artisanコマンドでモデルを作成

$ php artisan make:model RedCat
上記のコマンドを実行するとappディレクトリの直下にRedCat.phpモデルクラスファイルが作成される。

ディレクトリを指定しながらartisanコマンドでモデルを作成

$ php artisan make:model Models/RedCat
appディレクトリにModelsフォルダが作成され、その中にRedCat.phpモデルクラスファイルが作成される。

例:作成されたモデルクラスのソースコード


	<?php
	
	namespace App;
	
	use Illuminate\Database\Eloquent\Model;
	
	class RedCat extends Model
	{
	    //
	}
	

コントローラからモデルを使う

<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\RedCat;

class NekoController
{
	public function index(){
		$md = new RedCat();
	

モデルをテーブルと関連付ける

namespace App¥Models;

use Illuminate¥Database¥Eloquent¥Model;

class Neko extends Model
{
	protected $table = 'nekos'; // 紐づけるテーブル名
	protected $guarded = ['id']; // 予期せぬ代入をガード。 通常、主キーフィールドや、パスワードフィールドなどが指定される。
	public $timestamps = false; // タイムスタンプ。 trueならcreated_atフィールド、updated_atフィールドに適用される。(それ以外のフィールドを設定で指定可)
	
	public function getData(){

		$query = ¥DB::table($this->table);
		$query->where('id', 4);
		$data = $query->get();
		
		dump($data); // ダンプ
		return $data;
	}
}
	

DB: WHEREの基本


$users = DB::table('users')
                ->where('votes', '>=', 100)
                ->get();

$users = DB::table('users')
                ->where('votes', '<>', 100)
                ->get();

$users = DB::table('users')
                ->where('name', 'like', 'T%')
                ->get();
	
公式ドキュメントより抜粋

DB: IN句


	$data = ¥DB::table('nekos')
		->whereIn('id', [1, 2, 3, 4])
		->get();
	

DB: NOT IN句 | whereNotIn


		$data = ¥DB::table('nekos')
			->whereNotIn('neko_name', ['buta', 'ゴボウ', 'ハマダイコン'])
			->get();
	
上記のクエリビルダで作成されたSQL
select * from `nekos` where `neko_name` not in (?, ?, ?)