20191128のlaravelに関する記事は12件です。

[Laravel]シーディングができなかった原因

UserTableSeederとFoldersTableSeederの二つをシーディングしたかったのだがうまくいかない

UserTableSeeder
class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
      DB::table("users")->insert([
          "name" => "test",
          'email' => 'dummy@email.com',
          'password' => bcrypt('test1234'),
          'created_at' => Carbon::now(),
          'updated_at' => Carbon::now(),
      ]);   
    }
}
FoldersTableSeeder
class FoldersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {

        $user = DB::table("users")->first();    

        $titles = ["プライベート","仕事","旅行"];
            foreach ($titles as $title) {
                DB::table("folders")->insert([
                "title" => $title,
                "user_id" => $user->id,
                "created_at" => Carbon::now(),
                "updated_at" => Carbon::now(),
            ]);
        }
    }
}

シーディングしようとするとこのエラーメッセージが出る

>php artisan db:seed

In FoldersTableSeeder.php
Trying to get property 'id' of non-object

FoldersTableSeederの「存在しないidというプロパティを取得しようとしている」。
「"user_id" => $user->id」の部分「id」が存在しない?

これはそもそもfirstメソッドでuserテーブルから取得したものだった。
もしかしてまだuserテーブルのシーディングができていないためデータがないのでは?

そこでuserテーブルから個別にシーディングすると

>php artisan db:seed --class=UsersTableSeeder
Database seeding completed successfully.

>php artisan db:seed --class=FoldersTableSeeder
Database seeding completed successfully.

成功。
やはりそういうことだったらしい。
複数のシーディングを同時に行うとテーブル間の関係がある場合うまくいかないことがあるようだ。

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

php7.4のLaravel環境をDockerでつくる

はじめに

DockerでLaravel環境作ってログインできるまでをハンズオン形式で進めます。
ローカル環境ちゃちゃっと作って開発したい人向けなので、詳細説明はありません。
せっかくなので最近リリースされたPHP7.4を使ってみます。

環境

  • php7.4
  • Apache2
  • MySQL5.7

0. 事前準備

0-1. Dockerインストール

Mac,Windows ProならDocker、Homeならdocker toolbox
dockerならHyper-V設定も忘れずに

会社でよくあるWindowsProなら↓を参考に
https://www.koreyome.com/web/docker-install-for-windows/
0. CPU仮想環境設定を確認
1. Hyper-V設定
2. Dockerインストール
3. docker-compose

インストール確認

$ docker-compose -v

0-2. VSCodeのターミナルを準備(任意)

初心者でもつまずかないよう統一して VSCode の Terminal を git bash にしています。
GitBashは入っている前提です。

  1. setting表示 (Ctl+,)
  2. terminal.integrated.shell.windows 入力
  3. Edit in settings.json 選択
  4. GitBash 選択
    (例) "terminal.integrated.shell.windows": "C:\\Program Files\\Git\\bin\\bash.exe"
  5. Terminal表示(Ctl+Shift+@)
  6. 1:bash になる

1. ディレクトリ構成とファイル作成

githubからcloneするか、ファイルを作成してください。

1-1. クローンする場合

git clone https://github.com/qvtec/laravel-docker-base.git

2-1. ファイルを作成する場合

ディレクトリ構成は下記のようになります

docker
├── db
│   └── my.conf
├── php-apache
│   ├── 000-default.conf
│   ├── default-ssl.conf
│   ├── php.ini
│   └── Dockerfile
├── .env
└── docker-compose.yml

Dockerfile 作成

composer も node もインストールしているので、別コンテナにしてもいいかもしれません

Dockerfile
FROM php:7.4.0-apache

COPY ./php.ini /usr/local/etc/php/
COPY ./sites/*.conf /etc/apache2/sites-available/

ARG TZ=Asia/Tokyo
ARG NODE_VERSION=8.x

RUN set -xe; \
    apt-get update -yqq && \
    apt-get install -yqq --no-install-recommends \
      apt-utils vim gettext git \
      default-mysql-client \
      # for gd
      libfreetype6-dev \
      libjpeg62-turbo-dev \
      libpng-dev \
      libwebp-dev \
      libxpm-dev \
      # for ImageMagick
      libmagickwand-dev \
      # for zip
      libzip-dev zip unzip \
      # for oniguruma
      libonig-dev \
    && docker-php-ext-install bcmath gettext mbstring mysqli pdo pdo_mysql zip \
    && docker-php-ext-configure mbstring --disable-mbregex \
    && docker-php-ext-configure zip --with-libzip \
    # gd
    && docker-php-ext-install -j$(nproc) iconv \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd \
    # imagick
    && pecl install imagick \
    && docker-php-ext-enable imagick \
    # enable mod_rewrite
    && a2enmod rewrite \
    # enable ssl
    && a2enmod ssl \
    # enable site
    && a2ensite default-ssl \
    # for ssl
    && apt-get update \
    && apt-get -y install ngrep \
    && openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 -subj "/C=JP/CN=localhost" \
        -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt \
    # set timezone
    && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone \
    # node
    && curl -sL https://deb.nodesource.com/setup_$NODE_VERSION | bash - \
    && apt-get install -y nodejs npm \
    # install composer
    && cd '/' \
    && php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
    && php composer-setup.php \
    && php -r "unlink('composer-setup.php');" \
    && mv composer.phar /usr/local/bin/composer

ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer
ENV PATH $PATH:/composer/vendor/bin

# laravel installer
RUN composer global require "laravel/installer" \
    && composer global require "laravel/envoy"

WORKDIR /var/www/html

docker-compose.yml 作成

docker-compose.yml
version: '3'

services:
  work:
    build:
      context: ./php
    volumes:
      - ${PROJECT_PATH}:/var/www/html:cached
      - node_modules:/var/www/html/node_modules
    ports:
      - ${WEB_PORT}:80
      - ${WEB_SSL_PORT}:443
    depends_on:
      - mysql

  mysql:
    image: mysql:5.7
    volumes:
      - mysql_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: ${DB_NAME}
      MYSQL_USER: ${DB_USER}
      MYSQL_PASSWORD: ${DB_PASS}
      TZ: ${TZ}
    ports:
      - ${DB_PORT}:3306

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=root
      - PMA_PASSWORD=root
    ports:
      - ${PMA_PORT}:80

  redis:
    image: redis:latest
    ports:
      - ${REDIS_PORT}:6379
    volumes:
      - redis_data:/data
    command: redis-server

volumes:
  mysql_data:
  node_modules:
  redis_data:

.env 作成

COMPOSE_PROJECT_NAME はプロジェクト名に変更する
使っていないポートにする

.env
COMPOSE_PROJECT_NAME=laravel-docker-base
PROJECT_PATH=../src

WEB_PORT=80
WEB_SSL_PORT=443
DB_PORT=3306
PMA_PORT=8080
REDIS_PORT=6379

TZ=Asia/Tokyo
DB_NAME=docker
DB_USER=docker
DB_PASS=secret

apache conf 作成

httpとhttpsの両方を作成します

000-default.conf
<VirtualHost *:80>
  ServerName local.test.com
  DocumentRoot /var/www/html/public/

  <Directory /var/www/html/public>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Require all granted
  </Directory>

  ErrorLog /var/log/apache2/error.log
  CustomLog /var/log/apache2/access.log combined
</VirtualHost>

ssl が不要の場合は、下記ファイルが不要で
Dockerfile の a2ensite default-ssl と # for ssl の項目を削除する

default-ssl.conf
<IfModule mod_ssl.c>
    <VirtualHost _default_:443>
        ServerName local.test.com
        DocumentRoot /var/www/html/public
        ErrorLog /var/log/apache2/error.log
        CustomLog /var/log/apache2/access.log combined
        SSLEngine on
        SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
        SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key
        <FilesMatch "\.(cgi|shtml|phtml|php)$">
            SSLOptions +StdEnvVars
        </FilesMatch>

        <Directory /usr/lib/cgi-bin>
            SSLOptions +StdEnvVars
        </Directory>
        Options Indexes FollowSymLinks

        <Directory "/var/www/html/public/">
            AllowOverride All
            Require all granted
        </Directory>
    </VirtualHost>
</IfModule>

php 設定ファイル

php.ini
[Date]
date.timezone = "Asia/Tokyo"

[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

mysql 設定ファイル

my.conf
[mysqld]
character-set-server=utf8
datadir = /var/lib/mysql

2. Docker起動

2-1. docker設定ファイルの作成

cloneしている場合は.env.exampleをコピーして.envを修正する

cd docker/
cp .env.example .env

2-2. ビルドと起動

docker-compose up -d --build

2-3. コンテナ接続

docker-compose exec work bash

3. Laravelインストール

workコンテナで実行する

3-0. Laravelプロジェクト作成

laravel new

3-1. Laravel設定ファイル

cp .env.example .env
DB_HOST=mysql
DB_USSERNAME=root
DB_PASSWORD=root

CACHE_DRIVER=redis
REDIS_HOST=redis

MAIL_DRIVER=log

3-2. composer install

composer dump-autoload
composer install

3-3. マイグレーション

php artisan migrate

4. hosts設定と表示

127.0.0.1 local.admin.com

https://local.admin.com/

表示できましたか?

エラー対応

ハンズオンでエラーになった人がいたので対処法

ERROR: for web Cannot create container for service web: b'Drive sharing failed for an unknown reason'
ERROR: Encountered errors while bringing up the project.

bドライブ使ってないと思うので、dockerの設定変更が必要
http://kdnakt.hatenablog.com/entry/2019/09/12/080000

xamppでmysqlが接続できなくなった

ポート変更が必要
.envで3306→3316とか使ってないポートに変更する

さいごに

laradockを使っていましたが遅かったので、phpの公式のphp-apacheを使うようになりました。
まだdocker歴が短いので、ベストな状態かはわかりません。
なにかあれば教えてください。

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

LaravelのHerokuへのデプロイ、DBはMySQL。

データベースにMYSQLを使う

HerokuではデータベースとしてPostgreSQLになっているため、アプリごとにClearDBを入れなければならない。利用にはクレジットカードが必要。(ClearDBの利用自体は無料)

$ heroku addons:add cleardb

上記にコマンドの入力またはHerokuのサイトのsettingタブから導入できる。

Procfile を作成する

ProcfileというHerokuの設定ファイルを作成。サーバーにApacheを使うこと、public/をドキュメントルートとすることを宣言するために使います。アプリフォルダの直下に作成する。

Procfile
web: vendor/bin/heroku-php-apache2 public/

中身は上記のように。

環境変数の設定

どの項目を登録すべきかよくわからなかったためいろいろやってみたが注意すべきはDBに関する項目。

DB_DATABASE=[データベース名]
DB_HOST=[ホスト名]
DB_USERNAME=[ユーザー名]
DB_PASSWORD=[パスワード]

これらはenvファイルの設定ではなくclearDBの設定で、そのURL内にある。下記コマンドで表示。

heroku config:get CLEARDB_DATABASE_URL

#URLが表示される
mysql://[ユーザー名]:[パスワード]@[ホスト名]/[データベース名]?reconnect=true

またセキュリティ関連のAPP_KEYの設定も必須。

heroku config:set APP_KEY=$(php artisan --no-ansi key:generate --show)

envファイルのAPP_KEYの項目をartisanコマンドで取得

HerokuのMYSQLにmigrateする

自分はここに一番時間を取られた。マイグレーションがうまくいかない。

Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes

何度やってもこのエラーメッセージが出てくる。訳すと「指定されたキーは長すぎます。キーの長さは最大767バイトです。」

調べていくとvarchar型の文字数を191に制限しなければこのエラーが出るらしい。

app\Providers\AppServiceProvider.phpに以下を追加。

AppServieProvider.php
use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}

自分はSchemaクラスをuseするのを忘れていたため時間がとられてしまった。
use Illuminate\Support\Facades\Schema;を忘れないように。

デプロイする

HerokuではアプリをGitを利用してデプロイする。自分はGitも初心者だったためここでもかなり時間を要した。

まずはHerokuのアプリをリモートとして登録

git init
heroku git:remote -a <herokuのアプリ名>

ローカルリポジトリにコミットし

git add .
git commit -m "コミットメッセージ"

プッシュすることによりデプロイする

git push heroku master

問題がなければheroku openでサイトを開くことができる

heroku open


思った以上に時間がかかってしまった。自分が犯していた間違いはdevelopブランチにProcfileファイルを作成し、マージしないままmasterをプッシュをしていたこと。そのほかにもGitの基本的な操作ができていなかった。HerokuよりもGitに慣れていないことを痛感させられた。

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

【Laravel5.8】PHP7.4でTrying to access array offset on valueが山盛り出るようになった

Laravel5.8で試したからLaravel5.8としているだけで、他のバージョンや、あるいは他のフレームワークでも発生すると思います。

PHP7.4.0がリリースされました

で、PHP7.4からスカラー型変数に配列アクセスするとE_NOTICEが出るようになりました。

$a = null;
echo $a[1];

これはPHP7.3までは何も言いませんでしたが、7.4ではE_NOTICEが発生します。
さらにPHP8ではE_WARNINGになる予定です。

これの何が問題って、値が入ってるかどうかわからないテーブルにリレーション張ってる場合ですよ。

テーブルAのモデル
class TableA extends Model{
    /**
     * テーブルBへのリレーション
     */
    public function TableB()
    {
        return $this->belongsTo(\path\to\TableB::class, 'b_id', 'id');
    }
}

コントローラはwithで引っ張ってきてbladeに投げるだけ。

コントローラ
    $tableAs = TableA::with(['TableB'])->get();
    return view('hoge.blade.php', [$tableAs]);

ビューではなんか適当に表示。

hoge.blade.php
@foreach ($tableAs as $tableA)
    ID: {{ $tableA->id }}
    Bの値: {{ $tableA->TableB['name'] }}
@endforeach

テンプレートはだいたいこんな書き方をしてると思うのですが、というか私がしてるのですが、テーブルBに値が無かった場合、これまで"Bの値"は単に空白になっていました。
PHP7.4に上げた瞬間、至る所でLaravelがErrorExceptionを吐くようになってえらいことになりましたよ。

根本的に正しく解決するにはどうすればいいのかはよくわかりませんが、とりあえず

    Bの値: {{ $tableA->TableB['name'] ?? '' }}

ってすることで事なきを得た。

事なきを得たと思ったんですが、実はこれLaravel本体側でも発生するんですよね。
確認したところではemailバリデータを使うと出てきます。
そのうち修正されるとは思いますが、先にLaravelのアップデートを終わらせるまでPHP本体のアプデは待った方がよいでしょう。

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

Laravel6.0始める前にMacのphpは7.2以上にすべき話【対策を解説】

Laravel6.0を遂に試してみようということで、

いつもの通り、

$ composer create-project laravel/laravel qiita --prefer-dist "6.0.*"

とバージョンを指定して、composerでプロジェクトを作成しようとしました。

そしたら、エラーが出てしまいました。

理由は、

Laravel6.0はpcのphpが7.2以上である必要がある

ということでした。

MAMPはphp7.3.1なのになんでやと思ってたんですが、pcは7.1.2だったんですね...

ということで、

pc(Mac)のphpのバージョンを7.3~にあげる方法を解説します

前提環境
MacOS MOjave 10.14.5
composerインストール済み
homebrewインストール済み

homebrewまだの人は各自インストールお願いします?

brewコマンドでphpをインストールする

まずはbrewコマンドでphp7系を検索してください。

$ brew search php@7

すると、以下の画面になります。

==> Formulae
php@7.1                    php@7.2                    php@7.3

そしたら、以下のコマンドを入力してください。

$ brew install php@7.3

これでphp7.3がインストールされます。

一応コマンドでバージョンを確認します。

$ php -v

スクリーンショット 2019-11-28 14.32.51.png

やったぜ

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

RailsとLaravelの比較

はじめに

この記事はRailsとLaravelを比較分析してみた記事です.
Railsは以前から勉強していて,新たにLaravelを使ってみました.
Railsの勉強にはRuby on Rails 5 超入門改訂4版 基礎 Ruby on Rails (IMPRESS KISO SERIES)を使いました.
Ruby on Rails 5 超入門についてはチュートリアル形式で一見わかりやすいのですが,誤植などが多いのとレベルが優しすぎるのであまりオススメしません.

Laravelの勉強はPHPフレームワーク Laravel Webアプリケーション開発 バージョン5.5 LTS対応を使いました.買う前に中身を確認しなかった僕が悪いのですが,本の厚さの割に内容が薄いです.また辞書的に使う分には良いのですが,チュートリアル形式で作っていく感じではないので,フレームワークを使ったことのない人などにはオススメ出来ません.

RailsとLaravelの基本情報

*以下,2019/11/28現在の情報

Rails Laravel
言語 Ruby PHP
初リリース 2004年 2011年
github https://github.com/rails/rails https://github.com/laravel/framework
github start数 44.6K 19.5K

githubのstart数ではrailsの方がLarvelの倍くらいの数になっています.Railsはいま流行りと個人的に思っていたりするのですが,リリースからはもう10年以上経過していました.

Googleトレンドで調べてみた

Googleトレンドでは検索のトレンドを調べて,検索キーワードで比較したりできるサービスです.Googleは面白いサービスを作っていますね.
これを使ってRailsとLaravelについて調べてみました.

すべての国

https://trends.google.co.jp/trends/explore?date=all&q=Rails,Laravel

スクリーンショット 2019-11-28 16.02.49.png

日本

https://trends.google.co.jp/trends/explore?date=all&geo=JP&q=Rails,Laravel

スクリーンショット 2019-11-28 16.03.22.png

Laravelはリリースが2011年なので,2012年頃まではほぼ0です.
全ての国の場合ではLaravelがRailsをやや追い越したくらいになっています.日本の場合ではまだRailsを追いかけていますが,このままの状態が続くと追い越しそうです.

個人的分析

ここからはRailsとLaravelを使ってみた感想になります.

本,参考資料などの多さは? 勝者:Rails

Railsの方がネットでググったときなどの参考になる記事などが多いです.それはRailsで使われている言語のRubyの開発者が日本人(まつもとゆきひろ氏)なのでRubyの日本語資料がそもそも多いという点と,Laravelより7年早くリリースしているからかなと思っています.

*IT分野の中で日本発祥の技術はRubyと深層学習のChainerくらいしか知らない(他にあったらコメントください)のでRubyは本当すごいです.

勉強のしやすさは? 勝者:Rails

難易度的にもRailsとLaravelは遜色ないですが,やはり本や参考資料などが多い方が勉強しやすいです.以前Go言語のフレームワークのGinを使う機会があったのですが,公式以外のドキュメントが少なくて開発しにくかったことがあります.

使いやすさは? 同じ

  • railsにはscaffoldという色々必要なものを一発で作ってくれるコマンドがあるのですが,Laravelは標準でサポートしていません(あるけど,githubの更新も止まっているのでバージョンに寄っては今後使えなくなるかも).
  • Laravelは比較的命名規則などが緩いので,ネットで調べても色々な書き方をしているのでわかりにくいです.
  • 逆にRailsは規則が厳しいのですが,厳しいが故に,変数名などを修正するのが億劫になります.
  • Laravelはデフォルトでログイン認証などが入っているので,インストールなどの手間が省けます.

RailsとLaravelのどっちがいいの? 若干Laravelかな

ここまで読んだ人にはRailsの方が良い感じに見えますが,他のエンジニアの人の意見を聞くと

「Railsは比較的開発が速くできるからスタートアップに多いが,保守・運用や難しい機能にはRailsは向いておらず,JavaやPHPのフレームワークの方が開発が容易」

という意見が多かったです(社会人になって1ヶ月くらいなのでこの辺は自分の中で不確定要素).確かに求人とか見てるとPHPとかJavaの募集の方が多いなという印象を持ったのでLaravelとしました.

まとめ

Railsが最強(僕の大学の教授)という人もいれば,Railsはオワコンと言っている人もいますのでどうなんですかね...
僕の周囲ではRailsの方がよく耳にします.
Rails,LarvelはRubyとPHPという言語の違いは多少ありますが,考え方や使い方はほとんど同じです.個人的には勉強のしやすいRailsを最初にやってMVCの基礎を勉強して,Laravelとかに移ればいいかなと思います.

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

51歳からのプログラミング 備忘 XREA様の無料サーバーに ローカル Laravel のプロジェクトをアップロード

Laravelを導入するだけで丸1日潰れた。でも、先輩方がサイトで記録を残してくれているので、こんな僕でもなんとか独学で!参考にするのなら、他のサイトがおすすめ!

参考サイト様

下記様、大変にお世話になりました。ありがとうございます!

tanidaiz.com様
@haessal様
@t_mitarai様

はじめに

無料レンタルサーバーは XREA様
方法は、XREAに、
・ teraTarmを使って、ローカルで作成したLaravelをアップロードする方法
  XREAのファイルマネージャーでもZIPをあげられる

SSH登録と許可

   説明
XREA無料版の登録 XREAにログインして無料版を申し込む
SSH登録 alue-domain GMO管理画面・コントロールパネル

サーバー/XREA

コントロールパネル/ウェブ

FTP設定で「SSH登録」を選択
SSH許可 XREA

サイト設定

ツール/セキュリティ

SSH接続IP許可

SSH接続

teraTermの場合なら
teraTerm起動
・ ドメイン(IPアドレス)
・ ユーザー(FTP設定のアカウント)
・ パスフレーズ(FTPのパスワード)
を入力

   説明
ドメイン alue-domain GMO

コントロールパネル

アカウント@サーバー/「IPアドレス XXX.XXX.XXX.XXX」のIPアドレス
UserとPass XREA

サイト設定

FTP設定」

アカウントとパスワード

composerの導入

説明はこちら-> composer installation

XREAでは、phpコマンドはCLI版を使うそうです。
導入するlaravelで用いるPHPのversionを確認しましょう。
XREAのPHP、laravelのPHP、コマンドに使うPHP($ php72cli)の各PHP versionは揃えましょう!

teraTarmで、root直下(/virtual/UserAccount/)に入って、下記を実行するんだコレ!

$ php72cli -r "copy('...
$ php72cli -r "if(...
$ php72cli composer-setup.php
$ php72cli -r "unlink(...

composerを起動

そして、composerをインストした階層で下記を実行するんだコレ!

$ php72cli composer.phar
// ↓
// COMPOSERのかっこいいのが表示される

Laravelの導入

ローカルで開発したlaravelをXREAにUPロード!

・ laravelファイルをZIPなどで圧縮
・ アップローダーでZipをアップ!
  teraTarmならクリックドロップ!
  XREAのファイルマネージャーなら、ZIP形式でアップロードを選択!
 (これだとアップロード時に解凍してくれる!)
・ 不要なファイル(phpunit)を削除!

teraTarm で zip を解凍するのは

$ unzip myProject.zip

そしたら次に artisan key:generate します

virtual/UserAccount/laravel/myProject/
// myprojectに入って以下を行います

$ php72cli artisan key:generate

myProject/publicを、public_html(DocumentRoot)に移動します。
/virtual/UserAccount/public_html -- index.php
               |- .htaccess
               |- favicon.ico
               |- robots.txt
って感じにします。
そしたらindex.phpを変更します。
このままだと、index.php の require ./autoload.php で require されずに 500 エラーになります。

index.htmlの変更

/public_html/index.php を以下のように修正

// ↓ require __DIR__.'/../vendor/autoload.php'; 
require '/virtual/UserAccount/laravel/myProject/vendor/autoload.php';

// ↓ $app = require_once __DIR__.'/../bootstrap/app.php';
$app = require_once '/virtual/UserAccount/laravel/myProject/bootstrap/app.php';

これで大丈夫かな?
http://UserAcount.xxx/
でアクセス!

Error

Whoops, looks like something went wrong

phpのバージョンが違っているので、表示できません、っていうエラー?。

Whoops, looks like something went wrong.
(1/1) FatalThrowableError
Parse error: syntax error, unexpected '?', expecting variable (T_VARIABLE)
in Translator.php line 91

011128.JPG

XREAで使っているPHPバージョンと、導入したlaravelで使ってるPHPバージョンがあってなかった、ってことでした。

ローカルのlaravel XREAのlaravel XREAのphp teraTermのphp の各レベルは合わせるのが吉かな?

laravel導入時に、phpunit系のエラーが出て中断

php72cli -d register_argc_argv=1 composer.phar create-project --no-dev --prefer-dist laravel/.....

--no-devでインストールしないように指定したんだけれど、

Your requirments could not be resolvel to an installable set of packages

Problem 1
-phpunit/phpunit ...
...

というレッドエラーが出た。
すべてphpunitエラーなので、今回はインストールで--no-devは指定せず、エラー発生後にディレクトリーからphpunitを削除して、再インストールすることにしたよ。

削除方法はいろいろあるけれど、今回は、
XARE - サイト設定 - FTP設定 - ファイルマネージャー - laravelホルダ - phpunit 削除
で、他のファイルを確認しながら削除してみました。

再インストールね!

$ php72cli -d register_argc_argv=1 composer.phar update

http://www.UserDomain/myProject
無事に
011128-2.JPG

導入したLaravelファイルが見当たらない! No such file or directory

これは迷いました!

調べてたら、転送する時の文字コードが違うのでは(エンコード)?とか出てきましたが、最終的にLaravelプロジェクトの名前がよくなかったよう。当初は laravel01 というプロジェクト名をアップしたら、実際にファイルはアップされているのですが、teraTarmでは認識されませんでした。プロジェクト名を laravelapp とか、数字の入ってないのに変更したらOKだった!

DocumentRootにindex.phpを配置 500Error

composerでlaravelを導入すると、vedorディレクトリはcomposerと同じ階層に作成されるのだけれど、laravelを他のディレクトリに移したり、vendorディレクトリを移動させると、エラーになってしまう。初歩的なミスをしてました。

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

51歳からのプログラミング 備忘 XREA様の無料サーバーにLaravel

Laravelを導入するだけで丸1日潰れた。でも、先輩方がサイトで記録を残してくれているので、こんな僕でもなんとか独学で!参考にするのなら、他のサイトがおすすめ!

参考サイト様

下記様、大変にお世話になりました。ありがとうございます!

tanidaiz.com様
@haessal様
@t_mitarai様

はじめに

無料レンタルサーバーは XREA様
方法は、XREAに、
・ teraTarmを使って、ローカルで作成したLaravelをアップロードする方法
  XREAのファイルマネージャーでもZIPをあげられる

SSH登録と許可

   説明
XREA無料版の登録 XREAにログインして無料版を申し込む
SSH登録 alue-domain GMO管理画面・コントロールパネル

サーバー/XREA

コントロールパネル/ウェブ

FTP設定で「SSH登録」を選択
SSH許可 XREA

サイト設定

ツール/セキュリティ

SSH接続IP許可

SSH接続

teraTermの場合なら
teraTerm起動
・ ドメイン(IPアドレス)
・ ユーザー(FTP設定のアカウント)
・ パスフレーズ(FTPのパスワード)
を入力

   説明
ドメイン alue-domain GMO

コントロールパネル

アカウント@サーバー/「IPアドレス XXX.XXX.XXX.XXX」のIPアドレス
UserとPass XREA

サイト設定

FTP設定」

アカウントとパスワード

composerの導入

説明はこちら-> composer installation

XREAでは、phpコマンドはCLI版を使うそうです。
導入するlaravelで用いるPHPのversionを確認しましょう。
XREAのPHP、laravelのPHP、コマンドに使うPHP($ php72cli)の各PHP versionは揃えましょう!

$ php72cli -r "copy('...
$ php72cli -r "if(...
$ php72cli composer-setup.php
$ php72cli -r "unlink(...

の部分をteraTarmなどのターミナルで実行!

composerを起動

$ php72cli composer.phar
// ↓
// COMPOSERのかっこいい奴が表示される

Laravelの導入

ローカルで開発したlaravelをXREAにUPロード!

・ laravelファイルをZIPなどで圧縮
・ アップローダーでZipをアップ!
  teraTarmならクリックドロップ!
  XREAのファイルマネージャーなら、ZIP形式でアップロードを選択!
 (これだとアップロード時に解凍してくれる!)
・ 不要なファイル(phpunit)を削除!

teraTarm で zip を解凍するのは

$ unzip myProject.zip

そしたら次に artisan key:generate します

virtual/UserAccount/laravel/myProject/
// myprojectに入って以下を行います

$ php72cli artisan key:generate

myProject/publicを、public_html(DocumentRoot)に移動します。
/virtual/UserAccount/public_html -- index.php
               |- .htaccess
               |- favicon.ico
               |- robots.txt
って感じにします。
そしたらindex.phpを変更します。
このままだと、index.php の require ./autoload.php で require されずに 500 エラーになります。

index.htmlの変更

/public_html/index.php を以下のように修正

// ↓ require __DIR__.'/../vendor/autoload.php'; 
require '/virtual/UserAccount/laravel/myProject/vendor/autoload.php';

// ↓ $app = require_once __DIR__.'/../bootstrap/app.php';
$app = require_once '/virtual/UserAccount/laravel/myProject/bootstrap/app.php';

これで大丈夫かな?

Error

Whoops, looks like something went wrong

phpのバージョンが違っているので、表示できません、っていうエラー?。

Whoops, looks like something went wrong.
(1/1) FatalThrowableError
Parse error: syntax error, unexpected '?', expecting variable (T_VARIABLE)
in Translator.php line 91

011128.JPG

XREAで使っているPHPバージョンと、導入したlaravelで使ってるPHPバージョンがあってなかった、ってことでした。

ローカルのlaravel XREAのlaravel XREAのphp teraTermのphp の各レベルは合わせるのが吉かな?

laravel導入時に、phpunit系のエラーが出て中断

php72cli -d register_argc_argv=1 composer.phar create-project --no-dev --prefer-dist laravel/.....

--no-devでインストールしないように指定したんだけれど、

Your requirments could not be resolvel to an installable set of packages

Problem 1
-phpunit/phpunit ...
...

というレッドエラーが出た。
すべてphpunitエラーなので、今回はインストールで--no-devは指定せず、エラー発生後にディレクトリーからphpunitを削除して、再インストールすることにしたよ。

削除方法はいろいろあるけれど、今回は、
XARE - サイト設定 - FTP設定 - ファイルマネージャー - laravelホルダ - phpunit 削除
で、他のファイルを確認しながら削除してみました。

再インストールね!

$ php72cli -d register_argc_argv=1 composer.phar update

http://www.UserDomain/myProject
無事に
011128-2.JPG

導入したLaravelファイルが見当たらない! No such file or directory

これは迷いました!

調べてたら、転送する時の文字コードが違うのでは(エンコード)?とか出てきましたが、最終的にLaravelプロジェクトの名前がよくなかったよう。当初は laravel01 というプロジェクト名をアップしたら、実際にファイルはアップされているのですが、teraTarmでは認識されませんでした。プロジェクト名を laravelapp とか、数字の入ってないのに変更したらOKだった!

DocumentRootにindex.phpを配置 500Error

composerでlaravelを導入すると、vedorディレクトリはcomposerと同じ階層に作成されるのだけれど、laravelを他のディレクトリに移したり、vendorディレクトリを移動させると、エラーになってしまう。初歩的なミスをしてました。

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

Laravel Livewire を使って動的テーブル表示を簡単に作る JavaScriptを1行も書かずに

livewire_demo.gif

Laravel Livewireとは

CALEB PORZIOが作った Laravel用パッケージ
https://github.com/calebporzio/laracasts-livewire-datatable
https://laravel-livewire.com/
動的なテーブル表示を簡単につくれる

2019/11/26 に CALEB PORZIOがLaracastsにチュートリアル動画をアップした。
https://laracasts.com/series/guest-spotlight/episodes/3

 CALEB PORZIO の チュートリアル動画を参考にして Books動的テーブル表示を作ってみました。view blade, Controller, Modelはほぼ彼のチュートリアル動画の内容と同じです。

CALEB PORZIOのgithubのサンプルはMySQLで動かない

CALEB PORZIOはsqliteで 動作確認をしているが .envのDB_CONNECTIONをmysqlに変更すると動かない。原因はapp/Http/Livewire/ContactsTable.phpがorder by ``のようなSQLを発行してしまうからで13行目にある public \$sortField; を public \$sortField = 'id';などに変更するとMySQLでも動作するようになる。

Laravel project

Table

tablesとauthorsテーブルを用意してseederでbooksを500レコード authorsを3レコード作成。適当なfactoryも作る。 php artisan migrate; php artisan db:seed でデータを用意。

class CreateBooksTable extends Migration {
    public function up() {
        Schema::create('books', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('title');  // ←追加
            $table->unsignedInteger('author_id');  // ←追加
            $table->timestamps();
        });
    }
}
class CreateAuthorsTable extends Migration {
    public function up() {
        Schema::create('authors', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');  // ←追加
            $table->timestamps();
        });
    }
}
class BooksTableSeeder extends Seeder {
    public function run()
    {
        factory(\App\Book::class, 500)->create();  // ←追加
    }
}
class AuthorsTableSeeder extends Seeder {
    public function run()
    {
        factory(\App\Author::class, 3)->create();  // ←追加
    }
}

LivewireでBooks一覧画面を作る

Livewireのインストール

コンポーザーでインストール

composer require livewire/livewire

make:livewireでbladeとClassを作る

php artisan make:livewire books-table

以下のファイルが作られる
CLASS: app/Http/Livewire/BooksTable.php
VIEW: resources/views/livewire/books-table.blade.php

routes/web.php

一行だけ追加

Route::get('books', 'BooksController');

app/Author.php

booksテーブルとのリレーションだけ追加。

class Author extends Model
{
    protected $guarded = [];

    public function books()
    {
        return $this->hasMany(Book::class);
    }
}

app/Book.php

Authorテーブルへのリレーションを追加。
検索メソッドを追加。(CALEB PORZIOのContacts.phpを参考にしました。ほぼ同じです。)

class Book extends Model
{
    protected $guarded = [];

    public static function search(string $query)
    {
        $res = empty($query) ? static::query()
            : static::where('title', 'like', '%' . $query . '%');
        return $res;
    }

    public function author()
    {
        return $this->belongsTo(Author::class);
    }
}

app/Http/Controllers/BooksController.php

    public function __invoke(Request $request)
    {
        $books = \App\Book::paginate(); // ←この処理使われていない. $booksはBooksTable.phpで取得するから
        return view('books', ['books' => $books]);
    }

app/Http/Livewire/BooksTable.php

CALEB PORZIOのapp/Http/Livewire/ContactsTable.phpとほぼ同じです。booksテーブル用に少しだけ変更しました。

class BooksTable extends Component
{
    use withPagination;

    public $perPage = 10;
    public $search = '';
    public $sortField = 'id';
    public $sortAsc = true;

    public function clear() {
        $this->search = '';
    }

    public function sortBy($field) {
        if ($this->sortField === $field) {
            $this->sortAsc = !$this->sortAsc;
        } else {
            $this->sortAsc = true;
        }
        $this->sortField = $field;
    }

    public function render()
    {
        $books = \App\Book::search($this->search)
            ->orderBy($this->sortField, $this->sortAsc ? 'asc' : 'desc')
            ->paginate($this->perPage);
        return view('livewire.books-table', ['books' => $books]);
    }
}

resources/views/books.blade.php

@livewireAssetsを追加して
@livewire('books-table) でbooks-table.blade.phpを読み込みます。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Books</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
    <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.5/css/bulma.css">
    @livewireAssets
</head>
<body style="padding:8px;">
<h1>Books</h1>
<div class="container pt-4">
    @livewire('books-table')
</div>
</body>
</html>

/resources/views/livewire/books-table.blade.php

テーブル表示のviewを書きます

wire:model、wire:click.preventの設定があるところが app/Http/Livewire/BooksTable.php と連携するところです。

の値はBooksTable.phpの$searchと同期します。

  • Books用に変更してありますが、CALEB PORZIOの resources/views/livewire/contacts-table.blade.php とほぼ同じです。 CALEB PORZIOのチュートリアル動画を参照してください。
<div>
    <div class="row mb-4">
        <div class="col form-inline">
            Per Page: &nbsp;
            <select wire:model="perPage" class="form-control">
                <option>10</option>
                <option>15</option>
                <option>25</option>
            </select>
        </div>

        <div class="col">
            <input wire:model="search" class="form-control" type="text" placeholder="Search books...">
        </div>
    </div>

    <div class="row">
        <table class="table">
            <thead>
            <tr>
                <th>ID</th>
                <th>
                    <a wire:click.prevent="sortBy('title')" role="button" href="#">
                        Title
                    </a>
                </th>
                <th>
                    <a wire:click.prevent="sortBy('author_id')" role="button" href="#">
                    Author
                    </a>
                </th>
            </tr>
            </thead>
            <tbody>
            @foreach ($books as $book)
                <tr>
                    <td>{{ $book->id }}</td>
                    <td>{{ $book->title }}</td>
                    <td>{{ $book->author['name'] }}</td>
                </tr>
            @endforeach
            </tbody>
        </table>
    </div>

    <div class="row">
        <div class="col">
            {{ $books->links() }}
        </div>

        <div class="col text-right text-muted">
            Showing {{ $books->firstItem() }} to {{ $books->lastItem() }} out of {{ $books->total() }} results
        </div>
    </div>
</div>

動作確認

php artisan serve

ブラウザで実際に動かしてみる。
すごい!動く!JavaScriptを1行も書かずに!

CALEB PORZIOすごい!

CALEB PORZIOのチュートリアル動画
https://laracasts.com/series/guest-spotlight/episodes/3

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

Laravel 6.6 LTS セットアップ

1:インストール

% composer create-project --prefer-dist laravel/laravel spider

2:簡易サーバー起動、動作チェック

% cd spider
% php artisan serve

以下が表示されればオッケ。
スクリーンショット 2019-11-28 9.37.16.png

3:SQLite 設定

.env編集
DB_CONNECTION=sqlite
#DB_DATABASE=laravel
データベース作成
% touch database/database.sqlite
マイグレーション
% php artisan migrate    

4:Laravel 初期設定

/config/app.php
    'timezone' => 'Asia/Tokyo',
    'locale' => 'ja',

5:git管理する。

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

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

マイグレーションとは

「統合する」などの意味。Laravelにおいては、データベースの定義に当たる。

マイグレーションの手順

1.サーバーの停止

$ control + c

内蔵サーバーを停止して、プロジェクトのディレクトリ内にいることを確認。

2.artisanコマンドでマイグレーションファイル作成

$ php artisan make:migration ファイル名 --create=テーブル名

任意のファイル名、テーブル名を入力してターミナルでartisanコマンドを実行する。

プロジェクトのディレクトリ内の「database」→「migrations」ディレクトリ内に「2019_11_24_224426_ファイル名.phpが自動で作成される。

3.データベースの接続

$ php artisan migrate

1.config→database.phpを開く

2.データベース名を変更
'default' => env('DB_CONNECTION', '使用したいデータベース名'), (※データベース名 → mysqlやsqlite等)

// 使用するデータベースのパスや.envについての情報を確認しておく
'connections' => [

        'sqlite' => [
            'driver' => 'sqlite',
            'url' => env('DATABASE_URL'),
            'database' => env('DB_DATABASE', database_path('database.sqlite')),
            'prefix' => '',
            'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
        ],

3.cd databaseでディレクトリに移動

4.touch database.sqlite
(database.phpの'connections内にあるdatabase_pathのファイルを作成)

5. 「.env」ファイルのDB_CONNECTION=データベース名を使用するデータベース名に変更

DB_CONNECTION=mysql 
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

DB_CONNECTION=sqliteのように使用するデータベース名に変更。

※sqliteの場合は、その下の5行は不要なので削除(あるとマイグレーションエラーになる。)

6.$ php artisan migrateを実行

PDOException::("SQLSTATE[HY000] [1049] Unknown database 'laravel'")

※データベースの定義後、データベースを置くところを作成せずにmigrateを実行するとエラーになる。

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

Laravel composerインストール後〜内蔵サーバー起動

composer インストール後

Laravelをcomposerを使用してインストール

$ php composer.phar create-project --prefer-dist laravel/laravel プロジェクト名(ディレクトリ)

ディレクトリに移動

$ cd プロジェクト名(ディレクトリ)

Laravelのサーバーを起動

$ php artisan serve

Laravel development server started on http://localhost:8000/

※仮想マシン(vagrant)から使用する場合は、

php artisan serve --host 192.168.33.10 --port 8000

ディレクトリの一番上の階層でサーバーを立ち上げること。
(Laravelに内蔵されているサーバーが起動する)

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