- 投稿日:2019-07-14T18:56:17+09:00
Laravelのインストール
自分のパソコンにLaravelの開発環境を作ったので、
コマンド諸々忘れないように記録。1, composerインストール
$ brew install homebrew/php/composer
もしこれで、
Error: homebrew/php was deprecated.
This tap is now empty as all its formulae were migrated.こんなエラーが出たら、
$ brew install homebrew/core/composerこっちをうってみてください!これでいけます。
2, Laravelのインストール
Composerを使って、Laravelのインストーラーを
ダウンロードします。$ composer global require "laravel/installer"
そしたらパスを設定します。
$ vi ~/.bashrcで開いて、中身に
export PATH="$PATH:$HOME/.composer/vendor/bin"
を記述しました。そしたら読み込みます。
$ source ~/.bashrc3,プロジェクトを作成する
ここまでできたらプロジェクトを作るのですが、
composerコマンドでプロジェクトを作成します。$ laravel new {プロジェクト名}
というコマンドはよくない。らしい(理由が追えていない。。調べます。)
$ composer create-project --prefer-dist laravel/laravel {プロジェクト名}
できた!
そしたらサーバを起動しましょう!
$ php artisan serve
Laravel development server started: http://127.0.0.1:8000アクセスするとLaravelのページが表示されます。
(止める時はcontrol + c)無事完成です!
まとめ
composerって言うのがしれっと出たけど、
PHPのプロジェクトが必要とするライブラリやパッケージを管理する
「ライブラリ依存管理ツール」で、依存関係の解決に便利みたい。
(例えばAというパッケージの利用にBが必要な場合、
パッケージAを宣言すれば自動的にBインストールしてくれる、
みたいな感じ。これが手作業だとAもBもいちいちインストールしなきゃいけない。
めんどくさいですね。)ここから色々やっていくぞ〜
- 投稿日:2019-07-14T17:47:47+09:00
Raspberry Piで Laravel5.8 PHP7.3 nginx1.14の環境構築
Raspberry Pi 3 Model B+ を購入。Laravelで作成したいアプリケーションがあったため環境構築。
それとpythonスクリプトを使って有機ELにいろいろ表示させるものを作ってみようかと。
とりあえずLaravelインストールまで。ラズパイということでApacheでなく軽量なnginxにしました。
あまり効率的でない手順かもしれないですがご勘弁を。[前提]
Raspberry Piセットアップ済み (OSはRaspbian)
あとはvimをインストール、デフォルトエディタ変更とbashrcを自分用に修正したくらいですとりあえずアップデート
rootユーザからの作業 $ sudo su - アップデート # apt-get updatenginxインストール・設定
インストール # apt-get install nginx 確認 # nginx -v 起動、自動起動設定 ##systemctl start nginx # systemctl enable nginxブラウザで表示確認。
http://Raspberry PiのIPアドレスphp-fpmインストール・設定
インストール # apt-get install php7.3-fpm nginx + php設定 # vi /etc/nginx/sites-available/default ※44行目あたり (index.php追加) [変更前] # Add index.php to the list if you are using php index index.html index.htm index.ngin-debian.html; [変更後] # Add index.php to the list if you are using php index index.html index.htm index.ngin-debian.html index.php; ※56から63行目のコメントアウト削除 (62行目のfastcgi_passの行のみコメントのまま) location ~ \.php$ { … fastcgi_pass unix:/run/php/php7.3-fpm.sock; … # fastcgi_pass 127.0.0.1:9000; } PHP設定 # vi /etc/php/7.1/fpm/php.ini ※775行目 [変更前] ;cgi.fix_pathingo=1 [変更後] cgi.fix_pathingo=0 再起動 # systemctl restart php7.3-fpm # systemctl enable php7.3-fpm # systemctl restart nginx PHP確認用 # echo '<?php phpinfo(); ?>' > /var/www/html/test.phpブラウザで表示確認。
http://Raspberry PiのIPアドレス/test.phpphpinfo表示されたらOK。「あ」と表示されなくても大丈夫。
Mariaインストール・設定
インストール # apt-get install php7.3-mysql # apt-get install mariadb-server 確認 # mysqld -V # mysql -V 設定 # mysql_secure_installation ※rootパスワード設定、他は基本 Y+Enter 管理者権限でログインできるよう設定 # mysql -u root > use mysql; > update user set plugin='' where user='root'; > flush privileges; > quit; 先ほど設定したパスワードでログイン確認 # mysql -uroot -p 自動起動しておく systemctl enable mariadbLaravel環境セットアップ
Composerでやります # apt-get install composer 確認 # composer -V ディレクトリ作成 # mkdir /var/www/laravel ↓自分だけの開発環境のため安易に済ませている。 # chmod 777 /var/www/laravel project作成に必要 # apt-get install php-xml piユーザに戻る(もしくはLaravel実行ユーザ) # exit project作成(ちょっと時間かかる) $ composer create-project laravel/laravel /var/www/laravel Laravelバージョン確認 $ cd /var/www/laravel/ $ php artisan --version rootに戻る $ sudo su - DocumentRoot設定を書き換え # vi /etc/nginx/sites-available/default ※41行目以下に変種 # root /var/www/html; root /var/www/laravel/public; nginx再起動 # systemctl restart nginx failed to open stream対策 ↓自分だけの開発環境のため安易に済ませている。 # chown -R www-data:www-data /var/www/laravel/storage # chmod -R 757 /var/www/laravel/storageブラウザ確認
ブラウザで表示確認。
http://Raspberry PiのIPアドレス
- 投稿日:2019-07-14T17:27:35+09:00
Nginxとphp-fpmを用いてLaravalを表示する
どうも、若松です。
前回はLaravelをDockerで起動し、イメージを軽量化するところまで行いました。
https://qiita.com/t_wkm2/items/245288e42083ac7e4057今回は、
php artisan
でのサーバ起動ではなく、Nginx+php-fpmでLaravelを表示するところまでを行います。設定
ディレクトリ構造
docker/ ├─ docker-compose.yml ├─ nginx/ | ├─ Dockerfile | └─ default.conf └─ laravel/ └─ Dockerfiledocker-compose.yml
version: '2' services: nginx: image: nginx ports: - "80:80" laravel: image: laravelDockerfile(nginx)
FROM nginx:1.17-alpine # ローカルから設定ファイルをコピー COPY default.conf /etc/nginx/conf.d/default.confdefault.conf(nginx)
server { listen 80; server_name localhost; location / { # ドキュメントルート設定 root /var/www/laravel/public; fastcgi_split_path_info ^(.+\.(?:php|phar))(/.*)$; fastcgi_intercept_errors on; fastcgi_index index.php; include fastcgi_params; # FastCGIの向き先をLaravelコンテナに設定 fastcgi_pass laravel:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }Dockerfile(laravel)
FROM amazonlinux:2 as vender # PHPインストール RUN amazon-linux-extras install -y php7.3 RUN yum install -y php-pecl-zip php-mbstring php-dom # Composerインストール RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" RUN php -r "if (hash_file('sha384', 'composer-setup.php') === '48e3236262b34d30969dca3c37281b3b4bbe3221bda826ac6a9a62d6444cdb0dcd0615698a5cbe587c3f0fe57a54d8f5') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" RUN php composer-setup.php RUN php -r "unlink('composer-setup.php');" RUN mv composer.phar /usr/local/bin/composer # 環境変数設定 ENV COMPOSER_ALLOW_SUPERUSER 1 ENV COMPOSER_HOME "/opt/composer" ENV PATH "$PATH:/opt/composer/vendor/bin" # Laravelインストール RUN composer global require "laravel/installer" # Laravelプロジェクト作成 WORKDIR /var/www RUN composer create-project laravel/laravel laravel FROM php:7.3-fpm-alpine # ビルド用コンテナから必要なコンテンツをコピー COPY --from=vender --chown=www-data:www-data /var/www/ /var/www/操作
コマンドは全て最上位ディレクトリの
docker
から行う想定です。Nginxコンテナビルド
docker build nginx/. -t nginx --squashLaravelコンテナビルド
docker build laravel/. -t laravel --squashdocker-composeで起動
docker-compose upブラウザで表示を確認
http://localhost:8000 にアクセスすることで以下のサンプルを表示します。
解説
Nginxコンテナ
ベースイメージ
FROM nginx:1.17-alpineベースイメージにはNginx公式リポジトリにある
nginx:1.17-alpine
を使用しました。
2019/7/14現在のNginxの最新が1.17であり、軽量化を目的にAlpineLinux版を使いたかったためです。
80番ポートの開放やNginxの起動についてはベースイメージ内で既に設定されているため、今回のDokcerfileには記述していません。default.conf
COPY default.conf /etc/nginx/conf.d/default.conf設定はローカルに用意した
default.conf
をイメージにコピーして配置します。
FastCGI設定のほとんどは一般的な設定のため、特徴的なものだけ解説します。root
root /var/www/laravel/public;ドキュメントルートはLaravelコンテナのアプリケーションが配置されているディレクトリを指定します。
fastcgi_pass
fastcgi_pass laravel:9000;UnixソケットかTCPを指定できますが、Unixソケットではコンテナを越えられないため、TCPで設定します。
アドレスの指定にはDockerのNamespaceを利用します。Laravelコンテナ
前回のDockerfileからの差異のみ解説します。
ベースイメージ
FROM php:7.3-fpm-alpine実行用イメージのベースを
php:7.3-alpine
からphp:7.3-fpm-alpine
に変更しました。
これによってデフォルトでphp-fpmがインストールされた状態から設定を行えばよくなります。
9000番ポートの開放やphp-fpmの起動についてはベースイメージ内で既に設定されているため、今回のDokcerfileには記述していません。Laravelコンテンツのオーナー変更
COPY --from=vender --chown=www-data:www-data /var/www/ /var/www/
php:7.3-fpm-alpine
のphp-fpm初期設定では、php-fpmのワーカ起動ユーザはwww-data
になっています。
COPYコマンドで配置したLaravelコンテンツはrootがオーナーになってしまうため、そのままだと権限エラーとなります。
そこで、--chown
オプションを使用し、オーナーをwww-data
へ変更しています。
--chown
オプションはBashでいうところのchown -R
となるため、ディレクトリがあっても再帰的に処理してくれます。docker-compose
今回からコンテナが2つになったため、操作簡略のために
docker-compose
を導入しました。
docker-compose
には起動時のオプション設定や、複数コンテナのビルド、依存関係制御など様々な機能がありますが、ここではコンテナ起動/停止とポートオプションのみ使用しています。複数コンテナのビルドを使用しない理由
本当であれば使用したかったのが本音です。
しかしながら2019/7/14現在、BuildKitやsquashオプションに対応していないため、あえてdockerコマンドでビルドを行っています。Tips
コンテナイメージ内にあるファイルをローカルにコピーする
設定ファイルを作成する際に、デフォルトの設定をローカルにコピーし、それを改変して作成していくことはよくあると思います。
コンテナではSCPが使えないため、代わりにdocker cp
コマンドを使用します。
今回のdefault.confの場合は、以下のようにしてコピーしました。docker run -d --name nginx nginx:1.17-alpine docker cp $(docker ps --filter name=nginx -aq):/etc/nginx/conf.d/default.conf .コンテナイメージの履歴を確認する
FROMで使用するベースイメージには予めポートの開放やデーモンの起動が設定されている場合があります。
今回でいうところのNginxやphp-fpmですね。
それを確認するにはdocker history
コマンドを使用します。
例としてphp-fpmのhistoryを確認してみます。docker history --format {{.CreatedBy}} php:7.3-fpm-alpine /bin/sh -c #(nop) CMD ["php-fpm"] /bin/sh -c #(nop) EXPOSE 9000 /bin/sh -c #(nop) STOPSIGNAL SIGQUIT /bin/sh -c set -eux; cd /usr/local/etc; if… /bin/sh -c #(nop) WORKDIR /var/www/html /bin/sh -c #(nop) ENTRYPOINT ["docker-php-e… /bin/sh -c docker-php-ext-enable sodium ...このようにズラズラとコマンドが表示されるかと思います。
これは実行日次のtimestampが新しい順で上から並んでいます。
これを見るとベースイメージの最後に、9000番ポートの開放とphp-fpmの実行が行われているため、今回のDockerfileではポートの開放とデーモンの起動が不要なことがわかります。まとめ
Nginx+php-fpmに加えて、docker-composeも導入してみました。
そんなに特殊な設定を行ったわけではありませんが、Dockerfileの書き方やコンテナ特有の設定等はお伝えできたかと思います。
- 投稿日:2019-07-14T13:50:27+09:00
Laravel + Nuxt + Fargate + ALBでドメインを設定しhttps通信を実現する
下準備
下記の手順でドメインの名前解決は完了させる
【AWS】お名前.com で取得した独自ドメインを Amazon Route 53 で名前解決して EC2 インスタンスの Web サーバーにアクセスさせる手順証明書の発行
お名前で購入したドメインをAWSのALBにhttpsの設定して使う方法。
ALBに対してhttps通信の設定
ALBで今はリダイレクトもやってくれてNginxでリダイレクトの設定を行わなくてもいいらしい
ALBを使ってる時はNginxでhttp->httpsへリダイレクトの設定しなくて良くなった
http(80ポート)をhttps(443)にリダイレクトを行う
ALBのセキュリティグループの設定にHTTPSを追加する
ALBのリスナーにHTTPSを追加する
- 投稿日:2019-07-14T03:07:40+09:00
Laravel vs Symfony(DDDの場合)
PHP で DDD(ドメイン駆動設計)をする案件でウェブフレームワークの選定を行いました。
フレームワーク選定にあたり、以下の方針を立てました。
- 実績のあるフレームワークから選定(Laravel か Symfony の2択としました)
- DDD が提唱している不変条件をモデルに実装出来ること
- フレームワークと戦わない(目的達成の為に Hack 等の小細工をしない)
- 人がレビュー等で注意するといった回避策で妥協しない
- なるべくシンプルにフレームワークを使う
本来、フレームワークはドメイン層に関心がなく DDD に制約を与えないはずです。
一方で DDD はドメイン層以外には具体的な実装方法を提示していません。
DDD をやるのにどのフレームワークを使ってもいいのでは?と思うのですが、実際にはそうではありませんでした。フレームワークが採用している ORM によって DDD しやすいものと困難なものがあります。
FW ORM パターン 調査結果 Laravel Eloquant Active Record 設定が無く簡単
モデルで constructor や public, private といったアクセス修飾子が自由に使えない
モデルに不変条件の実装ができずDDDに不向きSymfony Doctrine Data Mapper DBのテーブルカラムとモデル属性のマッピング設定が必要
モデルで constructor や public, private といったアクセス修飾子が自由に使える
モデルに不変条件の実装ができてDDDに向いている上記表の結果から PHP での DDD 案件では Symfony を採用することに決定しました。
我々は Laravel をとても気に入っていたので、なかなか Laravel をあきらめる気にはなれませんでした。しかし、色々と調べたのですが良い方法は見つかりませんでした。Active Record でもうまくDDDやっているという方がいましたら、ぜひ、知見をお聞かせください。
参考情報
モデルでドメイン知識を表現するとは何か・・・不変条件について、とても分かりやすい記事です
- 投稿日:2019-07-14T02:42:09+09:00
Laravelでのマルチ認証でログイン後のリダイレクト先をroleで変更する方法
概要
セッション衝突問題とかは置いておいてシンプルにroleを使ってログイン先を変更する話です。
Laravelデフォルトの認証を使います。UsersテーブルにRoleを追加
migrationファイルでroleを追加しておきまましょう。
roleは数値でもenumでも良いです。
今回は admin,teacher,parentを用意したと仮定して進めます。redirectTo()
Auth\LoginControllerにredirectToメソッドを定義してあげます。
そうすると既に定義してあるprotected $redirectToではなくredirectTo()の戻り地でredirect先が決定するようになります。
この辺りのことは\Illuminate\Foundation\Auth\RedirectsUsers.phpに書いてあります。
trait RedirectsUsers { /** * Get the post register / login redirect path. * * @return string */ public function redirectPath() { if (method_exists($this, 'redirectTo')) { return $this->redirectTo(); } return property_exists($this, 'redirectTo') ? $this->redirectTo : '/home'; } }traitがtrait先のコントローラーでメソッドかプロパティの定義を期待しているのはちょっと変わった実装ですね。
LoginControllerにredirectTo()を実装
public function redirectTo(){ $role = $this->guard()->user()->role; if($role === 'admin'){ return '/admin'; } if($role === 'teacher'){ return '/teacher'; } if($role === 'parent'){ return '/parent'; } return '/'; }roleに当てはまらなかったら例外投げても良いのですが今回は'/'にします。
まとめ
これでログイン後のリダイレクト先を変更することが出来ました。
role別に認証や認可でアクセス先を制限するのは別な実装が必要です。参考
Laravelで複数テーブルを使ったログイン認証を実装する
https://qiita.com/sakuraya/items/248d1bed5857c69e44c4
【Laravel】Laravel5.5でユーザーと管理者の認証(MultiAuth)を実装する(マルチログイン実装時のセッション分割対応)
https://qiita.com/sola-msr/items/65634826bcedf3ea4ca4
やはりお前らのMulti-Auth は間違っている
https://qiita.com/h1na/items/bbe4d17af21860de1930
- 投稿日:2019-07-14T00:47:07+09:00
ssh(sftp)サーバーをLaravelのストレージとして利用する
はじめに
Laravelのファイルストレージで外部のサーバーのファイルを取り扱いたい場面に遭遇して解決方法が見つかったのでメモとして残します。
ファイルストレージは標準ではローカル ディスクとAmazon S3、Rackspace、ftp用のアダプタが組み込まれています。調べてみるとFlysystemというライブラリの機能で実現されていて、アダプタを追加すれば様々なデバイスをストレージとして利用できる仕組みになっています。
Laravelには入っていませんがFlysystemには標準でsftpのアダプタが用意されています。これを利用すると任意のsshサーバーをsftp経由でLaravelのストレージとして利用可能です。
手順
composer で sftp アダプタのモジュールをインストール
composer require league/flysystem-sftp
サービスプロバイダでアダプタを追加する。
<?php namespace App\Providers; use Storage; use League\Flysystem\Filesystem; use League\Flysystem\Sftp\SftpAdapter; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { ... public function boot() { /** * flysystem に sftp 用のアダプタを追加する * @see https://flysystem.thephpleague.com/docs/adapter/sftp/ * @see https://readouble.com/laravel/5.5/ja/filesystem.html#custom-filesystems */ Storage::extend('sftp', function ($app, $config) { return new Filesystem(new SftpAdapter($config)); }); } }
config/filesystems.php
にディスクを追加する。<?php return [ ... /** * sftp アダプタで ssh サーバーを disk として登録する * * @see https://flysystem.thephpleague.com/docs/adapter/sftp/ */ 'rpx' => [ 'driver' => 'sftp', 'host' => '192.168.10.11', 'port' => 22, 'username' => 'vagrant', // 'password' => 'vagrant', 'privateKey' => '/home/vagrant/.ssh/id_rsa', 'root' => 'rpx', 'timeout' => 10, ], ];接続先サーバーには対応する公開鍵を登録する。
ストレージで利用する
Storage::disk('rpx')->put('./a/test.txt', "hello rpx\n");