20190714のlaravelに関する記事は7件です。

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 ~/.bashrc

3,プロジェクトを作成する

ここまでできたらプロジェクトを作るのですが、
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もいちいちインストールしなきゃいけない。
めんどくさいですね。)

ここから色々やっていくぞ〜

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

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 update

nginxインストール・設定

インストール
# apt-get install nginx

確認
# nginx -v

起動、自動起動設定
##systemctl start nginx
# systemctl enable nginx

ブラウザで表示確認。
http://Raspberry PiのIPアドレス

Welcomeされる。
キャプチャ3.PNG

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.php

phpinfo表示されたらOK。「あ」と表示されなくても大丈夫。
キャプチャ2.PNG

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 mariadb

Laravel環境セットアップ

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アドレス

白いのが表示されたらOK
キャプチャ.PNG

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

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/
   └─  Dockerfile

docker-compose.yml

version: '2'
services:
  nginx:
    image: nginx
    ports:
      - "80:80"
  laravel:
    image: laravel

Dockerfile(nginx)

FROM nginx:1.17-alpine

# ローカルから設定ファイルをコピー
COPY  default.conf /etc/nginx/conf.d/default.conf

default.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 --squash

Laravelコンテナビルド

docker build laravel/. -t laravel --squash

docker-composeで起動

docker-compose up

ブラウザで表示を確認

http://localhost:8000 にアクセスすることで以下のサンプルを表示します。
スクリーンショット 2019-07-06 22.57.48.png

解説

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の書き方やコンテナ特有の設定等はお伝えできたかと思います。

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

Laravel + Nuxt + Fargate + ALBでドメインを設定しhttps通信を実現する

下準備

下記の手順でドメインの名前解決は完了させる
【AWS】お名前.com で取得した独自ドメインを Amazon Route 53 で名前解決して EC2 インスタンスの Web サーバーにアクセスさせる手順

証明書の発行

ACM証明書発行をDNS検証で行う【エンジニアブログより】

お名前で購入したドメインをAWSのALBにhttpsの設定して使う方法。

ALBに対してhttps通信の設定

ALBで今はリダイレクトもやってくれてNginxでリダイレクトの設定を行わなくてもいいらしい

ALBを使ってる時はNginxでhttp->httpsへリダイレクトの設定しなくて良くなった

http(80ポート)をhttps(443)にリダイレクトを行う

image.png

ALBのセキュリティグループの設定にHTTPSを追加する

image.png

ALBのリスナーにHTTPSを追加する

image.png

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

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やっているという方がいましたら、ぜひ、知見をお聞かせください。

参考情報

モデルでドメイン知識を表現するとは何か・・・不変条件について、とても分かりやすい記事です

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

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

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

ssh(sftp)サーバーをLaravelのストレージとして利用する

はじめに

Laravelのファイルストレージで外部のサーバーのファイルを取り扱いたい場面に遭遇して解決方法が見つかったのでメモとして残します。

ファイルストレージは標準ではローカル ディスクとAmazon S3、Rackspace、ftp用のアダプタが組み込まれています。調べてみるとFlysystemというライブラリの機能で実現されていて、アダプタを追加すれば様々なデバイスをストレージとして利用できる仕組みになっています。

Laravelには入っていませんがFlysystemには標準でsftpのアダプタが用意されています。これを利用すると任意のsshサーバーをsftp経由でLaravelのストレージとして利用可能です。

手順

  1. composer で sftp アダプタのモジュールをインストール

    composer require league/flysystem-sftp
    
  2. サービスプロバイダでアダプタを追加する。

    <?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));
            });
        }
    }
    
  3. 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,
        ],
    ];
    

    接続先サーバーには対応する公開鍵を登録する。

  4. ストレージで利用する

    Storage::disk('rpx')->put('./a/test.txt', "hello rpx\n");
    
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む