20200515のlaravelに関する記事は13件です。

MacでのLaravel6の環境構築でエラーが起こった件

Laravelのインストールコマンドでエラーが起こった

Composerの準備をこちらの記事の手順で完了した後、
下記のLaravelのインストールをコマンドを実行。

$ composer global require laravel/installer

すると、下記のエラーが発生しました。

Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - laravel/installer v3.0.0 requires ext-zip * -> it is missing from your system. Install or enable PHP's zip extension.
    - laravel/installer v3.0.1 requires ext-zip * -> it is missing from your system. Install or enable PHP's zip extension.
    - Root composer.json requires laravel/installer ^3.0 -> satisfiable by laravel/installer[v3.0.1, v3.0.0].

You are using a snapshot build of Composer 2, which may be the cause of the problem. Run `composer self-update --stable` and then try again. In case it solves the problem, please report an issue mentioning Composer 2.

Installation failed, deleting ./composer.json.

スクリーンショット 2020-05-15 20.44.15.jpg

原因

エラー文から「ext-zip」というものが足りていないということがわかった。
試行錯誤して調べるうちに、HomebrewでPHPがインストールできていない可能性が浮上した。

試したこと

そこで、下記のコマンドでHomebrewでのPHP7.4のインストールを実行。

$ brew install php@7.4

このコマンド完了は5分程かかりました。
その後、再度下記のLaravelのインストールをコマンドを実行。

$ composer global require laravel/installer

すると、以下のようにうまくインストールできました。
この前後の環境構築に関してはこちらの記事をにまとめてあるので是非参考にしてください。

スクリーンショット 2020-05-15 21.28.22.jpg

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MacでのLaravel6の環境構築の手順

目的

  • 学習の記録のため。
  • 環境構築で少し苦戦したため。

環境構築の手順

  1. PHPのパッケージ管理プログラム「Composer」のインストール
  2. Laravelをインストールする(ここで少し苦戦した)
  3. プロジェクトを作成する

PHPのパッケージ管理プログラム「Composer」のインストール

Laraveではプログラミングをダウンロードしてインストールするのではなく
PHPのパッケージ管理プログラム「Composer」というものを利用する。

以下のリンクからcomposerのファイルを直接ダウンロードして配置する。
https://getcomposer.org/download/

Latest Snapshot をクリックすると
「ダウンロード」フォルダに「composer.phar」というファイルがダウンロードされる。

スクリーンショット 2020-05-15 16.07.25.jpg

スクリーンショット 2020-05-15 16.33.07.jpg

次にターミナルを起動。
ダウンロードフォルダに移動し/user/local/binに配置する。

$ cd ~/Downloads
$ sudo mv composer.phar /usr/local/bin/composer

パスワードを求められるので入力する。
composer.pharが/usr/local/bin/内にcomposerという名前で移動するコマンド。
これでいつでもcomposerが呼び出し可能になる。

最後にcomposerのパーミション(アクセス権)を設定する。

$ chmod a+x /usr/local/bin/composer

これで、composerが実行できるようになり、composerの準備は完了。

$ composer -V
Composer version 2.0-dev

上記のようになっていれば正常にインストールできている。

Laravelをインストールする

ターミナルを起動し以下を実行する。

$ composer global require laravel/installer

うまくいけばこれでLaravelがインストールされる。
下記エラーが出た場合はこちらの記事を参考にしてください。
スクリーンショット 2020-05-15 20.44.15.jpg

環境変数PATHの設定

環境変数PATHにインストールの場所を追記しないとLaravelのコマンドが使えない。
そこで、以下のコマンドを実行。

$ echo "export PATH=~/.composer/vendor/bin:$PATH" >> ~/.bash_profile
$ source ~/.bash_profile

すると、Laravelがコマンドとして認識されるようになる。

プロジェクトを作成する

アプリを作成するディレクトリに移動し以下のコマンドを実行する。

$ laravel new プロジェクト名

その後、以下のように作成したプロジェクトに移動しサーバーを起動するコマンドを実行。

$ cd プロジェクト名/
$ php artisan serve
Laravel development server started: http://127.0.0.1:8000

ここまで完了して、
http://localhost:8000/
にアクセスすると以下のようにLaravelのトップページが表示される。

Ctrlキー + 「C」 を押すとサーバーを停止できる。
以上で環境構築は完了です。
スクリーンショット 2020-05-15 22.02.52.jpg

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel7 auth ユーザー登録 まとめ

環境

macOS (10.15.4)

Laravel 7.10.2
PHP 7.4.2
MySQL 5.7.26
Apache 2.2.34

はじめに

laravelのauth認証を用いて、usersテーブルから私が作成したaccountsテーブルでの認証に変更しようと試みたら結構ハマったのでまとめておく。

デフォルト機能

laravel7ではまず、laravel/uiをインストールする必要がある。そして、用意されている認証機能を作成する。

composer require laravel/ui
php artisan ui vue --auth

accountsテーブル

私が認証に利用したテーブルを以下に示す。
スクリーンショット 2020-05-15 8.54.55.png

初めに作成したaccountsテーブルにはremember_tokenカラムのデフォルト値を用意していなかったので、新しくマイグレーションファイルを作成して変更しようとしたところ,
php artisan migrate が実行されないエラーが生じた。

原因を調べてみると、composer で “doctrine/dbal” パッケージを追加する必要があるらしい。そのため、以下のコマンドを実行した。

composer require doctrine/dbal

これで、migrateでカラムの型を変更することができた。

auth.phpの修正

accountsテーブルで認証するために、いくつか追記、修正する必要がある。

<?php

return [

    'defaults' => [
        'guard' => 'web',
        'passwords' => 'accounts',
    ],

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'accounts',
        ],

        'api' => [
            'driver' => 'token',
            'provider' => 'accounts',
            'hash' => false,
        ],
    ],

    'providers' => [
        'accounts' => [
            'driver' => 'eloquent',
            'model' => App\Models\Account::class,
        ],

        // 'users' => [
        //     'driver' => 'database',
        //     'table' => 'users',
        // ],
    ],

    'passwords' => [
        'users' => [
            'provider' => 'users',
            'table' => 'password_resets',
            'expire' => 60,
            'throttle' => 60,
        ],
        'accounts' => [
            'provider' => 'accounts',
            'table' => 'password_resets',
            'expire' => 60,
            'throttle' => 60,
        ],
    ],

    'password_timeout' => 10800,

];

Modelの修正

次にModelの修正をした。追加するカラムだけ追加する必要がある。

<?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\user as Authenticatable;
use Illuminate\Notifications\Notifiable;

class Account extends Authenticatable
{
    //
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     * 
     * @var array
     */
    protected $fillable = [
        'name',
        'email', 
        'password',
        'register_date',
        'delete_date',
        'delete_fg',
    ];



    /**
     * The attributes that should be hidden for arrays.
     * 
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     * 
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

}

Controllerの修正

AuthディレクトリのRegisterControllerの中を以下のように修正する。インサート時に、ユーザーの入力以外のデータを必要とする場合は、デフォルト値を用意する必要がある。

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use App\User;
use App\Models\Account;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;

class RegisterController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Register Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles the registration of new users as well as their
    | validation and creation. By default this controller uses a trait to
    | provide this functionality without requiring any additional code.
    |
    */

    use RegistersUsers;

    /**
     * Where to redirect users after registration.
     *
     * @var string
     */
    protected $redirectTo = RouteServiceProvider::HOME;

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest');
    }

    /**
     * Get a validator for an incoming registration request.
     *
     * @param  array  $data
     * @return \Illuminate\Contracts\Validation\Validator
     */
    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => ['required', 'string', 'max:255'],
            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
            'password' => ['required', 'string', 'min:8', 'confirmed'],
        ]);
    }

    /**
     * Create a new user instance after a valid registration.
     *
     * @param  array  $data
     * @return \App\User
     */
    protected function create(array $data)
    {
        return Account::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => Hash::make($data['password']),
            'register_date' => date("Y-m-d"),
            'delete_date' => null,
            'delete_fg' => 0,
            'remember_token' => null,
        ]);
    }
}

これで、無事にaccountsテーブルにuserを登録することができた。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

コードから読み解くautoloadの仕組み ~第一層 大雑把にautoloaderの仕組みを理解しよう~

初めに

 皆さんcomposerから利用できるautoloadはご存じでしょうか?PHPのFWであるLaravelなどを使用される方の多くは使用されたことがあるかと思います。自分がautoloadと出会ったのはLaravelを触れたあたりで、初めて見たときは、
「いちいちrequireしなくてもほかのファイルの機能が使えるのは便利だな~。」
と思っていました。そして使っていくうちに、
「自分が勝手に追加したファイルもちゃんと読み込んでくれている!怖っ!!(謎の恐怖)」
と思うようになり、だんだんその恐怖心が強まってきたのである日気が済むまでautoloadの仕組みを調べました。そして調べた内容を自分のうちにとどめておいても仕方ないし、共有することで自分の考えがよりまとまったり、指摘による考えの修正が起こるかもしれないと思ったのでここへ書いてみました。
 もしautoloadの仕組みに興味があったり、自分と同じような恐怖感に覚えがあれば見てみてください。

この記事の流れ

autoloadの仕組みはこの記事を含めて3回に分けて紹介していこうと思っています。
ちなみにこの表の深さの欄が下に行けば行くほど扱う内容がニッチで複雑なものになっていきます。もしautoloadの仕組みをを軽く知りたいのであれば、一層だけでも十分だと思います。

深さ タイトル 内容
第一層 大雑把にautoloaderの仕組みを理解しよう autoloadで使用するファイルの働きからautoloadの仕組みを理解する
第二層 より深くautoloadの仕組みを理解しよう 第一層で扱ったファイルのコードからautoloadの仕組みを理解する
第三層 autoloadの完全理解を目指せ! 第一層、二層で扱えなかった事柄の補足

※第二層、三層は後日公開予定(2020/05/15時点)

扱うツールついて

第一~三層で扱うツールは以下の通りです。

ツール バージョン
Laravel 7.11.0
Composer 1.10.5

また、今回解説するComposerはLaravelインストール時に自動でインストールされたものであるので、Composerからautoloadを単体でインストールした場合と異なる点があるかもしれません。

第一層 大雑把にautoloadの仕組みを理解しよう

※タイトル詐欺のようで申し訳ないのですが、この記事ではファイル内のコードの説明をあまりしません。コードの説明は第二層で説明するので、第二層が公開されるまでしばしお待ちください。

aoutloadの構造

autoloadのファイル構造は以下のようになっています。//以降はファイルごとの役割を表しています。

autoload
▾ vendor/                  ※読み込むファイルのデータを格納
  ▾ composer/
      autoload_classmap.php //※
      autoload_files.php //※
      autoload_namespaces.php //※
      autoload_psr4.php //※
      autoload_real.php //autoloadの実行
      autoload_static.php //※
      ClassLoader.php //autoloadの実態
      installed.json
      LICENSE
  autoload.php //autoloadの入り口

ファイルごとの役割

次は役割ごとにファイルを分けて、ファイルの中で何が行われているか見てみます。あと実際のコードも載せておきます。

autoloadの入り口

autoloadの入り口はautoload.phpが担います。詳しく説明すると、phpの実行が行われる同時にautoloadの実行を行うautoload_real.phpのある関数へ処理を行うよう命令し、その結果を返します。コードを見るとこんな感じ

autoload.php
// autoload.php @generated by Composer
require_once __DIR__ . '/composer/autoload_real.php';
//autoload_real.phpのgetLoader()へautoloadの処理を実行するように命令し、結果を返す
return ComposerAutoloaderInit35d447dc237e2326be89407c57b5ca8b::getLoader(); 

ちなみにLaravelでautoload.phpはこんなところに書かれています。

/public/index.php
//ここへ読み込むことで、Laravelの処理のすべてでautloadが使用できるようになる
require __DIR__.'/../vendor/autoload.php'; 

autoloadの実行

autoload.phpで処理を命令されたgetLoader()は大きく分けて3つのことを行います。
1. 読み込むファイルのデータが格納されたファイル(autoload_static.phpなど)に、autoloadの実態があるファイル(ClassLoader.php)へデータを渡すよう命令。
2. autoloadを実行させる
3. その他必要なファイル(これらがどう必要かあまりわかっていません)を読み込み
実際のコードはこちら

autoload_real.php
public static function getLoader()
    {
        if (null !== self::$loader) {
            return self::$loader;
        }

        spl_autoload_register(array('ComposerAutoloaderInit35d447dc237e2326be89407c57b5ca8b', 'loadClassLoader'), true, true);
        self::$loader = $loader = new \Composer\Autoload\ClassLoader();
        spl_autoload_unregister(array('ComposerAutoloaderInit35d447dc237e2326be89407c57b5ca8b', 'loadClassLoader'));

        $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
        if ($useStaticLoader) {
            require_once __DIR__ . '/autoload_static.php';

//1. 読み込むファイルのデータが格納されたファイル(autoload_static.phpなど)に、`autoload`の実態があるファイル(ClassLoader.php)へデータを渡すよう命令 
          call_user_func(\Composer\Autoload\ComposerStaticInit35d447dc237e2326be89407c57b5ca8b::getInitializer($loader));
        } else {
            $map = require __DIR__ . '/autoload_namespaces.php';
            foreach ($map as $namespace => $path) {
                $loader->set($namespace, $path);
            }

            $map = require __DIR__ . '/autoload_psr4.php';
            foreach ($map as $namespace => $path) {
                $loader->setPsr4($namespace, $path);
            }

            $classMap = require __DIR__ . '/autoload_classmap.php';
            if ($classMap) {
                $loader->addClassMap($classMap);
            }
        }
//2. `autoload`を実行させる
        $loader->register(true);

        if ($useStaticLoader) {
            $includeFiles = Composer\Autoload\ComposerStaticInit35d447dc237e2326be89407c57b5ca8b::$files;
        } else {
            $includeFiles = require __DIR__ . '/autoload_files.php';
        }
//3. その他必要なファイル(これらがどう必要かあまりわかっていません)を読み込み
        foreach ($includeFiles as $fileIdentifier => $file) {
            composerRequire35d447dc237e2326be89407c57b5ca8b($fileIdentifier, $file);
        }

        return $loader;
    }
}

読み込むファイルのデータを格納

この役割を担うファイルは複数ありますが、開発環境によって使用するファイルが異なるので一度にすべてのファイルが実行されるわけではありません。また、ファイルごとに格納されたデータを紹介すると、

  • autoload_classmap.php ⇒ Laravelで使用するファイルの名前空間+クラス名をキー、そのファイルの絶対パスを値とした連想配列が格納されている。
  • autoload_files.php ⇒ Laravelを使用するうえで重要であろうファイル(自分はよくわかっていない)の配列が格納されている
  • autoload_namespaces.php ⇒ Laravelで使用するファイルの名前空間をキー、そのファイルの絶対パスを値とした連想配列が格納されている。
  • autoload_psr4.php ⇒ Laravelで使用するファイルの名前空間をキー、そのファイルの絶対パスを値とした連想配列が格納されている。
  • autoload_static.php ⇒ autoload_classmap.php +autoload_files.php+ autoload_namespaces.php + autoload_psr4.phpのデータが格納されている。現在のPHPのバージョンの関係上、autoloadではこれらの4つのファイルの代わりにこのファイルが実行される。

読み込むファイルのデータのされ方と、どのようにしてそのデータをautoloadの実態であるClassLoader.phpへ送っているのかを確認するために、autoload_static.phpのコードを見てみましょう。

autoload_static.php
//名前空間+クラス名をキー、絶対パスを値とした連想配列でデータを格納
public static $classMap = array (
        'App\\Console\\Kernel' => __DIR__ . '/../..' . '/app/Console/Kernel.php',
        'App\\Eloquent\\Contribute' => __DIR__ . '/../..' . '/app/Eloquent/Contribute.php',
        'App\\Exceptions\\Handler' => __DIR__ . '/../..' . '/app/Exceptions/Handler.php',
        'App\\Http\\Controllers\\Contribute' => __DIR__ . '/../..' .  '/app/Http/Controllers/Controller.php',
        'App\\Http\\Kernel' => __DIR__ . '/../..' . '/app/Http/Kernel.php',
        'App\\Http\\Middleware\\Authenticate' => __DIR__ . '/../..' . '/app/Http/Middleware/Authenticate.php',
        'App\\Http\\Middleware\\CheckForMaintenanceMode' => __DIR__ . '/../..' . '/app/Http/Middleware/CheckForMaintenanceMode.php',
        'App\\Http\\Middleware\\EncryptCookies' => __DIR__ . '/../..' . '/app/Http/Middleware/EncryptCookies.php',
        'App\\Http\\Middleware\\RedirectIfAuthenticated' => __DIR__ . '/../..' . '/app/Http/Middleware/RedirectIfAuthenticated.php',
        'App\\Http\\Middleware\\TrimStrings' => __DIR__ . '/../..' . '/app/Http/Middleware/TrimStrings.php',
        'App\\Http\\Middleware\\TrustProxies' => __DIR__ . '/../..' . '/app/Http/Middleware/TrustProxies.php',
        'App\\Http\\Middleware\\VerifyCsrfToken' => __DIR__ . '/../..' . '/app/Http/Middleware/VerifyCsrfToken.php',
        'App\\Model\\Contribute\\Input' => __DIR__ . '/../..' . '/app/Model/Contribute/Input.php',
        'App\\Providers\\AppServiceProvider' => __DIR__ . '/../..' . '/app/Providers/AppServiceProvider.php',
        'App\\Providers\\AuthServiceProvider' => __DIR__ . '/../..' . '/app/Providers/AuthServiceProvider.php',
        'App\\Providers\\BroadcastServiceProvider' => __DIR__ . '/../..' . '/app/Providers/BroadcastServiceProvider.php',
        'App\\Providers\\EventServiceProvider' => __DIR__ . '/../..' . '/app/Providers/EventServiceProvider.php',
        'App\\Providers\\RouteServiceProvider' => __DIR__ . '/../..' . '/app/Providers/RouteServiceProvider.php',
        'App\\TestModel' => __DIR__ . '/../..' . '/app/TestModel.php',
        'App\\User' => __DIR__ . '/../..' . '/app/User.php',
//省略

//ClassLoader.phpへデータを送信
public static function getInitializer(ClassLoader $loader)
    {
        return \Closure::bind(function () use ($loader) {
            $loader->prefixLengthsPsr4 = ComposerStaticInit35d447dc237e2326be89407c57b5ca8b::$prefixLengthsPsr4;
            $loader->prefixDirsPsr4 = ComposerStaticInit35d447dc237e2326be89407c57b5ca8b::$prefixDirsPsr4;
            $loader->prefixesPsr0 = ComposerStaticInit35d447dc237e2326be89407c57b5ca8b::$prefixesPsr0;
            $loader->classMap = ComposerStaticInit35d447dc237e2326be89407c57b5ca8b::$classMap;

        }, null, ClassLoader::class);
    }

autoloadの実態

ClassLoader.phpautoloaの実態ということもあって、やることは送られてきたデータをただ読み込むだけです。コードはこちら

ClassLoader.php
//ファイルを読み込む関数の呼び出し
public function register($prepend = false)
    {
        spl_autoload_register(array($this, 'loadClass'), true, $prepend);
    }

//データの読み込みとデータに基づくファイルの読み込み
public function loadClass($class)
    {
        if ($file = $this->findFile($class)) {
            includeFile($file); //ここはただ include $file してるだけ。

            return true;
        }
    }

//送られてきたデータを取得
public function findFile($class)
    {
        // class map lookup
        if (isset($this->classMap[$class])) {
            return $this->classMap[$class];
        }
        if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
            return false;
        }
        if (null !== $this->apcuPrefix) {
            $file = apcu_fetch($this->apcuPrefix.$class, $hit);
            if ($hit) {
                return $file;
            }
        }

        $file = $this->findFileWithExtension($class, '.php');

        // Search for Hack files if we are running on HHVM
        if (false === $file && defined('HHVM_VERSION')) {
            $file = $this->findFileWithExtension($class, '.hh');
        }

        if (null !== $this->apcuPrefix) {
            apcu_add($this->apcuPrefix.$class, $file);
        }

        if (false === $file) {
            // Remember that this class does not exist.
            $this->missingClasses[$class] = true;
        }

        return $file;
    }

終わりに

 今回の記事は以上となります。autoloadのファイルに書かれたコードはPHPのマジックメソッドを使って作られているので、解読は自力でもやりやすかったです。(それでも構造の理解は結構大変だった...)
この関数はどう使われているのか疑問に思った方は、後日公開される第二層の記事を楽しみにしてください。こちらほうは今回あっさりとしか紹介しなかった関数などについてじっくり紹介していきます。

あとLaravelに関しての記事もいくつか書いているので、こちらも読んでいただけるとありがたいです!!
Laravelのサービスコンテナのバインドと解決の仕組みが知りたい!
Laravelのsingletonメソッドの機能とその仕組みについて

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelで多言語処理を行う

前提条件

eclipseでLaravel開発環境を構築する。デバッグでブレークポイントをつけて止める。(WindowsもVagrantもdockerも)
本記事は上記が完了している前提で書かれています
プロジェクトの作成もapacheの設定も上記で行っています

メッセージファイル作成

(1) /sample/resources/lang/en/messages.phpを作成

en/messages.php
<?php

return [
    'sample' => 'sample message'
];

(2) /sample/resources/lang/jaフォルダを作成
(3) /sample/resources/lang/ja/messages.phpを作成

ja/messages.php
<?php

return [
    'sample' => 'サンプルメッセージ'
];

Controllerにメソッド追加

(1) /sample/app/Http/Controllers/SampleController.phpに下記を追記
use Illuminate\Support\Facades\App;

(2) /sample/app/Http/Controllers/SampleController.phpにmultiLangメソッドを追記

    public function multiLang(Request $request)
    {
        if ($request->query('lang') === 'ja') {
            App::setLocale('ja');
        } else {
            App::setLocale('en');
        }
        $data = [
            'msg' => __('messages.sample'),
        ];
        return view('sample.multiLang', $data);
    }

App::setLocaleメソッドを使うことによってresources/langフォルダ内のどのフォルダを使うか設定することができます
App::setLocaleメソッドを呼ばなかった場合、config/app.php内のlocaleが使われます
__('messages.sample')でmessages.php内のsample要素の値を取得できます

(3) /sample/routes/web.phpに下記を追記
Route::get('sample/multi-lang', 'SampleController@multiLang');

viewの作成

/sample/resources/views/sample/multiLang.blade.phpファイル作成

multiLang.blade.php
<html>
    <head>
        <title>sample</title>
    </head>
    <body>
        <div>{{ $msg }}</div>
        <div>@lang('messages.sample')</div>
    </body>
</html>

bladeでは@lang('messages.sample')でmessages.php内のsample要素の値を取得できます
{{ __('messages.welcome') }}と書いても取得できます

動作確認

http://localhost/laravelSample/sample/multi-lang

sample message
sample message

http://localhost/laravelSample/sample/multi-lang?lang=ja

サンプルメッセージ
サンプルメッセージ
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】artisanコマンドで作成するファイルと手動で作成していいファイルのまとめ

はじめに

初Qiitaです。皆さん、Laravel使ってますか?

Webアプリを開発する時に、不慣れだとどのファイルがコマンドで作成すべきで、
どのファイルが手動で作っても大丈夫というのを確認しつつ進めたりして、
手間取ってしまいませんか?

Laravel初心者の私がちょうどそんな状態で、
こういう切り口で説明してくれるページがあるといいなぁ、と思い。
探したんですが見つからなかったので、今回は自分でまとめてみたいと思います。

artisanコマンドで作るファイル

  • マイグレーションファイル (2020_05_XX_XXXXXX_create_hoge_table.php)
  • コントローラーファイル (HogeController.php)

マイグレーションファイル

DBにテーブルを追加(モデルを追加)する時に作成します。

hogeがモデル名です。

php artisan make:model hoge --migration

/database/migrations/内にマイグレーションファイルができるので編集します。
終わったらマイグレーションを実行します。

php artisan migration

これでDBにテーブルが追加されます。

ちなみに、使うモデルはコントローラー内で呼び出してから使うと幸せになれます。(必須ではないですが)

use App\Hoge;

コントローラーファイル

このファイルにアクション(メソッド)を追加していきます。
HogeControllerがコントローラー名です。

php artisan make:controller HogeController

/Http/Controllers/内にコントローラーファイルができるので編集します。

artisanコマンドは不要なファイル

こちらはコマンド操作がいらない、最初からある or 手動で作成してもよいファイルです。

  • ルーティングファイル(/routes/web.php)
  • ビューファイル(index.blade.php)

ルーティングの追加

インストール時から存在している /routes/web.php に追記していきましょう。

ビューファイル

htmlを記載するためのファイルですね。
/resources/views/内に好きに作ってOKです。
階層も深くできるので、機能ごとにディレクトリにまとめるのがよいでしょう。

ちなみに私はSmartyの名残でテンプレートファイルと読んでいますが、ビューファイルと呼ぶ方が今どきっぽいですね。

おまけ 個人的によく使うartisanコマンド

サーバーの起動。

php artisan serve

そして、コマンドラインでDBの内容確認できて便利なtinker。

php artisan tinker

おわりに

以上です。
ここちゃうやんけ!的なツッコミ大歓迎です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelマイグレーションの基本まとめ(6以降対応)

はじめに

Laravelのマイグレーションはデータベースをコントロールする機能です。
僕だけかもしれませんが、開発していく中でマイグレーションファイルははたまに触るくらいなので毎回ググっていたという経緯から備忘録としてマイグレーションの主な機能についてリスト化していきます。

マイグレーション生成

まずは超基本的なマイグレーションファイルを作成するコマンド

$ php artisan make:migration create_[テーブル名]_table
$ php artisan make:migration create_users_table

このコマンドを実行するとusersテーブルが作成されます。

マイグレーションファイルのオプション

マイグレーションファイルを作成する際に--tableと--createのオプションを指定できます。

例えば、以下のコマンドではオプションがない場合テーブル名が何かわからないので、
--table=usersをつけることで、usersテーブルの雛形を作成してくれます。

$ php artisan make:migration add_votes_to_users_table --table=users

マイグレーション構造

マイグレーションを実行したら、以下のようなファイルが作成されます。
ここではカラムの追加やカラム型・物理名・論理名などを指定できます。

マイグレーションはupとdownのメソッドがあります。

upメソッドは新しいテーブル、カラム、インデックスをデータベースへ追加するために使用します。

downメソッドはupメソッドが行った操作を元に戻します。ロールバックの機能ですね。

2014_10_12_000000_create_users_table.php
<?php

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

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}

マイグレーション実行

マイグレーション構成を確認できたらマイグレーションを実行します。

$ php artisan migrate

実働環境でのマイグレーション強制

マイグレーションを強制実行するコマンドがあります。

$ php artisan migrate --force

これ使ったことないです。
データ全部飛んじゃうので使うなって新人の頃に強く言われましたね。

例え、使うことがあってもリーダーに確認してからにしましょう。

ロールバック

マイグレーションをロールバックするコマンドもあります。
ロールバックとは巻き戻すという意味で最後に実行したマイグレーション実行を巻き戻してくれます。

$ php artisan migrate:rollback

マイグレーション変更・追加

生成したマイグレーションにカラムを追加したい場合、新たにマイグレーションを生成する必要があります。

例えば、usersテーブルにageカラムを追加したい場合、以下のように書きます。

    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->integer('age');  //カラム追加
        });
    }


    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('age');  //カラムの削除
        });
    }

以上になります!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelでプロジェクトの作成フロー

新規プロジェクト

ターミナル
# バージョン指定なし (最新版をインストール, 初期値でmysqlを利用する)
$ composer create-project --prefer-dist laravel/laravel プロジェクト名

# バージョン指定あり (初期値でmysqlを利用する)
$ composer create-project --prefer-dist "laravel/laravel=5.5.*" sampleproject

#書き方はいろいろ
$ composer create-project laravel/laravel sampleproject --prefer-dist "6.0.*"

初期設定

タイムゾーンを日本に変更

タイムゾーンの変更

config/app.php
'timezone' => 'UTC',
#UTCをAsia/Tokyoに変更
'timezone' => 'Asia/Tokyo',

言語を日本に変更

config/app.php
'locale' => 'en',
#enをjaに変更
'locale' => 'ja',

DBの文字設定

config/database.php
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',

#mb4を消す(顔文字を不要)
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',

デバックバーのインストール

ターミナル
$ composer require barryvdh/laravel-debugbar

画面上に非表示にするために、.envファイルを変更する

.env
APP_DEBUG=true
#falseに変更する
APP_DEBUG=false

これでも画面に残っている場合は、キャッシュを消す

ターミナル
$php artisan cache:clear
$php artisan config:clear

DBの設定変更

.envファイルの下記のDB設定における、DATABASE名、USERNAM名、PWを設定していく

.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=

MAMPでDBの作成

Image from Gyazo

MAMPでUSERを作成

Image from Gyazo

作成した情報を記述する

.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_task
DB_USERNAME=laravel_user
DB_PASSWORD=password

接続できるか確認

ターミナル
$php artisan migrate

成功した場合は、無事にDBに接続できている。

MAMPのDBをSeaquel Proで確認する場合

ユーザー名:root
パスワード:root
データベース:
ソケット:/Applications/MAMP/tmp/mysql/mysql.sock
スクリーンショット 2020-05-14 12.31.00.png

これで接続すれば、確認ができる

Laravel-ui認証

マニュアルページを開く

laravel/uiパッケージをインストール
$composer require laravel/ui:^1.0 --dev
フロントエンドのスカフォールドをインストール
// 基本的なスカフォールドを生成
php artisan ui bootstrap
php artisan ui vue
php artisan ui react

// ログイン/ユーザー登録スカフォールドを生成
php artisan ui bootstrap --auth
php artisan ui vue --auth
php artisan ui react --auth
依存パッケージのインストール
$ npm install && npm run dev

エラーメッセージを日本語化

下記リンクを開く
https://github.com/minoryorg/laravel-resources-lang-ja

ファイルをダウンロード
Image from Gyazo

ダウンロードしたフォルダを開くと、jaというフォルダが存在する
スクリーンショット 2020-05-15 11.05.12.png

resources/langフォルダに、ダウンロードしたjaフォルダを追加
スクリーンショット 2020-05-15 11.10.13.png

これで日本語されています
passwordなど英語表記のものを日本語にするには、

validation.php
'attributes' => [],
//最下部のattributesにパスワードの項目を追加する

'attributes' => [
        'password'=>'パスワード'
    ],

ターミナルで開いておきたい

ターミナル(タブ1)
$ npm run development -- --watch
ターミナル(タブ2):ローカルサーバー
$ php artisan serve
ターミナル(タブ3):コマンド実行用
$ 何かターミナルコマンド入力する際に利用する

MVCの操作

ここからMVCコントローラーの操作を進めていく

ルーティング

web.php
#型
Route::get('url', 'コントローラー@アクション');

#例
Route::get('tests/test', 'TestController@index');

#リソースを利用して、記述短縮
Route::resource('photos', 'PhotoController');

マニュアル:
https://readouble.com/laravel/6.x/ja/controllers.html

TestController@indexでコントローラーを紐づけている。

routingの一覧を確認
//ターミナルで確認
$ php artisan route:list

//ファイルで確認
$ php artisan route:list > route.text

コントローラー

コントローラーとモデルの作成

ターミナル
#モデル単体を作成
$php artisan make:model Models/Test

# モデル、マイグレーションファイル、コントローラーを同時に作成
$ php artisan make:model Models/Test -mc

#コントローラーの作成(基本的なアクション含む)
php artisan make:controller PhotoController --resource

Models/Test Modelsフォルダの中で、Test.phpを作成
-mcはマイグレーションファイルとコントローラーを同時に作成するオプション

マイグレーションファイルの作成

ターミナル
$php artisan make:migration create_tests_table

マイグレーションの記述

マニュアル
https://readouble.com/laravel/6.x/ja/migrations.html
マニュアルを参考に、カラム型、制限をかけて、カラム修飾子で詳細に設定する

マイグレーションを実行

マイグレーションを実行
$ php artisan migrate
マイグレーションの履歴を確認
$php artisan migrate:status
マイグレーションをロールバックする
$php artisan migrate:rollback --step:5

コントローラーの作成

ターミナル
$ php artisan make:controller TestController

コントローラーの記述

TestController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Test; #モデルとコントローラーを紐づける

class TestController extends Controller
{
    //
    public function index() #railsの場合はdef indexだが、 laravelの場合はpublic function index() 
    {
        $values = Test::all(); #モデルを介して、DBから情報を取得
        dd($values); #railsのbinding.pryのように取得した内容を確認できる。
        return view('tests.index', compact('values')); #ここでどのviewなのか指定して紐づける
        #つまり、最後にどのviewにどの値を持っていくか指定する。
    }
}

View

ログインしているか、していないで表示切り替え

マニュアル
https://readouble.com/laravel/6.x/ja/blade.html

認証によって表示切り替え
@auth
    // ユーザーは認証済み
@else 
    // 
@endauth

@guest
    // ユーザーは認証されていない
@endguest

aタグにrouteのリンクを埋め込む

routeのnameを記述することで、リンク先のURLを簡単に指定できる

<a href={{ route(contacts.index) }}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel Excel使ってみた

概要

今もっともメジャーと思われるLaravelのExcelプラグイン。
早さだけなら「fast-excel」もあるが情報がないので。

インストール

phpで以下の拡張モジュールが必要なのであらかじめ使えるようにしておく。
php_zip php_xml php_gd2
composerでLaravelプロジェクトにプラグイン追加

$ composer require maatwebsite/excel

laravel 6.9の環境ではlaravel-excel 3.1.19がインストールされた。

次に設定を施していく。まずはlaravelのソースに追加。

[config/app.php]
'providers' => [
    /*
     * Package Service Providers...
     */
+    Maatwebsite\Excel\ExcelServiceProvider::class,
]
(略)
'aliases' => [
(略)
  'Event' => Illuminate\Support\Facades\Event::class,
+  'Excel' => Maatwebsite\Excel\Facades\Excel::class,
  'File' => Illuminate\Support\Facades\File::class,
  'Gate' => Illuminate\Support\Facades\Gate::class,
  'Hash' => Illuminate\Support\Facades\Hash::class,
(略)

次に以下のコマンドを叩いて専用の設定ファイルを生成する。

$ php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"

設定ファイル laravel/config/excel.php が作られます。
デフォルトでPDFでのエクスポート機能が有効になってました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaravelでDatabaseTransactionsを利用してDBにアクセスするテストを高速に実行する。

概要

タイトルでほぼ終わってる感がありますが、DatabaseTransactionsトレイトを利用すると、DBへの書き込みテストを高速に行うことができます。

説明

DBに対するテストをする場合にRefreshDatabaseを利用する例をよく見ますが、
RefreshDatabaseは内部的にphp artisan migrate:freshが行われており、データベースの作り直しから始まるので、Migrationが増えてくるとかなり時間が掛かるようになってきます。

DatabaseTransactionsを利用するとテストのsetup時点でbeginTransactionして、tearDown時にrollbackしてくれるので、データベースを作り直すことが無く、高速に実行できます。

デメリットは?

データベースを作り直すわけではないので、完全に実行前に戻るわけではありません。
例えばautoIncrementなidを持つtableなどに対してテストを行った場合は、たとえrollbackしても自動採番の数字は戻りません。そこら辺を理解した上で利用できる状況であれば、とても高速です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MacでのLaravel6の環境構築

目的


  • 学習の記録のため。
  • 環境構築で少し苦戦したため。

環境構築の手順


  1. PHPのパッケージ管理プログラム「Composer」のインストール
  2. Laravelをインストールする
  3. アプリケーションを作成する

1. PHPのパッケージ管理プログラム「Composer」のインストール


Laraveではプログラミングをダウンロードしてインストールするのではなく
PHPのパッケージ管理プログラム「Composer」というものを利用する。

以下のリンクからcomposerのファイルを直接ダウンロードして配置する。
https://getcomposer.org/download/

Latest Snapshot をクリックすると
「ダウンロード」フォルダに「composer.phar」というファイルがダウンロードされる。

スクリーンショット 2020-05-15 16.07.25.jpg

スクリーンショット 2020-05-15 16.13.40.jpg

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MacでLaravel6の環境構築で苦戦したのでまとめます。

ああ

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel 7 アプリからメールを送信する

目的

  • Laravelアプリからのメール送信で非常に詰まったため実施方法をまとめる

実施環境

  • ハードウェア環境(下記の二つの環境で確認)
項目 情報
OS macOS Catalina(10.15.3)
ハードウェア MacBook Pro (16-inch ,2019)
プロセッサ 2.6 GHz 6コアIntel Core i7
メモリ 16 GB 2667 MHz DDR4
グラフィックス AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB
  • ソフトウェア環境
項目 情報 備考
PHP バージョン 7.4.3 Homwbrewを用いて導入
Laravel バージョン 7.0.8 commposerを用いて導入
MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いて導入

前提情報

  • Dockerなどを使用せず、直接MacにLaravelの開発環境を構築して作業を行っている。自分の環境の構築方法を下記に記載する。
  • Gmailを用いたメールの送信を行う。

説明後の着地点

  • 当該laravelアプリのtinker上からコマンドにより指定したメールアドレスへのメール送信を行うことができる。

概要

  1. Googleアカウントの取得と設定
  2. Laravelアプリ側でのメール設定
  3. 確認

詳細

  1. Googleアカウントの取得と設定
    1. メールを送信するGoogleアカウントを作成する後ログインする。すでに持っているアカウントで送信を行う場合はログインする。
    2. 先にログインしたGoogleアカウントのGmailアドレスとパスワードを記憶しておく。
    3. 下記の方法で安全性の低いアプリのアクセスを有効にする。
  2. Laravelアプリ側でのメール設定

    1. メール送信を実装したいアプリのアプリ名ディレクトリまでターミナルで移動する。
    2. アプリ名ディレクトリで下記コマンドを実行して設定ファイルを開く。

      $ vi .env
      
    3. 開いた設定ファイルの26行目付近に下記の様な記載がある事を確認する。

      アプリ名ディレクトリ/.env
      MAIL_MAILER=smtp
      MAIL_HOST=smtp.mailtrap.io
      MAIL_PORT=2525
      MAIL_USERNAME=null
      MAIL_PASSWORD=null
      MAIL_ENCRYPTION=null
      MAIL_FROM_ADDRESS=null
      MAIL_FROM_NAME="${APP_NAME}"
      
    4. 先の設定ファイルのメールの設定部分を下記の様に修正する。

      アプリ名ディレクトリ/.env
      MAIL_DRIVER=smtp
      MAIL_HOST=smtp.gmail.com
      MAIL_PORT=587
      MAIL_USERNAME=安全性の低いアプリのアクセスを有効にしたGoogleアカウントのgmailアドレス
      MAIL_PASSWORD=安全性の低いアプリのアクセスを有効にしたGoogleアカウントのログインパスワード
      MAIL_ENCRYPTION=tls
      MAIL_FROM_ADDRESS=安全性の低いアプリのアクセスを有効にしたGoogleアカウントのgmailアドレス
      MAIL_FROM_NAME=メール差出人の名前(任意のものを入力する)
      
    5. 筆者の環境での当該記載の例を下記に記載する。(パスワードのみ伏せる)

      MAIL_DRIVER=smtp
      MAIL_HOST=smtp.gmail.com
      MAIL_PORT=587
      MAIL_USERNAME=laravel.mail.0104@gmail.com
      MAIL_PASSWORD=*************
      MAIL_ENCRYPTION=tls
      MAIL_FROM_ADDRESS=laravel.mail.0104@gmail.com
      MAIL_FROM_NAME=demo-laravel-crud
      
    6. .envファイルを保存して閉じる。

  3. 確認

    1. アプリ名ディレクトリにて下記コマンドを実行する。

      $ php artisan tinker
      
    2. tinkerで下記を実行してテストメールを送信する。

      >>> Mail::raw('test mail', function($message) {$message->to('テストメール送信先アドレス')->subject('Test');});
      => null
      
    3. テストメール送信先の受信ボックスを確認して下記の様なメールが届いていればメール送信の設定は完了である。(送信元名前と送信元アドレスはみなさんとは異なる)

      Test_-_shun_okawa_gmail_com_-_Gmail.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む