20200225のlaravelに関する記事は9件です。

Laravelでデータを取得した時の返り値にはCollectionとModelの二種類ある

laravelでデータを取得するときに使うメソッド

個人的によく使うメソッドにgetfirstがある。
データ取得した後にnullかどうかの判定をするのことがあるが、返り値の違いで書き方が変わるのでまとめておく。

get

getメソッドは、PHPのstdClassオブジェクトのインスタンスを結果として含む、Illuminate\Support\Collectionを返します。
(公式ドキュメントより引用)

first

データベーステーブルから1レコードのみ取得する必要がある場合は、firstメソッドを使います。このメソッドはstdClassオブジェクトを返します。
(公式ドキュメントより引用)

違い

getはCollection、firstはModelのオブジェクトで返ってくる。

nullの判定

CollectionだとisEmptyメソッドが使えるので便利。

collect([])->isEmpty();

// true

firstの場合、NULLで返ってくるのでis_nullを使う。

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

Laravelのフォーム、バリデーション・入力値の保持(Blade書き方メモ)

Laravelのフォームについての個人的なメモです。

Bootstrapのフォーム

・まとめたい要素form-control(label、option、selectなど)はform-gruopにまとめる。

バリデーション

@errorディレクティブを使う。引数にはチェックする項目を。
・フォームタグ内にrequired属性を追加することで、ブラウザによるバリデーションを行う。

入力値の保持

old()と三項演算子でテーブルに登録されている値を入れる。
autocompleteには自動入力する値を設定。

input

<div class="form-gruop">
 <label for="title">Title</label>
 <input id="title" class="form-control @error('title') is-invalid @enderror" name="title" required autocomplete="title" value="{{ old('title') ? : $articles->title }}"> 

 @error('title')
   <span class="invalid-feedback" role="alert">
      <strong>{{ $message }}</strong>
   </span>
 @enderror
</div>

textarea

<div class="form-gruop">
 <label for="Text">Text</label>
 <textarea class="form-control @error('text') is-invalid @enderror" name="text" required autocomplete="text" rows="4">{{ old('text') ? : $articles->text }}</textarea>

 @error('text')
   <span class="invalid-feedback" role="alert">
      <strong>{{ $message }}</strong>
   </span>
 @enderror
</div>

select

<div class="form-gruop">
 <label for="num">Number</label>
 <select name="num" id="genre" class="form-control @error('num') is-invalid @enderror" required>
 <option value="1">1</option>
 <option value="2">2</option>
 <option value="3">3</option>
 <option value="4">4</option>
 </select>

 @error('num')
   <span class="invalid-feedback" role="alert">
      <strong>{{ $message }}</strong>
   </span>
 @enderror
</div>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ユーザーアカウント登録内容の変更の手順

はじめに

laravelでAuthを実装すると簡単にユーザー登録が可能になりますが、登録内容の変更は別途実装する必要があります。
本投稿では名前、メールアドレスを変更する手順について記載します。
パスワードの変更手順については本投稿では触れませんが、下記サイトがかなり参考になります。
[Laravel 5.7]パスワード変更フォームの作り方

  • バージョン php: 7.2 laravel: 5.8
  • Authは実装済みであること

Controllerの編集

UserControllerの作成

$ php artisan make:controller Admin/UserController

UserControllerの編集

User.Controller.php
<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth; //追加

class UserController extends Controller
{
    //下記を追加

    //userデータの取得
    public function index() {
        return view('user.index', ['user' => Auth::user() ]);
    }
    //userデータの編集
    public function edit() {
        return view('user.edit', ['user' => Auth::user() ]);
    }
    //userデータの保存
    public function update(Request $request) {

        $user_form = $request->all();
        $user = Auth::user();
        //不要な「_token」の削除
        unset($user_form['_token']);
        //保存
        $user->fill($user_form)->save();
        //リダイレクト
        return redirect('user/index');
    }
}

Viewの作成と編集

ユーザー登録内容の表示

user/index.blade.php
<div class="container m-5">
  <div class="row justify-content-center">
    <div class="col-md-8">
      <div class="card">
        <div class="card-header">ユーザー登録内容</div>
        <div class="card-body">
            <div class="form-group">
              <label for="name">
                名前
              </label>
              <div>
                <input class="form-control" value="{{ $user->name }}">
              </div>
            </div>
            <div class="form-group">
              <label for="email">
                email
              </label>
              <div>
                <input class="form-control" value="{{ $user->email }}">
              </div>
            </div>
              <a href="{{ action('Admin\UserController@edit') }}"><button class="user-btn">ユーザー登録内容の編集</button></a>
        </div>
      </div>
    </div>
  </div>
</div>

下記画面のようになる
image.png

ユーザー情報の変更

user/edit.blade.php
<div class="container m-5">
  <div class="row justify-content-center">
    <div class="col-md-8">
      <div class="card">
        <div class="card-header">ユーザー登録内容の変更</div>
        <div class="card-body">
          <form method="POST" action="{{ action('Admin\UserController@update') }}">
            <div class="form-group">
              <label for="name">
                名前
              </label>
              <div>
                <input type="text" name="name" class="form-control" value="{{ $user->name }}">
              </div>
            </div>
            <div class="form-group">
              <label for="email">
                email
              </label>
              <div>
                <input type="text" name="email" class="form-control" value="{{ $user->email }}">
              </div>
              <button type="submit" class="user-btn">変更</button>
              {{ csrf_field() }}
          </form>
        </div>
      </div>
    </div>
  </div>
</div>

先ほどのユーザー登録内容の表示画面で「ユーザー登録内容の編集」ボタンをクリックすると下記画面に移る
image.png

Routingの設定

user/index.blade.php
 Route::group(['middleware' => 'auth:user'], function()
{  
   Route::get('user/index', 'Admin\UserController@index');
   Route::get('user/edit', 'Admin\UserController@edit');
   Route::post('user/edit', 'Admin\UserController@update');
});
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ユーザーアカウント登録内容の変更の手順(パスワードは除く)

はじめに

laravelでAuthを実装すると簡単にユーザー登録が可能になりますが、登録内容の変更は別途実装する必要があります。
本投稿では名前とメールアドレスを変更する手順について記載します。パスワードは少し難しくなるので別途投稿する予定です。

  • バージョン php: 7.2 laravel: 5.8
  • Authは実装済みであること

Controllerの編集

UserControllerの作成

$ php artisan make:controller Admin/UserController

UserControllerの編集

User.Controller.php
<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth; //追加

class UserController extends Controller
{
    //下記を追加

    //userデータの取得
    public function index() {
        return view('user.index', ['user' => Auth::user() ]);
    }
    //userデータの編集
    public function edit() {
        return view('user.edit', ['user' => Auth::user() ]);
    }
    //userデータの保存
    public function update(Request $request) {

        $user_form = $request->all();
        $user = Auth::user();
        //不要な「_token」の削除
        unset($user_form['_token']);
        //保存
        $user->fill($user_form)->save();
        //リダイレクト
        return redirect('user/index');
    }
}

Viewの作成と編集

ユーザー登録内容の表示

user/index.blade.php
<div class="container m-5">
  <div class="row justify-content-center">
    <div class="col-md-8">
      <div class="card">
        <div class="card-header">ユーザー登録内容</div>
        <div class="card-body">
            <div class="form-group">
              <label for="name">
                名前
              </label>
              <div>
                <input class="form-control" value="{{ $user->name }}">
              </div>
            </div>
            <div class="form-group">
              <label for="email">
                email
              </label>
              <div>
                <input class="form-control" value="{{ $user->email }}">
              </div>
            </div>
              <a href="{{ action('Admin\UserController@edit') }}"><button class="user-btn">ユーザー登録内容の編集</button></a>
        </div>
      </div>
    </div>
  </div>
</div>

下記画面のようになる
image.png

ユーザー情報の変更

user/edit.blade.php
<div class="container m-5">
  <div class="row justify-content-center">
    <div class="col-md-8">
      <div class="card">
        <div class="card-header">ユーザー登録内容の変更</div>
        <div class="card-body">
          <form method="POST" action="{{ action('Admin\UserController@update') }}">
            <div class="form-group">
              <label for="name">
                名前
              </label>
              <div>
                <input type="text" name="name" class="form-control" value="{{ $user->name }}">
              </div>
            </div>
            <div class="form-group">
              <label for="email">
                email
              </label>
              <div>
                <input type="text" name="email" class="form-control" value="{{ $user->email }}">
              </div>
              <button type="submit" class="user-btn">変更</button>
              {{ csrf_field() }}
          </form>
        </div>
      </div>
    </div>
  </div>
</div>

先ほどのユーザー登録内容の表示画面で「ユーザー登録内容の編集」ボタンをクリックすると下記画面に移る
image.png

Routingの設定

user/index.blade.php
 Route::group(['middleware' => 'auth:user'], function()
{  
   Route::get('user/index', 'Admin\UserController@index');
   Route::get('user/edit', 'Admin\UserController@edit');
   Route::post('user/edit', 'Admin\UserController@update');
});
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】アクセサ、ミューテタの基本のキ

はじめに

今回はアクセサとミューテタの基本について解説します。

そもそもミューテタとは?

そもそもミューテタってなんなんでしょうか?
簡単にいうとデータをデータベースに保存する時に走る一定の処理のことです。

そもそもアクセサとは?

そもそもアクセサとはなんでしょうか?
簡単にいうとデータをデータベースから取得する時に走る一定の処理のことです。

使用例

 例えば、都道府県をデータベースに保存する時を考えます。
 そのまま文字データとして都道府県を保存することもありますが、多くの場合は整数に置き換えて保存します。(1が北海道、2が青森など都道府県それぞれに対応させた整数を設定する。こうする理由は文字データより圧倒的に整数の方がデータ容量が少ないからデータベースを圧迫しないからです。)
 しかし、データベースにデータを保存する時に変換して、取得した時も変換してと毎回処理を書くのはめんどくさい。。。無駄なコードが増えるから邪魔!!!
できれば、アプリケーションで自動に処理してほしいですね。
 そこで、活躍するのがアクセサとミューテタです!!
今回は基本のキということで簡単な例を扱っていきます。
最低限必要なエッセンスだけ説明します。
では、スターーーーート!!

アクセサとミューテタでなにができるの?

Laravelを使ったことがある人であれば、実はミューテタとアクセサはもう使っているんです!!
Laravelではcreated_at、updated_atは自動的にCarbonインスタンスに変換されて使うようになっています。
だから、日付に関しては簡単に実装することができます。(日付については最後に記載しています)
しかし、今回は自分で独自にミューテタ、アクセサの実装する方法について説明します。

アクセサの実装方法

アクセサはモデル内に定義します。

アクセサの命名規則はgetFooAttribute

アクセサを設定したいカラム名が「キャメルケース」でHogeの場合、カラムがあるモデルクラスにgetHogeAttributeメソッドを作成します。

アクセサ定義例:first_nameカラムにアクセサ定義

Userモデルクラスに下記を追加
下記のコードでfirst_nameカラムを取得する時にgetHogeAttribute(頭文字を大文字に変える)が実行されます。

app/User.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    public function getFirstNameAttribute($value)
    {
        return ucfirst($value);
    }
}

getFirstNameAttributeの引数$valueがデータベースから取得したカラムの中身になります。
ちなみにucfirst($value)が頭文字を大文字にするメソッドです

アクセサを実行する

上記のコードが正しく動いていれば、下記のように単純にfirst_nameカラムを引っ張ってくるだけで自動でgetFirstNameAttributeが実行されます。

$user = App\User::find(1);

$firstName = $user->first_name;

以上がアクセサの使い方です。

ミューテタの実装方法

ミューテタもアクセサと同様にモデル内に定義します。

ミューテタの命名規則

これもアクセサと同様に、アクセスしたいカラム名が「キャメルケース」でFooの場合、カラムがあるモデルクラス内にsetFooAttributeメソッドを作成します。

ミューテタ定義例:first_nameカラムにミューテタ定義

下記のコードでfirst_nameカラムの保存時に自動でsetFirstNameAttributeが実行されます。

app/User.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    public function setFirstNameAttribute($value)
    {
        $this->attributes['first_name'] = strtolower($value);
    }
}

valueが設定しようとしている中身になります。
strtolowerが全て小文字に変えるメソッドです。
setFirstNameAttributeの引数$valueが設定しようとしている値です。上記のメソッドはUserインスタンスのattributesプロパティのfirst_nameに小文字にした$valueが代入されるようになっています。

ミューテタを実行してみる

下記の場合2行目のfirst_nameカラムにSallayを設定しようとした時に、setFirstNameAttributeメソッドが呼び出され、Sallayの値が渡され、ミューテタが実行されます。
実は保存時にミューテタが実行されるわけではなく、インスタンスに値を設定する時にミューテタは実行されることに注意です

$user = App\User::find(1);
$user->first_name = 'Sally';

おまけ:日付ミューテタ

おまけに日付ミューテタについて記述します。
自分で作成した日付のカラムをCarbonインスタンスで扱い時、設定は簡単です。
定義する場所はミューテタと同じモデルの中に定義します。
その中にデフォルトである$datesをオーバーライドします

app/User.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    protected $dates = [
        'created_at',
        'updated_at',
        'deleted_at'
    ];
}

これにより、データベースからdelete_atを取得すると自動でCarbonインスタンスに変換されているため、
自由にCarbonにあるメソッドを使うことができます。
Carbonについてはこちらでざっとまとめているので、是非!!

以上です!!!
ここまで読んでいただきありがとうございました!!
疑問、気になるところがございましたら、質問、コメントよろしくお願いします!!!

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

Laravel on Dockerでのブロードキャスト

TL;DL

Docker環境のLaravelでのブロードキャストを実装しました:thumbsup:

Dockerを使ったLaravel環境構築

インストールするのはLaravel 6.xです。

$ mkdir broadcast
$ cd broadcast
$ composer create-project --prefer-dist laravel/laravel src
├── docker-compose.yml
├── docker
│   ├── echoserver
│   │   └── Dockerfile
│   ├── nginx
│   │   └── default.conf
│   ├── php
│   │   ├── Dockerfile
│   │   ├── cmd.sh
│   │   └── php.ini
│   └── redis
│       └── data
├── logs
└── src  # Laravelの置き場所
docker-compose.yml
version: '3'

services:
  web:
    image: nginx:1.17.8-alpine
    ports:
     - 80
    volumes:
     - ./src:/var/www:cached
     - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
     - ./logs/nginx:/var/log/nginx:cached
    depends_on:
     - php
    environment:
      VIRTUAL_HOST: localhost

  php:
    image: broadcast-php
    build: ./docker/php
    volumes:
     - ./src:/var/www:cached
     - ./logs/php:/var/log/php
     - ./docker/php/cmd.sh:/usr/local/bin/cmd.sh

  nodejs:
    image: node:13.8-alpine
    volumes:
     - ./src:/work:cached
    working_dir: /work

  echo-server:
    image: broadcast-echo-server
    build: ./docker/echoserver
    ports:
     - "6001:6001"
    command: laravel-echo-server start
    volumes:
     - ./src:/work:cached
    working_dir: /work

  redis:
    image: redis:latest
    ports:
     - "6379:6379"
    volumes:
     - "./docker/redis/data:/data"
docker/echoserver/Dockerfile
FROM node:13.8-alpine

# timezone
RUN apk add --update --no-cache --virtual build-dependencies tzdata && \
    cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
    echo "Asia/Tokyo" > /etc/timezone && \
    apk del build-dependencies

RUN npm install -g laravel-echo-server

WORKDIR /work

CMD ["laravel-echo-server", "start"]
docker/php/Dockerfile
FROM php:7.3-fpm-alpine
COPY php.ini /usr/local/etc/php/

# lib
RUN apk add --no-cache --virtual build-dependencies gcc make autoconf libc-dev libtool \
 && apk add --no-cache --virtual zlib1g-dev libxml2-dev

# composer
COPY --from=composer /usr/bin/composer /usr/bin/composer

# php extension
RUN docker-php-ext-install xml pdo_mysql

# timezone
RUN apk add --update --no-cache --virtual build-dependencies tzdata && \
    cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
    echo "Asia/Tokyo" > /etc/timezone && \
    apk del build-dependencies

WORKDIR /var/www
docker/php/cmd.sh
#!/bin/sh
php-fpm
docker/nginx/default.conf
server {
  listen 80;
    index index.php index.html;
    root /var/www/public;
    charset utf-8;

  location / {
    root /var/www/public;
    try_files $uri $uri/ /index.php$is_args$args;
  }

  location ~ \.php$ {

    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass php:9000;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param HOGE $realip_remote_port;
  }
}

ビルドして、最初のdocker-compose up -dではLaravel Echo Serverは起動しません。

$ docker ps -a
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS                      PORTS                               NAMES
                    nginx:1.17.8-alpine     "nginx -g 'daemon of…"   14 seconds ago      Up 12 seconds               0.0.0.0:32774->80/tcp               broadcast_web_1
                    broadcast-php           "docker-php-entrypoi…"   16 seconds ago      Up 13 seconds               9000/tcp                            broadcast_php_1
                    node:13.8-alpine        "docker-entrypoint.s…"   16 seconds ago      Exited (0) 13 seconds ago                                       broadcast_nodejs_1
                    broadcast-echo-server   "docker-entrypoint.s…"   16 seconds ago      Exited (0) 12 seconds ago                                       broadcast_echo-server_1
                    redis:latest            "docker-entrypoint.s…"   16 seconds ago      Up 13 seconds               0.0.0.0:6379->6379/tcp              broadcast_redis_1

そこで初期化コマンドを実行する必要があります。

$ docker-compose run --rm echo-server laravel-echo-server init
? Do you want to run this server in development mode? Yes
? Which port would you like to serve from? 6001
? Which database would you like to use to store presence channel members? redis
? Enter the host of your Laravel authentication server. http://localhost
? Will you be serving on http or https? http
? Do you want to generate a client ID/Key for HTTP API? No
? Do you want to setup cross domain access to the API? No
? What do you want this config to be saved as? laravel-echo-server.json
Configuration file saved. Run laravel-echo-server start to run server.

これでsrc/laravel-echo-server.jsonという設定ファイルが作られます。
この中のRedisの接続情報でRedisコンテナを指定します。

src/laravel-echo-server.json
{
    ...

    "databaseConfig": {
        "redis": {
            "host": "redis",
            "port": 6379
        },
        "sqlite": {
            "databasePath": "/database/laravel-echo-server.sqlite"
        }
    },

    ...
}

落として、再度立ち上げます。

$ docker-compose down
$ docker-compose up -d
$ docker ps -a
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS                      PORTS                               NAMES
                    nginx:1.17.8-alpine     "nginx -g 'daemon of…"   10 seconds ago      Up 7 seconds                0.0.0.0:32775->80/tcp               broadcast_web_1
                    node:13.8-alpine        "docker-entrypoint.s…"   11 seconds ago      Exited (0) 9 seconds ago                                        broadcast_nodejs_1
                    broadcast-php           "docker-php-entrypoi…"   11 seconds ago      Up 9 seconds                9000/tcp                            broadcast_php_1
                    broadcast-echo-server   "docker-entrypoint.s…"   11 seconds ago      Up 9 seconds                0.0.0.0:6001->6001/tcp              broadcast_echo-server_1
                    redis:latest            "docker-entrypoint.s…"   11 seconds ago      Up 9 seconds                0.0.0.0:6379->6379/tcp              broadcast_redis_1

これでLaravel Echo Serverも起動しました。

http://localhost:32775/

にアクセスするとLaravelインストール直後の画面が表示されます。

スクリーンショット 2020-02-24 13.51.58.png

ブロードキャスト

ここからが本題のブロードキャストです。
以下が公式のドキュメント。

https://laravel.com/docs/6.x/broadcasting
https://readouble.com/laravel/6.x/ja/broadcasting.html

今回はRedisを使います。
ほぼほぼ公式の手順でうまくいきます(そして公式ドキュメントに載っていない設定で躓く。。)

App\Providers\BroadcastServiceProviderの登録

コメントを外します。

$ diff src/config/app.php.orig src/config/app.php
174c174
<         // App\Providers\BroadcastServiceProvider::class,
---
>         App\Providers\BroadcastServiceProvider::class,

HTMLへのCSRFトークンの追加とJSの読み込み

$ diff src/resources/views/welcome.blade.php.orig src/resources/views/welcome.blade.php
8a9,10
>         <meta name="csrf-token" content="{{ csrf_token() }}">
> 
98a101,102
> 
>         <script src="{{ mix('js/app.js') }}"></script>

Redisのクライアントライブラリのインストール

$ cd src
$ composer require predis/predis

イベントの作成

$ docker-compose exec php php artisan make:event HelloWorldEvent
Event created successfully.

イベントのbroadcastOn()でチャンネルを返すのですが、今回作るのは認証が必要ないチャンネルとします。

src/app/Events/HelloWorldEvent.php
<?php

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class HelloWorldEvent implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $message = 'Hello World!!';

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new Channel('hello-world-channel');
    }
}

イベント発行のコマンドの作成

$ docker-compose exec php php artisan make:command BroadcastHelloWorld
Console command created successfully.
src/app/Console/Commands/BroadcastHelloWorld.php
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use App\Events\HelloWorldEvent;

class BroadcastHelloWorld extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'command:broadcast-hello-world';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        event(new HelloWorldEvent());
    }
}

フロントエンド

laravel-echosocket.io-clientが必要です。

$ docker-compose run --rm nodejs npm install
$ docker-compose run --rm nodejs npm install --save laravel-echo socket.io-client

なんかnpm installで警告いっぱい出た。。。
チャンネルとイベントを指定してリッスンします。

$ diff src/resources/js/app.js.orig src/resources/js/app.js
1a2,14
> 
> import Echo from 'laravel-echo';
> 
> window.io = require('socket.io-client');
> 
> window.Echo = new Echo({
>     broadcaster: 'socket.io',
>     host: window.location.hostname + ':6001'
> });
> 
> window.Echo.channel('hello-world-channel').listen('HelloWorldEvent', e => {
>     console.log(e.message);
> });

.envの変更

$ diff src/.env.orig src/.env
16c16
< BROADCAST_DRIVER=log
---
> BROADCAST_DRIVER=redis
18c18
< QUEUE_CONNECTION=sync
---
> QUEUE_CONNECTION=redis
22c22,24
< REDIS_HOST=127.0.0.1
---
> REDIS_HOST=redis
> REDIS_CLIENT=predis
> REDIS_PREFIX=""

!!重要!!
ここでRedisのprefixを空文字にすることが重要です。
これが公式ドキュメントに書かれていなくて、調べてやっと見つけました。

ブロードキャストできるか確認

$ docker-compose run --rm nodejs npm run dev
$ docker-compose exec php php artisan command:broadcast-hello-world
$ docker-compose exec php php artisan queue:work --stop-when-empty
 Processing: App\Events\HelloWorldEvent
 Processed:  App\Events\HelloWorldEvent

スクリーンショット 2020-02-24 13.56.50.png

成功しました!!
laravel-echo-server.jsonのRedisコンテナ指定の修正や、Redisのprefixの変更など、Redis周りで難しかったですが、なんとかDocker環境でブロードキャストできました:beer:

参考URL

この記事がなかったら自分は諦めてました。:pray::pray::pray:感謝:pray::pray::pray:

https://nori-life.com/laravel-broadcast-redis-socket-io/

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

Laravel artisanコマンドのエラー Could not open input file: artisan

前回の記事の続きのような形で、MAMP環境でのlaravelの環境構築の記事でも書こうかと思っていたのですが、すでに良記事がゴロゴロ転がっているので必要ないかなと思ってるのですが、どうでしょう?
(訳 : 需要がありそうならMAMPのインストール、Laravelのプロジェクト作成、データベース周りの設定もやろうかと思います)

さて今日から

今日から記事の量産体制に入ろうかと思います。
Laravelを中心に小さいエラーの対処法から、覚えておくと便利なコードの書き方までガンガン書き記していきます。
読み物としては物足りないかもしれませんが、人は思わぬところで躓くものなので……。
これからの私の記事はそういった人達の一助になればと考えています。

今回の題

今回の題材は、タイトルの通りです

Could not open input file: artisan

という、たまーーに目にする小さなエラーです。

解決策

簡単なことで、

「artisan」コマンドを叩くディレクトリが間違っています。

「artisan」コマンドはLaravelのプロジェクトディレクトリで叩きます。

……解決。

終わりに

こんな感じの小さな記事を打ちまくります。
よろしくお願いします。

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

【Laravel】ユーザーをシーダーで作る

はじめに

  • 業務でユーザー自身に登録させる仕様は少ない。
  • コマンドラインから初期ユーザーを登録する必要がある。
  • シーダーの使い方をまとめておく。

シーダーの作り方

以下のコマンドで Users テーブルのシーダーを作成できる。

php artisan make:seeder UsersTableSeeder

記述方法

ファイルは database/seeds/UsersTableSeeder.php として作成される。

<?php
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class DatabaseSeeder extends Seeder
{
    /**
     * データベース初期値設定の実行
     * @return void
     */
    public function run()
    {
        DB::table('users')->insert([
            'name' => 'UserName',
            'email' => 'User@mailaddress.com',
            'password' => bcrypt('password'),
        ]);
    }
}

パスワードが bcrypt で暗号化しなければならないので、単純な insert 文ではデータを作成できない。


呼び出し

コマンドラインから呼び出せるように database/seeds/DatabaseSeeder.php にクラスを登録する必要がある。

<?php
use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $this->call([
            UsersTableSeeder::class, // 呼び出すように追加
        ]);
    }
}

実行コマンド

seeder をすべて実行する。

$ php artisan db:seed

特定のクラスを指定して実行する。

$ php artisan db:seed --class=UsersTableSeeder

さいごに

とにかく auth でログインを作っても、ユーザーがないとログインもできない。
[登録]を削ると新規ユーザーも登録できない。
シーダーで初期ユーザーを登録しておけば、ログインはできるし、
後でゆっくりユーザー管理機能を実装できるね。

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

【Laravel】ログイン廻りの日本語化

home や auth で作成されるログイン廻りの Blade テンプレート中に書かれている以下の様な記述を多言語する場合、

{{ __('Login') }}

resources/lang の下に日本語訳を記載した ja.json を置く。
これを置くことで、多言語対応している部分 (__()) は軒並み日本語になる。

resources/lang/ja.json

{
    "Login":"ログイン",
    "E-Mail Address":"メールアドレス",
    "Password":"パスワード",
    "Remember Me":"ログイン状態を保存する",
    "Forgot Your Password?":"パスワードをお忘れですか ?",
    "Register":"登録",
    "Name":"お名前",
    "Confirm Password":"パスワード(確認用)",
    "Reset Password":"パスワードリセット",
    "Send Password Reset Link":"パスワードリセットリンク送信",
    "Logout":"ログアウト",

    "Verify Your Email Address":"ユーザ登録を完了してください",
    "A fresh verification link has been sent to your email address.":"新しいリンクをあなたのメールアドレスに送信しました。",
    "Before proceeding, please check your email for a verification link.":"メールに記載されているリンクをクリックして、登録手続きを完了してください。",
    "If you did not receive the email":"メールが届いていなければ、",
    "click here to request another":"こちらをクリックして再送信してください。",

    "Please click the link below to verify your email address.":"メールアドレスを確認するために下のリンクをクリックしてください。",
    "Verify Email Address":"メールアドレス確認",
    "If you did not create an account, no further action is required.":"心当たりがない場合は、本メッセージは破棄してください。",

    "Reset Password":"パスワードリセット",
    "Click button below and reset password.":"下のボタンをクリックしてパスワードを再設定してください。",
    "Reset password":"パスワードリセット",
    "If you did not request a password reset, no further action is required.":"心当たりがない場合は、本メッセージは破棄してください。"
} 
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む