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

【Laravel初心者による備忘録】Laravelデータベースの基本!

Laravelでデータベースを使うなら

Laravelでデータベースを使うなら、DBクラスかEloquentのどちらかを使います。

DBクラス

データベースアクセスのための基本的な機能をまとめたクラス。クエリビルだという機能も用意されている。

Eloquent

ORMを実装したもの。

ORMの説明(Wikipediaより引用)

データベースとオブジェクト指向プログラミング言語の間の非互換なデータを変換するプログラミング技法である。オブジェクト関連マッピングとも呼ぶ。

前提知識 CRUD

データベース操作の基本はCRUD(Create,Read,Update,Delete)の実装です。
SQLでは(INSERT,SELECT,UPDATE,DELETE)が対応する。

1.DBクラス

必要な手続き

データベースを設定する

config/database.phpの冒頭にある'default'の第二引数を使用したいデータベース名に設定すればOK。sqliteならsqlite、MySQLならmysql。

'default' => env('DB_CONNECTION', データベース名),

環境変数を設定する

.envファイルに環境変数がまとめられているので、この中のDB_CONNECTIONとDB_DATABASEを編集する。

DB_CONNECTION=データベース名
DB_DATABASE=使用するデータベースファイルのパスを指定

コントローラの修正

DB:selectで指定したSQL文を実行し、データベースからレコードの情報を取り出します。

use Illuminate\Support\Facades\DB;
$変数 = DB::select(実行するSQL文);
DBクラス内でのCRUD

冒頭でCRUDについて述べたと思うのですが、DBクラスでは以下の静的なメソッドを用います。

CRUD メソッド
C DB::insert(クエリ文,パラメータ配列);
R DB::select(実行するSQL文);
U DB::update(クエリ文,パラメータ配列);
D DB::delete(クエリ文,パラメータ配列);

テンプレートの修正

@foreachディレクティブなどを使用してデータを活用します。
ディレクティブに関しては以下の記事に記載してあります。

クエリビルダ

LaravelのDBクラスにはクエリビルダという機能が用意されています。
クエリビルダ=SQLのクエリ文を生成するために用意されたメソッド

2.Eloquent

必要な手続き

データベースを設定する

config/database.phpの冒頭にある'default'の第二引数を使用したいデータベース名に設定すればOK。sqliteならsqlite、MySQLならmysql。

'default' => env('DB_CONNECTION', データベース名),

環境変数を設定する

.envファイルに環境変数がまとめられているので、この中のDB_CONNECTIONとDB_DATABASEを編集する。

DB_CONNECTION=データベース名
DB_DATABASE=使用するデータベースファイルのパスを指定

モデルの作成

artisanコマンドでモデルを作成します。作成されたモデルはappフォルダに配置されます。

php artisan make:model モデル名

便利なツール

シーディングとマイグレーションはどちらの手法でも使える便利なものです。

シーディング

シード=最初から用意しておくコード
シーディングとはシードを作成する機能のこと。
初期状態でダミーのデータがあると便利。

シーダーファイルの作成

artisanコマンドでシーダーファイルを作成します。作成されたシーダーファイルはdatabase/seedsフォルダの中に配置されます。

php artisan make:seeder シーダー名

このファイルのrunメソッドにシーディング処理を記入します。

シーディングの登録

このシーダーファイルをdatabase/seeds/DatabaseSeeder.phpに登録します。
runメソッドに以下のように記入してください。

$this->call(シーダークラス::class);
シーディングの実行

以下のコマンドを使用してシーディングを実行します。

php artisan db:seed

マイグレーション

現在使っているデータベースと全く同じ構造を再現するための仕組みのこと。データベースの移行したり、環境を移行したりする際に一からデータベースを作り直しのは大変。データベースを効率よく管理したいなら、マイグレーションを利用するべき!

マイグレーションファイルの生成

以下のコマンドを実行してマイグレーションファイルを作成します。

php artisan make:migration ファイル名

database/migrationsの中に生成したマイグレーションが追加されます。

生成したファイルの中にはMigrationを継承したクラスが作成されています。このクラスにつのメソッドが用意されています。

  • upメソッド(テーブルを生成するための処理)
  • downメソッド(テーブルを消去するための処理)

それぞれ必要な処理を記述します。

主要な型の設定
説明 コマンド
プライマリキー $table->increments(フィールド名);
整数 $table->integer(フィールド名);
実数 $table->float(フィールド名);
文字 $table->String(フィールド名);
真偽値 $table->boolean(フィールド名);
日時 $table->dateTime(フィールド名);
NULL値可能なcreated_atとupdated_atカラム追加 $table->timestamps();
マイグレーションの実行

以下のコマンドを実行してマイグレーションを実行する。

php artisan migrate

コンソールにメッセージが出力され、テーブルが用意される。

多くのチュートリアルでは・・・

以下のチュートリアルでは、マイグレーションを作成しEloquentを用いてデータベースを作成していました。

個人的に苦しんだエラー特集

以下の記事を参考にしてDockerの環境を構築しました。

目的(機械学習のついでに、ローカルを汚さないようにするために...など)が果たせればOKと判断して雰囲気でDocker使ってたので、今回苦労しました(・・;) 夏休みあたりにちゃんとDocker勉強します?

Dockerでマイグレーションが作成できない

.envのDB_HOSTをデフォルト設定から変更する必要がある。docker-compose.ymlでserviceとして定義した名前を使用する。

phpMyAdminにログインできない

環境変数内(.env)のユーザーネーム、パスワード、サーバ名、全て同じものを使用してログインを試みたのに何度試しても失敗。
もう一度コンテナを作り直したら解決した。原因不明?
このエラー解消に恐ろしく時間取られたのが本当に悔しい...!

参考

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

Laravel 導入手順(未完成)

Laravel 導入手順 1

Laravel初心者がデプロイ目指してわかったところを記録していくための備忘録
筆者の環境:MacOS

Composerの導入

Laravelはインストールの他、プロジェクトを立ち上げる度にComposerというコマンドラインソフトを使うらしい。
初回は以下のホームページからダウンロードする。

https://getcomposer.org/download

ダウンロードした composer.phar を
/usr/local/bin/composerへ移動するのでターミナルで以下のコマンドを打つ。

cd ~/downloads 
sudo mv composer.phar /usr/local/bin/composer.phar

これはパスを通してファイル名だけでコマンドを起動する為の準備です。
なので、任意のディレクトリにcomposer.pharを移動して、毎回そこにcdで移動しても起動すると思いますがそれは大変だしどこへ行ったか分からなくなるので初めからパスの通っているところに動かしておきます。
慣れてる人は ~/bash.rc とかにexportしてパスを通しても同じ結果になると思いますが失敗して上書きすると大変な事になるので上記の方法が安心で簡単。
あと、
cd /usr/local/bin/ で入って

ln -s composer.phar composer 

とやっておくとコマンド入力する時composerでもcomposer.pharでも動くようになる。
※補足: vs Java
他のサイトによると依存関係の管理を自動化してくれるとの解説があったので、恐らくだけど、ComposerってJavaだとMarvenとかGradleに相当するものだと思います。

Projectの作成

Composerがインストールできたらプロジェクトを作成出来るようになっているので、
プロジェクトのルートフォルダにしたいところへcdで移動してから、

terminal
composer create-project Laravel/Laravel myapp --prefer-dict

と打つとmyappという名前のプロジェクトができます。
myappの部分は自分が作りたいアプリの名前を入れる。
あと、スペースで区切られているオプションは入れ替えても動くみたいです。
例えば、
composer create-project Laravel/Laravel --prefer-dict myapp
でも同じ結果でした。(はじめのComposerはコマンド名だから固定)

プロジェクトが認識されてるかテスト起動する

プロジェクトのルートディレクトリで

php artisan serve

とするとララベルに(というかPHPに)内臓の簡易ローカルサーバーが立ち上がります。
MAMPとかTOMCATみたいなコンテナのテスト用お手軽版。
で、これを立ち上げて
http://localhost:8000/
にアクセスするとLaravelのサンプルページが表示されます。
終了するときはCtrl+cで。

Controllerの作成

Laravelのアプリケーションプロジェクトは初期状態でControllerクラスが継承されていないらしい。
代わりに初期状態ではルーティング用のファイルに無名関数でコントローラが書かれている。

web.php
Route::get('/', function () {
     return view('welcome');
}); 

しかし、このファイルは本来送られてきた(ユーザーがアクセスしてきた)URLをコントローラーのアクションメソッドへ案内する為のもので、ここでコントロールするべきではないと思います。
やろうと思えば逆に、viewをreturnする代わりにstring型で文字列をreturnする(つまりHTMLタグをここへ書く)でも動く。
ルーティングができているかの動作テストするのにファイル作るのがめんどくさい時とかは役に立ちそう。

さて、コントローラはアプリケーションプロジェクトのルートディレクトリで

terminal
php artisan make::controller IndexController  

とすればHttp/Controllersフォルダにファイルができています。
なお、最後のIndexContollerは任意の名前にできます。普通はviewの名前+Controllerにするのが良さそう?

マイグレーションファイルを作る

自分自身まだよくわかっていないので間違っているかもしれないが、雑な解釈で行くとデータベーステーブルのモデル定義を自動生成してくれる事をマイグレーションというっぽい。
ここに記述したカラムをcreateしてくれる。
.sqlスクリプトファイルとどう違うのかはよく分からない。記法はSQLより簡単だけど似たようなものだと思う。

※「マイグレーション」でググるとマイグレーションとは「移行」という意味だと書いてあったがこの場合はその解釈だとかえって意味不明なので、上記のような解釈で捉えています。

プロジェクトルートで

terminal
php artisan make:migration create_tablename_table

と打つとマイグレーションファイルができる。
databaseフォルダにmigrationsフォルダができていて、その中に生成したファイルがあるので開いて
テーブル定義を記述する。
(SQLのcreate table に相当することをここへ書く。)
書けたら

terminal
php artisan migrate

とやるとデータベースにテーブルが出る・・はずが出なかった。
エラーが出た。
Laravelのインストールの仕方によってはこれで成功するらしい。
もう解決したので忘れたが、ここでエラーが出た場合それをコピーしてググるとすぐ答えが出てくるのでその通りにする。

私の場合、envファイルに指定された名前のdatabaseがMySQLになかった。
あとdbのユーザー名とパスワードが違った。
.envファイルを開くとMySQLの項目が見つかるので、そこで使いたいdatabase名などに書き換えればいける。
ユーザー名がroot パスワードなしの場合だと
パスワードは空欄にしておく。なんか入ってたらだめ。
databaseはmysqlコマンドで入ってアプリケーション名とかをつけて作ればいいと思う。
で作った名前で.envに書いておく。

それでやり直したら接続できました。

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

Laravelの.envファイルと、config/database.phpファイルについてメモ

LaravelのDBを設定する際のメモ

下記ファイルについて、まとめておく。

.env
config/database.php

.env

.env は環境毎に変更したい情報をまとめておくファイルということだが、
ようは環境変数の設定を書いている。

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

config/database.php

.envファイルで設定した環境変数を取得して、DBの設定をしている。

config/database.php
'default' => env('DB_CONNECTION', 'mysql'),

    'connections' => [
        'sqlite' => [
            'driver' => 'sqlite',
            'database' => env('DB_DATABASE', database_path('database.sqlite')),
            'prefix' => '',
        ],

        'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],

        // ....
    ];

env関数について

env関数はLaravelのヘルパ関数

公式
https://readouble.com/laravel/5.5/ja/helpers.html

env関数は環境変数の値を取得する。
第2引数はデフォルト値。

ex)
'username' => env('DB_USERNAME', 'forge'),

まとめ

Laravelの設定に関して、理解が深まった。

参考にさせていただいたURL
https://laravel10.wordpress.com/2015/02/21/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E7%92%B0%E5%A2%83%E8%A8%AD%E5%AE%9A/

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

[メモ]Laravel Echoでbroadcasting/auth 404 NotFound

Laravel5.5で公式通りにEchoをインスタンス化したらエラー
broadcasting/auth 404 NotFound
出るし、Pusherからうけとれなかった。

スクリーンショット 2019-07-04 20.30.27.png

結局authEndpoint:なるものを仕込んでうまくいった
http://localhostにアクセスしたときにlaravelプロジェクトを参照するようになっていれば躓かなかった模様

bootstrap.js
window.Echo = new Echo({
    authEndpoint: 'http://【ドメインlocalhostとか】/【LaravelProject名】/public/broadcasting/auth',
    broadcaster: 'pusher',
    key: 'your-pusher-key',
    cluster: 'eu',
    encrypted: true
});

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

Laravel5.8プロジェクトにGoogleログイン機能をつける

概要

DockerやPHPの勉強にと作成したLaravelプロジェクトにGoogleログイン機能をつけてみました。

手順

  1. GCPの設定
  2. Laravel側の設定

GCPの設定

GoogleCloudPlatform(GCP)の登録

Google認証を実装するには、まずGoogleCloudPlatform(GCP)の登録が必要です。
Googleアカウントがあれば簡単に出来ます。

GCP:
https://console.cloud.google.com/getting-started?hl=ja

プロジェクトの作成

GCPのホームから作成ができます。
2019.07現在では、「Google Cloud Platform」というロゴマークの右横にプロジェクト名が表示されてます。選択するとモーダルが開き「新しいプロジェクト」作成の導線が現れます。

screenshot 2019-07-03 8.26.31.png

「プロジェクト名」には、とりあえずLaravelプロジェクトと同一の名前を、
今回は個人のテスト用なので「場所」はそのまま「組織なし」を選択し作成します。

認証情報の設定

作成したプロジェクトから「APIとサービス>認証情報>OAuth同意画面」に移動します。
ここにもLaravelプロジェクトと同一の名前を入れました。
*Google認証をするときに一番上に出てくる「●●●●●」に移動の●部分に入ります。

作成をクリックすると、APIとサービスのページに戻りモーダルが開くので
そこで「認証情報を作成>OAuthクライアントID」を選択します。

screenshot 2019-07-03 8.57.03.png

下記の画面が表示されるので
「ウェブアプリケーション」にチェック、「名前」、「承認済みのリダイレクトURI」を埋めて作成します。

「名前」は任意で、
「承認済みのリダイレクトURI」はLaravel側で使うのでそれを考慮に入れてください。
とりあえず今回は"http://localhost/auth/callback/google/" にしました。

(重要)
作成したあと、「クライアントID」と「クライアントシークレット」が表示されます。後ほど使用するのでメモっておいてください。

screenshot 2019-07-03 8.58.30.png

これでGCPの設定は終わりです。

Laravel側の設定

Laravelでの実装ですが、
今回は簡易的に行うため、Laravelのデフォルトで作られるusersテーブルをそのまま使います。

このあと必要になるパッケージを先にインストール
$ composer require laravel/socialite

laravelデフォルトで用意されている認証機能作成のコマンド
$ php artisan make:auth

テーブル作成
$ php artisan migrate

Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table

さらに後ほど必要になるコントローラを作っておきます
$ php artisan make:controller OAuthLoginController

(dbコンテナにてテーブルが作られていることを確認しておく)
mysql> show tables;
+--------------------------+
| Tables_in_laravel-cloud9 |
+--------------------------+
| migrations               |
| password_resets          |
| users                    |
+--------------------------+
3 rows in set (0.00 sec)

必要な設定を追加していきます

src/.env
先ほどGCPの設定の時に作成したものを使用します
GOOGLE_CLIENT_ID=クライアントID
GOOGLE_CLIENT_SECRET=クライアントシークレット
GOOGLE_CALLBACK_URL=リダイレクトURL
src/config/app.php
// サービスプロバイダの登録
'providers' => [

        /*
         * Laravel Framework Service Providers...
         */
        Illuminate\Auth\AuthServiceProvider::class,
        Illuminate\Broadcasting\BroadcastServiceProvider::class,
        /* 省略 */
        App\Providers\EventServiceProvider::class,
        App\Providers\RouteServiceProvider::class,

        Laravel\Socialite\SocialiteServiceProvider::class,//(追加)
    ],

/* 省略 */
 'aliases' => [

        'App' => Illuminate\Support\Facades\App::class,
        'Arr' => Illuminate\Support\Arr::class,
        /* 省略 */
        'Validator' => Illuminate\Support\Facades\Validator::class,
        'View' => Illuminate\Support\Facades\View::class,

        'Socialite' => Laravel\Socialite\Facades\Socialite::class,//(追加)
    ],

src/config/services.php
return [

    /*
    |--------------------------------------------------------------------------
    | Third Party Services
    |--------------------------------------------------------------------------
    |
    | This file is for storing the credentials for third party services such
    | as Stripe, Mailgun, SparkPost and others. This file provides a sane
    | default location for this type of information, allowing packages
    | to have a conventional place to find your various credentials.
    |
    */

    /* 省略 */

    'stripe' => [
        'model' => App\User::class,
        'key' => env('STRIPE_KEY'),
        'secret' => env('STRIPE_SECRET'),
        'webhook' => [
            'secret' => env('STRIPE_WEBHOOK_SECRET'),
            'tolerance' => env('STRIPE_WEBHOOK_TOLERANCE', 300),
        ],
    ],

    /* 追加ここから */
    'google' => [
        'client_id' => env('GOOGLE_CLIENT_ID'),
        'client_secret' => env('GOOGLE_CLIENT_SECRET'),
        'redirect' => env('GOOGLE_CALLBACK_URL'),
    ],
    /* 追加ここまで */
];
src/routes/web.php
/* 省略 */
Route::get('/home', 'HomeController@index')->name('home');
/* 省略 */
// Controllerメソッドへのルート定義
Route::get('/auth/{service}', 'OAuthLoginController@getGoogleAuth')->where('service', 'google');
Route::get('/auth/callback/google', 'OAuthLoginController@authGoogleCallback');

src/app/Http/Controllers/OAuthLoginController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\User;
use Socialite;
use Auth;

class OAuthLoginController extends Controller
{
    // Googleの認証ページへのリダイレクト処理
    public function getGoogleAuth($provider)
    {
        return Socialite::driver($provider)->redirect();
    }

    // Googleの認証情報からユーザー情報の取得
    public function authGoogleCallback()
    {
        $googleUser = Socialite::driver('google')->user();
        $user = User::firstOrNew(['email' => $googleUser->email]);

        if (!$user->exists) {
            $user['name'] = $googleUser->getNickName() ?? $googleUser->getName() ?? $googleUser->getNick();
            $user['email'] = $googleUser->email; // Gmailアドレス
            $user['password'] = str_random(); // 適当に生成

            $user->save();
        }

        Auth::login($user);
        return redirect()->route('home');
    }
}

最後に、ログイン画面にGoogleログイン用のボタンを用意します。

src/resources/views/auth/login.blade.php
// ログイン画面にGoogleログインボタンを配置
<form method="POST" action="{{ route('login') }}">
/* 省略 */
</form>
<a href="auth/google">Googleログイン</a> // 追加

この状態で「localhost:8080/login」にアクセスすると、
アンカーリンクを表示しているだけなので位置はおかしいですが、
「Googleログイン」ボタンを押すとGoogleのログイン画面にリダイレクトします。

screenshot 2019-07-04 19.55.46.png

screenshot 2019-07-04 20.00.20.png

*「Word Container」の部分が、GCPで認証情報の設定をした際に入力した名前です。

あとはログインしたいユーザーでログインすれば、
DBにGoogleアカウントの情報が入ります。

mysql> select * from users;
+----+--------------+--------------------+-------------------+------------------+----------------+---------------------+---------------------+
| id | name         | email              | email_verified_at | password         | remember_token | created_at          | updated_at          |
+----+--------------+--------------------+-------------------+------------------+----------------+---------------------+---------------------+
|  1 | ○○○○○     | xxxxxxx@gmail.com | NULL              | ZabdYEZPWOKeIpbp | NULL           | 2019-07-02 23:15:15 | 2019-07-02 23:15:15 |
+----+--------------+--------------------+-------------------+------------------+----------------+---------------------+---------------------+

最後に

今回はGoogleログインでしたが、
SocialiteではFacebook、Twitterはじめ他にもサポートしているサービスがいくつかあるようです。
他のサービスでのログインも併用したい場合にはusersテーブルの構成を少し変える必要がありそうです。
(ex. GoogleとFacebookで同じメールアドレスを登録している可能性があるので)

典型的なフォームベースの認証に付け加え、LaravelはLaravel Socialite(=名士)による、OAuthプロバイダによるシンプルで便利な認証方法も提供しています。Socialiteは現在、Facebook、Twitter、LinkedIn、Google、GitHub、GitLab、Bitbucketによる認証をサポートしています。

https://readouble.com/laravel/5.8/ja/socialite.html

参考

https://tech.bita.jp/article/28

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

LaravelでStorageを使ったファイルおよびディレクトリの操作をまとめてみた

はじめに

Laravelでファイルを取り扱った個人開発を行っている際にファイル保存の方法を調べた際に気になったため、調べてまとめました。
駅に貼られているチラシを見るように流し見していただければ幸いです。

Storageとは?

LaravelではFlysystem PHPパッケージによって提供されているファイルシステムを抽象化させたものを使えるように設定されている。
設定ファイルはconofig/filesystems.phpにあり、環境によって保存先のディレクトリが分けられている。らしい。 (引用:参考文献1)

今回はそんなStorageを使ったファイルおよびディレクトリの操作方法をまとめてみる。

基本的な書式

StorageFacadesを拡張して使われるもの。
なので書式は基本的に

 Storage::◯◯('hoge', 'fuga');

になる。

ファイル関連

ファイル保存

Storage::put

Storage::put('file_name', $file);

$fileを'file_name'という名前で保存することができます。

Storage::putFile

Storage::putFile('dir', $file);

$fileを'dir'に保存することができます。Storage::putFileでは
ファイル名は自動で設定されます。
また、

Storage::putFile('dir', $file, 'public');

とすることで$fileを一般公開したいという意思を伝えることができます。

Storage::putFileAs

Storage::putFileAs('dir', $file, 'file_name');

$fileを'dir'に'file_name'という名前で保存することができます。Storage::putFileAsでは自分でファイル名は設定することができます。

ファイル書き込み

Storage::prepend

Storage::prepend('file_name', 'hogegeeeee');

file_nameの先頭にhogegeeeeeを書き込むことができます。

Storage::append

Storage::append('file_name', 'fugagaaaaaa');

file_nameの末尾にfugagaaaaaaを書き込むことができます。

ファイルのコピー

Storage::copy

Storage::copy('old dir/file_name', 'new dir/file_name');

old dirにあるfile_nameをnew dirにコピーすることができます。

ファイルの移動

Storage::move

Storage::move('old dir/file_name', 'new dir/file_name');

old dirにあるfile_nameをnew dirに移動することができます。
また、

Storage::move('file_name', 'new_file_name');

file_nameの名前をnew_file_nameに変更できます。

ファイル削除

Storage::move

Storage::delete('file_name');

file_nameを削除することができます。
また、

Storage::delete(['file_name', 'file_name2']);

file_nameとfile_name2を削除することができます。

ディレクトリ関連

ディレクトリ内の全ファイルを取得

Storage::files

Storage::files('dir');

dirの中の全ファイルを配列で返すことができます。

Storage::allFiles

Storage::allFiles('dir');

dirの中のサブディレクトリの中も含めた全ファイルを配列で返すことができます。

ディレクトリ内の全ディレクトリを取得

Storage::directories

Storage::directories('dir');

dirの中の全ディレクトリを配列で返すことができます。

Storage::allFiles

Storage:: allDirectories('dir');

dirの中のサブディレクトリの中も含めた全ディレクトリを配列で返すことができます。

ディレクトリ作成

Storage:makeDirectory

Storage:makeDirectory('dir');

dirという名前のディレクトリを作成することができます。

ディレクトリ削除

Storage:deleteDirectory

Storage:deleteDirectory('dir');

dirという名前のディレクトリを削除することができます。

終わりに

今回はStorageを使ったファイルおよびディレクトリ操作についてまとめてみました。
完全に自己満の記事ですが、何かの役に立てれば幸いです。
最後まで見てくれたあなたがだーいすきです。(一度言ってみたかった)
それでは、またどこかで。笑

参考文献

  1. Laravel 5.5 ファイルストレージ
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

かんたんにAWS Cloud9にLaravel開発環境を構築する。

家のマシンのスペックが貧弱なのでCloud9上に環境構築することにしました。
メモとしてQiitaに書き残しておきます。学習が進み次第追記していくかもしれません。

PHPのインストール

# パッケージ更新
sudo yum update -y

# phpのバージョン確認
rpm -qa | grep php

# php5.6を一式アンインストール
sudo yum remove php56*

# PHP7.3を一式インストール
sudo yum install php73*

# リンク削除 -> 貼り直し
sudo unlink /usr/bin/php
sudo ln -s /etc/alternatives/php7 /usr/bin/php

composerのインストール

# インストーラーのダウンロードと実行
curl -sS https://getcomposer.org/installer | php

# パスの通った場所へ移動
mv composer.phar /usr/local/bin/composer

Laravelのセットアップ

# Laravelのインストール
composer global require "laravel/installer"

# Laravelプロジェクトの作成
composer create-project --prefer-dist laravel/laravel myapp

ローカルサーバーが動いているか確認

# ポート8080でサーバー起動
php artisan serve --port=8080

Previewボタン -> PreviewRunningApplicationから確認できます。

参考URL

AWS Cloud9(Amazon Linux)にPHP7.3をインストールして開発環境を作る手順書
Composerをインストールしてみた
Laravel 5.8 インストール

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

Laravel5.8 Goodby CSV を使ってCSVダウンロード処理を実装

LaravelとGoodby CSVを使って、CSV出力をする処理を実装する機会があったので内容をまとめたいと思います。

Goodby CSVとは

Goodby CSVは、PHP5.3以降で使用できるメモリ効率が高く、柔軟で拡張可能なオープンソースのCSVインポート/エクスポートライブラリです。
また、SJIS-win, EUC-JP や UTF-8等の文字コードにも対応してます。

@suin さんと @reoring さんが作ったライブラリに感謝です???
GitHubはこちら ⭐️ goodby/csv ⭐️

環境

  • PHP 7.3.6
  • Laravel 5.8.27
  • MySQL 8.0.16

※新しくLaravelプロジェクトをインストールしてマイグレーション実行まで済ませた状態から始めています。

Goodby CSV インストール

$ composer require goodby/csv

CSVダウンローダサービスクラスを実装

app/Services/CsvDownloader.php を新しく作成します。

<?php

namespace App\Services;

use App\User;
use Goodby\CSV\Export\Standard\Exporter;
use Goodby\CSV\Export\Standard\ExporterConfig;
use Illuminate\Database\Eloquent\Collection;
use Symfony\Component\HttpFoundation\StreamedResponse;

final class CsvDownloader
{
    /**
     * @return StreamedResponse
     */
    public function download(): StreamedResponse
    {
        $callback = function () {
            $config = new ExporterConfig();
            $config
                ->setDelimiter(',') // 区切り文字
                ->setEnclosure('"') // 囲み文字
                ->setEscape('\\') // エスケープ文字
                ->setToCharset(null) // 出力ファイルの文字コード
                ->setFromCharset('auto') // 読み込み元の文字コード
                ->setColumnHeaders($this->makeCsvHeader()); // CSVの1列目のヘッダー行
            $exporter = new Exporter($config);
            $exporter->export('php://output', $this->makeCsvBody());
        };

        return response()->streamDownload($callback, $this->makeFilename(), $this->makeResponseHeader());
    }

    /**
     * @return array
     */
    private function makeCsvHeader(): array
    {
        return ['名前', 'メールアドレス', '作成日'];
    }

    /**
     * @return array
     */
    private function makeCsvBody(): array
    {
        $users = $this->getUsers();

        $data = [];
        foreach ($users as $user) {
            $data[] = $this->toCsvFromUser($user);
        }

        return $data;
    }

    /**
     * @param User $user
     * @return array
     */
    private function toCsvFromUser(User $user): array
    {
        return [
            $user->name,
            $user->email,
            $user->created_at,
        ];
    }

    /**
     * @return Collection
     */
    private function getUsers(): Collection
    {
        return User::all();
    }

    /**
     * @return array
     */
    private function makeResponseHeader(): array
    {
        return [
            'Content-type' => 'text/csv',
            'Pragma' => 'no-cache',
            'Cache-Control' => 'must-revalidate, post-check=0, pre-check=0',
            'Expires' => '0',
        ];
    }

    /**
     * @return string
     */
    private function makeFilename(): string
    {
        return 'ユーザー一覧.csv';
    }
}

補足

長いコードになっちゃいましたが、Goodby CSVを使用してる箇所はここです。

$config = new ExporterConfig();
$config
    ->setDelimiter(',') // 区切り文字
    ->setEnclosure('"') // 囲み文字
    ->setEscape('\\') // エスケープ文字
    ->setToCharset(null) // 出力ファイルの文字コード
    ->setFromCharset('auto') // 読み込み元の文字コード
    ->setColumnHeaders($this->makeCsvHeader()); // CSVの1列目のヘッダー行
$exporter = new Exporter($config);
$exporter->export('php://output', $this->makeCsvBody());

出力設定は ExporterConfig クラスで行います。
CSVの1行目のヘッダー行(setColumnHeaders)の設定以外はデフォルト値を使用してます。
お好みでカスタマイズしてご使用ください。

また、README.mdに書かれてあった配列からエクスポートする方法を使用してます。

ファイルダウンロード(ストリームダウンロード)

出力するCSVをディスクに書き込ませず、文字列レスポンス通してダウンロードさせたい場合は streamDownloadメソッドを使用します。

ルーティング定義

routes/web.php へ下記のルーティングを追記します。

Route::get('/users', 'UsersController@index');
Route::get('/users/download', 'UsersController@download');

コントローラを作成

src/app/Http/Controllers/UsersController.php を新たに作成します。

<?php

namespace App\Http\Controllers;

use App\User;
use App\Services\CsvDownloader;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\StreamedResponse;

class UsersController extends Controller
{
    /**
     * @return array
     */
    public function index(): array
    {
        $users = User::all();

        return [
            'users' => $users,
        ];
    }

    /**
     * @return StreamedResponse
     */
    public function download(): StreamedResponse
    {
        return (new CsvDownloader())->download();
    }
}

テスト用のユーザーを作成

$ php artisan tinker
>>> factory(App\User::class, 10)->create();

モデルファクトリーを使って、10件のテストデータを作成します。

動作確認

スクリーンショット 2019-07-04 15.15.03.png

ユーザー一覧がjsonで返ってきてます。
コントローラで配列を返すとLaravel側でjsonによしなに変換してくれるので確認するときは便利ですね?

話は全然変わりますが、 JSON Formatter 入れてると便利です。

スクリーンショット 2019-07-04 15.21.23.png

実際にダウンロードされたファイルです。

さいごに

Laravel と Goodby CSV で簡単にCSV出力処理を実装できました!

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

Laravel5.8 Goodby CSV を使ってCSVファイルダウンロードを実装

LaravelとGoodby CSVを使って、CSV出力をする処理を実装する機会があったので内容をまとめたいと思います。

Goodby CSVとは

Goodby CSVは、PHP5.3以降で使用できるメモリ効率が高く、柔軟で拡張可能なオープンソースのCSVインポート/エクスポートライブラリです。
また、SJIS-win, EUC-JP や UTF-8等の文字コードにも対応してます。

@suin さんと @reoring さんが作ったライブラリに感謝です???
GitHubはこちら ⭐️ goodby/csv ⭐️

環境

  • PHP 7.3.6
  • Laravel 5.8.27
  • MySQL 8.0.16

※新しくLaravelプロジェクトをインストールしてマイグレーション実行まで済ませた状態から始めています。

Goodby CSV インストール

$ composer require goodby/csv

CSVダウンローダサービスクラスを実装

app/Services/CsvDownloader.php を新しく作成します。

<?php

namespace App\Services;

use App\User;
use Goodby\CSV\Export\Standard\Exporter;
use Goodby\CSV\Export\Standard\ExporterConfig;
use Illuminate\Database\Eloquent\Collection;
use Symfony\Component\HttpFoundation\StreamedResponse;

final class CsvDownloader
{
    /**
     * @return StreamedResponse
     */
    public function download(): StreamedResponse
    {
        $callback = function () {
            $config = new ExporterConfig();
            $config
                ->setDelimiter(',') // 区切り文字
                ->setEnclosure('"') // 囲み文字
                ->setEscape('\\') // エスケープ文字
                ->setToCharset(null) // 出力ファイルの文字コード
                ->setFromCharset('auto') // 読み込み元の文字コード
                ->setColumnHeaders($this->makeCsvHeader()); // CSVの1列目のヘッダー行
            $exporter = new Exporter($config);
            $exporter->export('php://output', $this->makeCsvBody());
        };

        return response()->streamDownload($callback, $this->makeFilename(), $this->makeResponseHeader());
    }

    /**
     * @return array
     */
    private function makeCsvHeader(): array
    {
        return ['名前', 'メールアドレス', '作成日'];
    }

    /**
     * @return array
     */
    private function makeCsvBody(): array
    {
        $users = $this->getUsers();

        $data = [];
        foreach ($users as $user) {
            $data[] = $this->toCsvFromUser($user);
        }

        return $data;
    }

    /**
     * @param User $user
     * @return array
     */
    private function toCsvFromUser(User $user): array
    {
        return [
            $user->name,
            $user->email,
            $user->created_at,
        ];
    }

    /**
     * @return Collection
     */
    private function getUsers(): Collection
    {
        return User::all();
    }

    /**
     * @return array
     */
    private function makeResponseHeader(): array
    {
        return [
            'Content-type' => 'text/csv',
            'Cache-Control' => 'must-revalidate, no-cache',
            'Expires' => '0',
        ];
    }

    /**
     * @return string
     */
    private function makeFilename(): string
    {
        return 'ユーザー一覧.csv';
    }
}

補足

長いコードになっちゃいましたが、Goodby CSVを使用してる箇所はここです。

$config = new ExporterConfig();
$config
    ->setDelimiter(',') // 区切り文字
    ->setEnclosure('"') // 囲み文字
    ->setEscape('\\') // エスケープ文字
    ->setToCharset(null) // 出力ファイルの文字コード
    ->setFromCharset('auto') // 読み込み元の文字コード
    ->setColumnHeaders($this->makeCsvHeader()); // CSVの1列目のヘッダー行
$exporter = new Exporter($config);
$exporter->export('php://output', $this->makeCsvBody());

出力設定は ExporterConfig クラスで行います。
CSVの1行目のヘッダー行(setColumnHeaders)の設定以外はデフォルト値を使用してます。
お好みでカスタマイズしてご使用ください。

また、README.mdに書かれてあった配列からエクスポートする方法を使用してます。

ファイルダウンロード(ストリームダウンロード)

出力するCSVをディスクに書き込ませず、文字列レスポンス通してダウンロードさせたい場合は streamDownloadメソッドを使用します。

ルーティング定義

routes/web.php へ下記のルーティングを追記します。

Route::get('/users', 'UsersController@index');
Route::get('/users/download', 'UsersController@download');

コントローラを作成

src/app/Http/Controllers/UsersController.php を新たに作成します。

<?php

namespace App\Http\Controllers;

use App\User;
use App\Services\CsvDownloader;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\StreamedResponse;

class UsersController extends Controller
{
    /**
     * @return array
     */
    public function index(): array
    {
        $users = User::all();

        return [
            'users' => $users,
        ];
    }

    /**
     * @return StreamedResponse
     */
    public function download(): StreamedResponse
    {
        return (new CsvDownloader())->download();
    }
}

テスト用のユーザーを作成

$ php artisan tinker
>>> factory(App\User::class, 10)->create();

モデルファクトリーを使って、10件のテストデータを作成します。

動作確認

スクリーンショット 2019-07-04 15.15.03.png

ユーザー一覧がjsonで返ってきてます。
コントローラで配列を返すとLaravel側でjsonによしなに変換してくれるので確認するときは便利ですね?

話は全然変わりますが、 JSON Formatter 入れてると便利です。

スクリーンショット 2019-07-04 15.21.23.png

実際にダウンロードされたファイルです。

さいごに

Laravel と Goodby CSV で簡単にCSV出力処理を実装できました!

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

Laravel MixのIE11対応

LaravelMixのextensionにlaravel-mix-polyfilltというものがあり、簡単に使えたので書いておきます。

https://laravel-mix.com/extensions/polyfill

laravel-mix-polyfillのインストール

npm install laravel-mix-polyfill --save-dev

laravel-mix-polyfillを使うための設定

let mix = require('laravel-mix');

require('laravel-mix-polyfill');

mix.js('resources/js/app.js', 'public/js')
   .sass('resources/sass/app.scss', 'public/css')
   .polyfill({
      enabled: true,
      useBuiltIns: "usage",
      targets: {"firefox": "50", "ie": 11}
   });
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

N代の人の誕生日の期間を求める

いつ使う

N代の年齢の人を抽出したいが、テーブルには誕生日カラムしかない時に。

コード

    $min_age = $generation; // 年代 
    $max_age = $min_age + 9;

    $toDay = Carbon::today();

    $y = $toDay->year - $max_age - 1;
    $d = $toDay->day + 1;
    $startDay = Carbon::parse("{$y}-{$toDay->month}-{$d}");

    $y = $toDay->year - $min_age;
    $endDay = Carbon::parse("{$y}-{$toDay->month}-{$toDay->day}");

    $user->whereBetween('birthday', [$startDay, $endDay]); // laravelならこんな感じに。

おわり

ちょくちょく使うのでメモです。
年齢をDBの方で持つべきだと思います。
ままならない。

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

LaravelでSeederを個別に実行する

php artisan db:seed --class={Seederクラス名}  
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む