Laravel 5.1 Broadcastig EventsでPusherを利用してリアルタイム更新アプリを作成するには

Laravelは、アプリケーション独自のイベントを実装する仕組みをフレームワークとして用意しています(参照: Events)。
5.1からこのイベントシステムに、PusherおよびRedis PubSubに対応したBroadcasting Eventsが追加されました。

Broadcasting Eventsを利用したリアルタイム更新アプリのチュートリアルが、sitepointにあったので、それを試しつつLaravelのEventについて調べてみたことをまとめてみました。

今回試した記事は、「Real-time Apps with Laravel 5.1 and Event Broadcasting」になります。

実装していくのは、以下のような構成で更新をリアルタイムに通知するToDoアプリです。
Laravel5.1 Bloadcasting Pusher Provider アーキテクチャ
新規にToDoの項目が追加されるとLaravelアプリはPusher APIを呼び出します。
Pusherはアプリを参照しているすべてのブラウザに更新を通知します。
通知を受けるとJavascriptからLaravelのAPIを呼び出し新しく追加されたToDoアイテムを表示する流れです。

Laravelの動作環境は、Laravel Homesteadを利用しました。
Homesteadの準備については「Laravel homesteadを利用したLaravel 5 ローカル開発環境の構築」も参照ください。
“Laravel 5.1 Broadcastig EventsでPusherを利用してリアルタイム更新アプリを作成するには” の続きを読む

Laravel5でForm & Htmlコンポーネントを有効にする

Laravel5では、ビューで利用するForm、Htmlファサードを含むコンポーネントはコアから外され、コミュニティパッケージLaravel CollectiveからForm & Htmlとして提供されています。

Laravelフレームワークが提供するbladeテンプレートの機能だけでもそこまで困ることは無いですが、フォーム要素の中でとくに扱いが面倒なプルダウン(select要素)とチェックボックスあたりはやはり便利なので入れておいた方が良いパッケージです。

セットアップ手順

利用するための手順は以下の通りです(Laravel 5.5で確認)。

Composerでコンポーネントを追加

$ composer require "laravelcollective/html":"^5.4.0"

プロバイダとファサードの登録

v5.6以前のドキュメントには、config/app.phpprovidersaliasに設定を追加するように書いてありますが、現在は、composer.jsonextra.laravelにロードすべきプロバイダとファサードが指定してあるので、手動で追加する必要はありません。

// laravelcollective/htmlのcomposer.json
        "laravel": {
            "providers": [
                "Collective\\Html\\HtmlServiceProvider"
            ],
            "aliases": {
                "Form": "Collective\\Html\\FormFacade",
                "Html": "Collective\\Html\\HtmlFacade"
            }
        }

参照: Package Development – Laravel – The PHP Framework For Web Artisans

使い方

Bootstrapを利用したフォームの実装例で説明してみます。
Laravel 5.5 は bootstrap-sass を利用しているので、Bootstrapのバージョンは3になります。

$ php artisan make:model Customer -mc

マイグレーションには以下のようなフィールドを追加します。

// database/migrations/YYYY_MM_DD_070946_create_customers_table.php
    public function up()
    {
        Schema::create('customers', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name'); // テキスト
            $table->string('state'); // プルダウン
            $table->integer('age'); // プルダウン
            $table->boolean('has_contract'); // チェックボックス
            $table->timestamps();
        });
    }

コントローラは、フォームのテンプレート resources/views/customer/create.blade.phpを返すcreateアクションと、フォームのPOST先のアクションstoreのみを実装しておきます。
storeアクションはPOSTされたリクエストパラメータをflashしてフォームにリダイレクトするだけです。これは、テンプレートでパラメータの値をoldメソッドで取得し、セットし直す動作を確認するための最小限の実装をしています。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class CustomerController extends Controller
{
    public function create() {
        return view('customer.create');
    }

    public function store(Request $request) {
        // TODO store customer
        $request->flash();
        return redirect()->route('customer.create');
    }
}

ルーティングに以下を追加しておきます。

Route::get('/customer/create', 'CustomerController@create')->name('customer.create');
Route::post('/customer/store', 'CustomerController@store')->name('customer.store');

フォームのテンプレートは以下のようになります。

<!doctype html>
<html lang="{{ app()->getLocale() }}">

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>LaravelCollective/HTML</title>
  <link rel="stylesheet" href="{{ asset('css/app.css') }}">
  <style>
    html, body {
        background-color: #fff;
        color: #636b6f;
        font-family: 'Raleway', sans-serif;
        font-weight: 100;
        height: 100vh;
        margin: 1.5rem;
    }
  </style>
</head>

<body>
  {{ Form::open(['route' => 'customer.store']) }}
    <div class="form-group">
      <label>氏名</label>
      {{Form::text('name', old('name'), ['class' => 'form-control'])}}
    </div>
    <div class="form-group">
      <label>都道府県</label>
      {{Form::select('state', ['01' => '北海道', '02' => '青森'], old('state'), ['class' => 'form-control'])}}
    </div>
    <div class="form-group">
      <label>住所</label>
      {{Form::textarea('address', old('address'), ['class' => 'form-control', 'rows' => '3'])}}
    </div>
    <div class="form-group">
      <label>年齢</label>
      {{Form::selectRange('age', 20, 100, old('age'), ['class' => 'form-control'])}}
    </div>
    <div class="form-group">
      <label>購入済み</label>
      {{Form::checkbox('has_contract', 'true', old('has_contract'))}}
    </div>
    <div>
      {{Form::submit('保存', ['class' => 'btn btn-primary'])}}
    </div>
  {{ Form::close() }}
</body>

</html>

上記コードのポイントとしては、スタイルシートcss/app.cssを読み込んでBootstrapのスタイルシートを適用していること、flashした入力データをold関数で取得して値にセットし直しているあたりです。

実行結果は以下、フォームを適当に入力して[保存]すると値が保持されていることを確認できます。(コントローラの$request->flashを削除すると保持されないことも確認できます)

Laravel5 入門 インストールからMVCの基本機能をさっと眺める

Laravel5 を試したメモ

他のフレームワークを利用している人が、Webアプリを作成するにあたって抑えておくべきポイントだけピックアップしてみた

インストール

ローカル開発環境の準備

Laravel5は、PHPやNginx、MySQLなど必要なパッケージをインストールずみのVagrantローカル開発環境 Homestead 提供している

Homesteadのセットアップ手順については、Laravel 5 ローカル開発環境 homestead 構築手順にまとめている
“Laravel5 入門 インストールからMVCの基本機能をさっと眺める” の続きを読む

Laravel homesteadを利用したLaravel 5 ローカル開発環境の構築

Laravelは、フロントエンドのビルドツールLaravel ElixrがGulpタスクであるためPHPの他にNode環境が必要になったりと、ひととおり開発環境を揃えるのが若干面倒だったりします。
そこで、Laravelには、ローカル開発用のVagrant box Laravel Homestead が用意されています。

この記事では、Homesteadを利用したLaravel5の開発環境の構築手順を試してみたのでまとめてみました。

前提条件としてVirtualboxとVagrantはインストール済みとして解説します。
boxはVirtualboxとVMWare プロバイダ用がありますが、ここではVirtualboxを利用します。

HomesteadのVagrant boxを追加

vagrant boxコマンドでhomestead boxを追加します。

$ vagrant box add laravel/homestead
==> box: Loading metadata for box 'laravel/homestead'
    box: URL: https://atlas.hashicorp.com/laravel/homestead
This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.

1) virtualbox
2) vmware_desktop

Enter your choice: 1
==> box: Adding box 'laravel/homestead' (v0.4.1) for provider: virtualbox
    box: Downloading: https://atlas.hashicorp.com/laravel/boxes/homestead/versions/0.4.1/providers/virtualbox.box
==> box: Successfully added box 'laravel/homestead' (v0.4.1) for 'virtualbox'!

virtualboxを選択します。

Homesteadのインストール

ユーザのホームディレクトリにHomesteadをインストールします。
Homesteadには、Vagrantfileと初期設定のためのシェルのみが含まれます。

以下のコマンドを実行してHomesteadをセットアップします。

$ ~
$ git clone https://github.com/laravel/homestead.git Homestead
$ cd Homestead/
$ bash init.sh
Homestead initialized!

クローンして、init.shを実行すると設定を含む~/.homesteadディレクトリが作成されます。
“Laravel homesteadを利用したLaravel 5 ローカル開発環境の構築” の続きを読む

Laravel ExcelでPHPExcelを利用するには

PHPExcelをLaravelで利用する場合はサービスプロバイダー Laravel Excel が使えます。

HP: http://www.maatwebsite.nl/laravel-excel/
Github: https://github.com/Maatwebsite/Laravel-Excel

Laravel Excelのセットアップ

composer.jsonのrequireにパッケージを追加

// composer.json
    "require": {
        "laravel/framework": "4.2.*",
        "maatwebsite/excel": "1.*"
    },

Composerを更新する

$ php composer.phar update

or

$ composer update

“Laravel ExcelでPHPExcelを利用するには” の続きを読む

LaravelをApacheのサブディレクトリ(Alias)にインストールするには

公式フォーラムに書いてありました。
[SOLVED] Apache Alias (subfolder) and .htaccess (Page 1) / Laravel 4.x Help / Laravel Forums

物理ディレクトリ /var/www/hellolaravel/ にlaravelのプロジェクトを配置した場合のhttpd.confと.htaccessの設定は以下の用になります。

[text title=”https.conf”]
Alias /hellolaravel "/var/www/hellolaravel/public/"

<Directory "/var/www/hellolaravel/public/">
Options Indexes FollowSymLinks MultiViews
AllowOverride all
Order allow,deny
Allow from all
</Directory>
[/text]

.htaccessはRewriteBaseを追加します。
[text title=”hellolaravel/public/.htaccess” highlight=”9, 11″]
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>

RewriteEngine On

# Redirect Trailing Slashes…
RewriteRule ^(.*)/$ /hellolaravel/$1 [L,R=301]

RewriteBase /hellolaravel

# Handle Front Controller…
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
[/text]
最後のSlashを削除するRewriteRule(“# Redirect Trailing Slashes…”の箇所)を残す場合は、”/helloralavel”を追加しておきます(9行目)。

以上の設定で、http://hostname/helloraravel/でアクセスできるようになります。