- 投稿日:2019-05-02T22:14:39+09:00
laravel 備忘録
composerのインストール
ninja@localhost:~$ curl https://getcomposer.org/installer | php ninja@localhost:~$ sudo mv composer.phar /usr/local/bin/composerunzipのインストール(laravelでプロジェクト作成時に怒られるので)
sudo apt-get install unziplaravelでプロジェクト作成
ninja@localhost:~$ composer create-project --prefer-dist laravel/laravel website ninja@localhost:~$ sudo chmod -R 755 website/storage/nginxのroot変更
/etc/nginx/sites-available/default.ninja@localhost:~$ sudo vi /etc/nginx/sites-available/default root /home/ninja/website/public; nginxを再起動 ninja@localhost:~$ sudo service nginx restartブラウザからアクセスする。
http://xxx.xxx.xxx.xxx
- 投稿日:2019-05-02T19:14:00+09:00
[忘備録]laravel5.5 データベースjoin 結合
laravelを用いて初めてデータベースの結合をしてみると、想像以上に簡単だったので、忘備録として残しておこうと思う。
前提
データベースにlaravelデフォルトの
users
に加え、id
,uesr_id
,text
カラムを含むposts
テーブルを用意する。postsテーブルを作成する際はマイグレーションファイルで
user_id
カラムを次のように設定する。$table->integer('user_id')->unsigned(); $table->foreign('user_id')->references('id')->on('users');流れ
①モデル設定
②コントローラーから使う①モデル設定
今回はユーザーが複数のpostを持つというで、以下のような関係になります。
user has many posts posts belongs to userこの点を踏まえて、
User.php
,Post.php
に以下のコードを追記。User.phppublic function posts() { return $this->hasMany('App\Post'); }Post.phppublic function user() { return $this->belongsTo('App\User'); }これで準備は整いました。
②コントローラーから使う
今回はコントローラーで確認用
unction join()
という関数を作ります。Post.phpfunction join() { #postsテーブルのuser_idが1のレコードを全て取得 $user = User::find(1); $posts = $user->posts; #postテーブルのデータを全て取得 $posts = Post::all(); #上記で取得した「postsテーブルのuser_idが1のレコード」をひとつずつ表示 foreach ($posts as $post) { echo $post . "<br/>"; } #上記で取得した「postテーブルのデータ」から結合されたユーザーの名前をひとつずつ表示する。 foreach ($posts as $post) { echo $post->user->name . "<br/>"; } }これで、適当にルート設定をし、うまく表示されていることを確認することができました。
おかしな部分がある場合、指摘していただけるとありがたいです。
- 投稿日:2019-05-02T16:00:45+09:00
el・data・データバインディング・リスト(Laravel使用Vue.js入門)#1
◆Vue.js利用準備
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>CDNを利用することで、ファイルをvue.jsのファイルをダウンロードすることなく利用できます。
◆データバインディング(表示しているものとデータの同期)
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="csrf-token" content="{{ csrf_token() }}"> <title>Vue.js</title> <link href="{{ asset('css/app.css') }}" rel="stylesheet" type="text/css"> </head> <body> <div id="app"> <h1>@{{ message }}</h1> </div> </body> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script> const vue = new Vue({ el: '#app', data: { message: 'Hello Vue.js!!' } }); </script>僕は、laravelのbladeを利用させていただいているため、\@{{message}}と指定しておりますが、bladeを使用されていない方は{{message}}で動作すると思います。
new Vue({})でVueインスタンスを作成して、その中のオプションを指定することでVueアプリケーションを作成することができます。
elは、DOM要素のセレクタを指定します。ちなみにクラスでも指定できます。マウントと言ったりします。
dataは、上のel内で指定した範囲内で利用するデータをもつ変数です。
今回の場合ですと、画面にHello Vue.js!!がデータバインディングにより表示されます。
また、messageの内容を変えると画面に表示される文字も変更されます。これをリアクティブといいます。バインディングは属性やクラスやスタイルも指定可能です。
◆リスト
<body> <div class="app"> <ol> <li v-for="fruit in fruitList"> @{{fruit}} </li> </ol> </div> </body> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script> const vue = new Vue({ el: '.app', data: { fruitList:[ 'ミカン', 'メロン', 'ブドウ' ] } }); </script>v-forディレクティブを使うと、簡単にリストを配列内のデータを利用し、使用することができます。
◆イベント・条件分岐
先ほどのリストを条件分岐で表示非表示を切り替えてみる
<body> <div class="app"> <ol> <li v-for="fruit in fruitList" v-if="show"> @{{fruit}} </li> </ol> <button v-on:click="handleClick">表示切替</button> </div> </body> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script> const vue = new Vue({ el: '.app', data: { fruitList: [ 'ミカン', 'メロン', 'ブドウ' ], show: true }, methods: { handleClick: function () { this.show =! this.show } } }); </script>v-onディレクティブを使用することで、DOMのイベントを検知できます。
v-on:clickの中に処理を記述することも可能ですが、処理は分けて記述するほうが良いと思います。this.showはdata内のshowを指しております。
elで指定した範囲内で利用するメソッドを、methodsプロパティ内で記述します。今回なら、showの切り替えです。
v-ifディレクティブはtrueだと、DOMに読み込まれますが、falseだとDOMから削除されます。また、これと似たもので、v-showディレクティブがあるのですが、こちらは削除されず、非表示になります。◆参考にさせていただいた記事
- 投稿日:2019-05-02T13:37:12+09:00
Laravelとdockerの開発環境でMailHogを使ってメール送信する
Laravelでメールを送信するアプリケーションを開発している間は、実際のメールアドレスにメールを送信したくはありません。ローカルでの開発環境ではMailHogを使って、「ダミー」のメールボックスへメールメッセージを送る方法がとても便利です。
以前の Laravel5の環境をdockerで構築した記事 の続きです。
環境
- Laravel 5.8.3
- PHP 7.3.4
Laravel環境構築してテストメールを送信するまで
$ git clone git@github.com:ucan-lab/docker-laravel5.git $ cd docker-laravel5 $ docker-compose up -d --build $ docker-compose exec app composer create-project --prefer-dist "laravel/laravel=5.8.*" .ここまでのコマンドでLaravelの環境構築が完了です。
$ docker-compose exec app ash $ sed -i -e "s/MAIL_HOST=.*/MAIL_HOST=mail/" .env $ sed -i -e "s/MAIL_PORT=.*/MAIL_PORT=1025/" .env $ php artisan tinker Mail::raw('test mail',function($message){$message->to('test@example.com')->subject('test');});
.env
のMAIL_HOST
とMAIL_PORT
の設定を書き換えます。
tinkerを起動して、テストメールを送信してみます。テストメールを受信できていればokです。
MailHog とは
MailHogは開発者向けの電子メールテストツールです。
Laravelで送信したメールの内容をブラウザ上で確認できます。
宛先に設定した実際のメールアドレス宛には送信されません。Homebrewでインストールできたり、DockerHubにイメージが公開されているので導入が非常に簡単です。
- SMTPサーバーの標準ポートは
1025
- HTTPサーバーの標準ポートは
8025
- メモリ内のメッセージストレージを使用(コンテナを再起動するとクリアされる)
- 届いたメールはほぼリアルタイムで受信トレイに表示
docker-compose.yml の設定例
実際の設定はこちらのご参考ください。
https://github.com/ucan-lab/docker-laravel5/pull/8/filesDockerHubにMailHogのイメージが登録されているので、
docker-compose.yml で指定すると簡単に導入できます。# docker-compose.yml mail: image: mailhog/mailhog ports: - ${MAILHOG_PORT}:8025Laravel側の
.env
のMAIL_HOST
には コンテナ名を指定します。
MAIL_PORT
には MailHog の SMTP のポート番号を指定します。# .env MAIL_HOST=mail MAIL_PORT=1025参考
- 投稿日:2019-05-02T02:50:50+09:00
Laravelのtrait Macroableを使って動的にメソッドを追加する
Macroableとは
Laravelをインストールしたときに一緒にインストールされるtraitです。
vendor\laravel\framework\src\Illuminate\Support\Traits\Macroable.phpにあります。
Macroableをuseするとそのクラスは定義されたクラス以外でも動的にメソッドを追加できるようになります。
ソースそのものは108行しかないのでシンプルです。
以下メソッド
public static function macro($name, $macro) public static function mixin($mixin) public static function hasMacro($name) public static function __callStatic($method, $parameters) public function __call($method, $parameters)仕組みとしてはmacro()でメソッド名と実行する内容を登録して、マジックメソッドの __call() か __callStatic() で使えるようにするといったものです。
hasMacro()は名前の通りmacro()で登録してあるかチェックするためのメソッドです。
mixin()は5.5から追加されました。名前で推測できるように引数にインスタンスを渡して、そのインスタンスのメソッドを使えるようにするためのものと判断出来ます。
ですが、癖が強いので使い勝手が良いかどうかは疑問です。後述します。使い方
class Human{ use \Illuminate\Support\Traits\Macroable; public function punch(){ echo "パンチ"; } } Human::macro('kick', function(){ echo "キック"; }); $human = new Human(); $human->punch(); $human->kick(); //結果 パンチキックLaravelで使うときはProviderで登録するのがまとまりがあって良いでしょう。
mixin()の使い方
まずはmixinメソッドがどのように定義されているか見てみましょう。
public static function mixin($mixin) { $methods = (new ReflectionClass($mixin))->getMethods( ReflectionMethod::IS_PUBLIC | ReflectionMethod::IS_PROTECTED ); foreach ($methods as $method) { $method->setAccessible(true); static::macro($method->name, $method->invoke($mixin)); } }リフレクションを使い、public,protectedのメソッドの一覧を取得してforeachでmacro()で登録する流れになっています。
ですが見てください。macroメソッドの第二引数の渡し方。$method->invoke($mixin)普通にメソッドの呼び出しをしています。
もしも直感的にメソッドを使うなら次のように間違って書いてしまうでしょう。class Cat{ public function say(){ echo "にゃー"; } } Human::macro('kick', function(){ echo "キック"; }); Human::mixin(new Cat()); $human = new Human(); $human->punch(); $human->kick(); //$human->say(); BadMethodCallExceptionが発生する //結果 にゃーパンチキックsay()を呼び出していないのに にゃー と鳴いてしまってます。
say()を呼び出すとBadMethodCallExceptionになります。どう解決しましょうか。
答えはシンプルです。say()メソッドの返り値をクロージャーにします。
class Cat{ public function say(){ return function(){ echo "にゃー"; }; } }このように定義すればsay()を呼び出してもBadMethodCallExceptionが発生しません。
結果はパンチキックにゃーの順で呼び出されます。mixin()は無名クラスを使って登録するのがベターな気がします。
Human::mixin(new class{ public function say(){ return function(){ echo "にゃー"; }; } });Macroableの使い所は?
第三者に拡張性のあるクラスを提供したい!といった場合くらいですかね。
自分で率先して使う場面というのはあんまり無いでしょう。
バグの原因になりそうです。実際の用途としてはLaravelで定義してあるクラスを拡張するのに使用するといったところでしょうか。
余談
日付操作ライブラリのCarbonにも同じようなMacroableのようなコードがあります。
個人的にマジックメソッドの __call() や __callStatic() はソースが追いにくくなるため苦手です。
- 投稿日:2019-05-02T02:33:49+09:00
Laravelチュートリアル - 汎用業務Webアプリを作る(1/4) Laradockで環境構築
はじめに
これまで私はDjangoでいくつかのWebアプリを作ってきましたが、とある事情から今後Laravelに触れる必要が出てきました。
そこで、既存のDjangoアプリをLaravelで再現するチュートリアル記事を作成し、その過程を通してLaravelについて学ぶことにしました。
題材には、CRUD機能、検索機能、認証機能を持ち、Djangoを勉強する際にも大変お世話になった、下記Webアプリとさせていただきました。
Djangoチュートリアル - 汎用業務Webアプリを最速で作る - Qiita
チュートリアル全体の構成
Laradockで環境を構築する(本記事)
検索機能を作る(作成予定)
認証機能を作る(作成予定)
環境
- macOS High Sierra 10.13.6
- php 7.2.16
- Laravel 5.5.45
- PostgreSQL 9.6.2
1. Laradockで環境構築する
Laradockのコピー
プロジェクトのルートとなるディレクトリに、Laradockをコピーします。
$ git clone https://github.com/Laradock/laradock.git
laradock
ディレクトリ配下のenv-example
ファイルをコピーし、.env
ファイルを作成します。$ cd laradock laradock $ cp env-example .envPostgreSQLのバージョンの指定
PostgreSQLは9.6.12を使用することにします。
PostgreSQLのDockerファイルを以下の通り編集します。laradock/postgres/DockerfileFROM postgres:9.6.12 LABEL maintainer="Ben M <git@bmagg.com>" CMD ["postgres"] EXPOSE 5432コンテナの起動
コンテナを起動します。
laradock $ docker-compose up -d --build workspace postgres php-fpm nginxLaravelのインストール
Laravelをインストールします。
まず、起動したコンテナの中に入ります。
laradock $ docker-compose exec workspace bash続いて、Laravelをインストールします。
バージョンは5.5.*
にします。
また、Laravelとしてのプロジェクト名は、src
にします。/var/www# composer create-project --prefer-dist laravel/laravel src "5.5.*"データベースを作成する
コンテナの中に入ったまま、今度はPostgreSQLに接続し、データベースを作成します。
まず、PostgreSQLに接続します。
/var/www# psql -U default -h postgresパスワードを入力します。
Password for user default:続いて、データベースを作成します。
データベース名は、sample
にします。default=# create database sample;PostgreSQLとの接続を終了します。
default=# \qLaravelのタイムゾーンを日本時間にする
Laravelのタイムゾーンを日本時間にします。
src/config/app.php<?php return [ //略 'timezone' => 'Asia/Tokyo', //略 ];.envファイルの編集
Laravelの.envファイルを編集し、LaravelからPostgreSQLに接続できるようにします。
src/.envDB_CONNECTION=pgsql DB_HOST=postgres DB_PORT=5432 DB_DATABASE=sample DB_USERNAME=default DB_PASSWORD=secret最後に
以上で環境構築は完了です。
次の記事では、テーブルとCRUD画面の作成を行います。
参考
- 投稿日:2019-05-02T02:12:41+09:00
Laravel + Heroku (on Vagrant)を最初から
はじめに
Laravelを使って開発がしたい。本番デプロイのデモをHerokuでさくっと行いたい。
そんな私の需要に答えて、手順をまとめてみました。前提
- Herokuにユーザ登録済
- VirtualBox, Vagrantをインストール済 (vagrant v2.2.4)
- Laravel Homesteadを使います
- 実行環境はwindows10使っています(macでも大丈夫)
Homestead
Homesteadとは
Laravelをすぐに使える環境を提供してくれる優れたツールです。
HomesteadはWindowsやMac、Linuxシステム上で実行でき、Nginx WebサーバとPHP7.2、PHP7.1、PHP7.0、PHP5.6、MySQL、PostgreSQL、Redis、Memcached、Node、他にも素晴らしいLaravelアプリケーションを開発するために必要となるものすべてを含んでいます。
公式通りにHomesteadのBOXを追加し、ソースをクローンします。
hostOSvagrant box add laravel/homestead git clone https://github.com/laravel/homestead.git ~/HomesteadHomesteadのバージョンはこの時点で最新のタグを使用しています。
hostOScd ~/Homestead git tag --list > etc... > v8.1.0 > v8.2.0 git checkout v8.2.0 # 設定ファイルの生成 bash init.sh設定ファイルの変更
Homestead.yaml# mariaDBを使う場合は追記 mariadb: true folders: - map: C:/Site/ to: /home/vagrant/code sites: - map: homestead.test to: /home/vagrant/code/homestead/public - map: laravelapp.test to: /home/vagrant/code/laravelapp/public databases: - homestead - laravelapp私の場合はCドライブ直下に
Site
ディレクトリを作成し、その中に各プロジェクトをまとめています。
sites
では上記のように複数設定することができますので、to: /home/vagrant/code
より使いやすいです。Homesteadを立ち上げます。
hostOSvagrant up --provision
ただ通常、作業は各プロジェクトで行うため、どこからでも起動できることが望ましいです。
エイリアスを登録しておくと捗るでしょう。hostOSalias homestead='function __homestead() { (cd ~/Homestead && vagrant $*); unset -f __homestead; }; __homestead'コマンド自体はvagrantと同じです。
hostOS# vagrant upが済んでいたら実行しなくていいです homestead up --provision起動には時間がかかりますので、今のうちにプロジェクトに移動します。
そしてエディタを立ち上げます(VsCode使っています)。hostOScd /C/Site/homestead code .
Ctrl+@
を叩いてターミナルを開きます(Mac:Ctrl+Shift+@)。
windowsの場合はGitBashが開くようにしておくと少し幸せかもしれません。今のうちに
hosts
の設定もしておきます。windowspowershell -NoProfile -ExecutionPolicy unrestricted -Command "start notepad C:\Windows\System32\drivers\etc\hosts -verb runas"windowsは
windowsキー+R
を押してコピペすると管理者権限でファイルを開くことができます。
macの場合はターミナルのまま普通に開きます。macsudo vi /etc/hosts
hosts設定
hosts# Homestead.yamlでIP変更できます 192.168.10.10 homestead.testさて、仮想環境が起動したらゲストにSSH接続します。
hostOShomestead ssh「homestead」と大きな文字で迎えられたら成功です。
laravelプロジェクトを立ち上げる
まずはプロジェクトに移動します。
guestOScd ~/code/homesteadLaravelのプロジェクトを作成します。今回は
5.7
にします。guestOScomposer create-project laravel/laravel ./ --prefer-dist "5.7.*"起動したら一度、アクセスしてみます。表示されました。
ここでGit管理しておくといいと思います。
guestOSgit init git add . git commit "first commit"windowsの場合、
.gitattributes
の* text=auto
をコメントアウトしてしまいますがどうなんでしょうね(ひとりごと)。Herokuにログインする
homestead環境でHerokuにデプロイしたいと思います。
herokuをCLIで操作するためのコマンドを実行します。guestOSsudo snap install heroku --classicherokuにログインします。「なにかキーを押してね」と言われるので押します。
guestOSheroku login > heroku: Press any key to open up the browser to login or q to exit:すると、herokuのログイン画面がブラウザで自動的に開きます。
…ゲスト側なので開きませんね。
開かない場合も、下記のようなメッセージが出てきますので、指定URLに手動でアクセスしましょう。guestOSWarning: Cannot open browser. Go to https:<ごにょごにょ>これでHerokuにログインできました。
Herokuにデプロイ
デプロイする前に
Procfile
を作成する必要があります。
linuxのps
コマンドで確認できるようなプロセスを起動できるみたいです。
詳しく知りたい方は公式へゴーゴゴー!The Procfile | Heroku Dev Center
今の私のざっくりした認識は「WEBサーバを○○で起動するためのコマンド」です。
今回はwebサーバにapacheを使用しますので、下記のように記述します。web: vendor/bin/heroku-php-apache2 public/ちなみに
public/
はバーチャルホストで設定するときのドキュメントルート指定みたいなものなので、記述しない場合はhomestead.test/public
にアクセスしないと表示されませんし、色々不都合が起きます。さて、再度コミットした後、プロジェクトをherokuと関連付けます。
guestOSheroku create # または任意の名前でcreate heroku create homestead
これで
git remote -v
でリモート情報にheroku
が追加されていることが分かるでしょう。
あとは下記コマンドでデプロイをします。guestOSgit push heroku masterこのコマンド時に色々と処理が走っているのが目で見て分かると思います。
ここで内部的にアプリをビルドしているのですが、herokuは自動でコードを認識し、適切なビルドを行ってくれます。
ですが、phpとnode.jsなどのソースが混在していると誤認識される場合もあるようです。
その場合は下記のようにオプションを指定するか、guestOSheroku create --buildpack heroku/php
buildpacks:set
コマンドで後付けの指定をしましょう。guestOSheroku buildpacks:set heroku/php確認すると、適切なビルドが指定されていると思います。
guestOSheroku buildpacks > heroku/php
さて、デプロイが問題なく終わったところでブラウザで確認します。
…映っていませんので最後の仕上げを行います。Herokuでアプリ設定
Laravelプロジェクトを生成した際に
.env
ファイルもさり気なく生成されています。
.env
は環境ごとに設定するファイルのため.gitignore
で管理除外されています。
そのため、下記のようにHeroku用の設定をする必要があります。guestOSheroku config:set APP_NAME=Homestead heroku config:set APP_KEY=$(php artisan key:generate --show) heroku config:set APP_URL=https://homestead.herokuapp.com heroku config:set SESSION_DRIVER=fileこれで私の場合、正常に映りました。
最後に
公式サイトを見れば、どこかに載っている情報だったりしますが、最初はコマンドも暗記できていないのであちこち見に行って時間を消費ばかりしました。需要があるか分かりませんが、きっと未来の私はこれを見て喜ぶと思いますので書いてよかった。どや。
※サンプルとして
https://homestead.herokuapp.com
などと記述していますが、実際にはhomestead
は作成していません。もし参考にされる場合は、各々頭で置き換えて実行してください。
- 投稿日:2019-05-02T01:43:32+09:00
Homestead MailHog を利用する
Laravel 簡単なアプリケーション作成(2)
イベントを利用して会員登録時にメールを送る機能を追加
Laravelを利用して簡単なアプリケーションを作成する手順
今回はイベントを使用して会員登録時にメールを送信する機能を追加するイベントとは、プログラムで発生する様々な事象を別のオブジェクトに通知し、その事象に対応した処理【リスナー】を実行する機能。
環境
前回までの環境を利用する
手順概要
- メール送信設定
- イベントとリスナーファイルの設定
- リスナークラスの実装
メール送信設定
Homesteadに同梱される"MailHog"というSMTPサーバを使用する。
管理画面は
http://homestead.test:8025 にアクセスすることでGUI表示できる。sampleapp/.env を編集
sampleapp/.envMAIL_DRIVER=smtp MAIL_HOST=localhost MAIL_PORT=1025 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=nullリスナーファイルの設定
通常、イベントとリスナーの実装が必要だが、イベントはLaravelに含まれるものを利用するためリスナーのみ実装する。
下記ファイルに追加してリスナーを定義する。app/Providers/EventServiceProvider.phpprotected $listen = [ Registered::class => [ SendEmailVerificationNotification::class, ], 'App\Events\Event' => [ 'App\Listeners\EventListener', ], 'Illuminate\Auth\Events\Registered' => [ 'App\Listeners\RegisteredListener', ], ];sampleappディレクトリに移動し、下記コマンドを実行してリスナークラスを作成する。
app以下にListenerディレクトリが生成され、EventListener.php, RegisterListener.phpが生成されている。$ php artisan event:generate Events and listeners generated successfully! $生成されてるか確認
$ ls app/ Console Events Exceptions Http Listeners Providers User.php $ tree -L 1 app/Listeners/ app/Listeners/ ├── EventListener.php └── RegisteredListener.php 0 directories, 2 files $リスナークラスの実装
Listeners/RegisteredListenered.php に処理を追加
Listeners/RegisteredListenered.php<?php namespace App\Listeners; // add for mailer use App\User; use Illuminate\Auth\Events\Registered; use Illuminate\Mail\Mailer; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; class RegisteredListener { private $mailer; private $eloquent; /** * Create the event listener. * * @return void */ public function __construct(Mailer $mailer, User $eloquent) { $this->mailer = $mailer; $this->eloquent = $eloquent; } /** * Handle the event. * * @param Registered $event * @return void */ public function handle(Registered $event) { $user = $this->eloquent->findOrFail($event->user->getAuthIdentifier()); $this->mailer->raw('会員登録完了しました。', function($message) use ($user){ $message->subject('会員登録メール')->to($user->email); }); } }
- 投稿日:2019-05-02T00:42:37+09:00
LaradockでLaravel Mixを行う際の注意点
LaravelのLaravel Mixでスタックしたことのまとめ
- npm run watch が動作しない。
laradockはdocker上で動いているため、
npm run watch
をしただけではダメ。npm run watch-pollこれを入力する必要がある。
参考
「Laravel mix事始め」
https://qiita.com/ryosukes/items/24a556b9e634c183f93b