WinRoadのLaravel4初心者講座

次世代PHPフレームワークのLaravel4を初心者向けに解説して参ります。

Winroad徒然草の管理人がお届けします
Laravel4

ファイルをデータベースに保管する

今日は、画像ファイルやPDFファイルなどをデータベースに保管する方法をご紹介します。

  1. テーブルにバイナリデータ保管用のカラムとMIMEタイプ保管用のカラムを作成します。
  2. アップロード用のビューファイルから送信されたファイルをInput::file(‘file’)で取得します。
  3. Input::file(‘file’)->getMimeType()でMimeタイプを取得します。
  4. file_get_contents(Input::file(‘file’))で、ファイル本体を取得します。
  5. いったんデータベーステーブルに保存します。
  6. 画像ファイルを表示するために、idから取得します。
  7. バイナリデータをbase64でエンコードします。
  8. 表示用のビューファイルに、base64でエンコードした画像本体とMIMEタイプを送信します。
  9. 表示用のビューファイルのimgタグでブラウザ上に表示します。

それでは、実際に作成してみましょう。まず、最初にデータ保管用のテーブル(cabinets)を作成します。

<?php
class SetupController extends BaseController{
 public function getCabinets(){
 //cabinetsテーブルの存在確認
 if(Schema::hasTable('cabinets')){
 $data['warning']='cabinetsテーブルはあります。';
 return View::make('setup.index',$data);
 }
 //cabinetsテーブルの作成
 Schema::create('cabinets',function($table){
 $table->increments('id');
 //genbaテーブルへのリレーション用
 $table->integer('G_id')->nullable();
 //name
 $table->string('name',100)->nullable();
 //MIMEタイプの保存
 $table->string('mime',50)->nullable();
 //publicフォルダ用保存域パス
 $table->string('path',100)->nullable();
 //データ保管庫
 $table->binary('data')->nullable();
 //created_atとupdated_atの同時作成
 $table->timestamps();
 //deleted_atカラムを追加
 $table->timestamp('deleted_at')->nullable();
 });
 $data['warning']='cabinetsテーブルを作成しました。';
 return View::make('setup.index',$data);
 }
}

※データベーステーブル作成用のコントローラです。とりあえす、id,mime,dataカラムがあれば、問題ありません。

17行目:publicフォルダにファイルを保管するための保存パスの登録用カラムです。こちらに保管する方が簡単なのですが、今回は、データベースに直接フィルを保存する方法をご紹介します。

19行目:画像データやPDFファイルなどをデータベースに保管するには、データ種別をバイナリで保管します。※スキーマビルダーでは、$table->vinary()で、BLOBカラムを作成しますが、大きめのファイルも保管するのでしたら、LONGBLOBを使用した方がいいでしょう。尚、MEDIUMBLOBやLONGBLOBは、スキーマビルダーでは作成できません。

2015-02-14 22-49-13

次にモデルを作成します。モデルは特に問題はありませんが、念のために記述しておきます。

<?php
class Cabinet extends Eloquent{
 //テーブル名がcabinets(複数形)なら省略可
 protected $table='cabinets';
 //primaryKeyがidなら省略可
 protected $primaryKey='id';
 //複数代入の制限
 protected $guarded=['id','created_at','updated_at','deleted_at'];
 //ソフトデリートを使用
 protected $softDelete=true;
}

コントローラを作成します。

<?php
class CabinetController extends BaseController {
  //一覧表の表示
 public function getIndex(){
 $cabinets=Cabinet::orderBy('created_at','desc')->get();
 return View::make('cabinet.index',compact('cabinets'));
 }
 
 //アップロードデータの作成用ビュー
 public function getCreate($id=null){
 $genba=Genba::find($id);
 return View::make('cabinet.create',compact('genba'));
 }
 //ファイルのアップロード処理
 public function postCreate(){
 //ファイルのアップロード確認
 if(!Input::hasFile('file')){
 return Redirect::back()
 ->with('warning','<div class="uk-alert uk-alert-danger">ファイルがアップされていません</div>');
 }
 //アップロードファイルを取得
 $file=Input::file('file');
 //return var_dump($file);
 $name=date('YmdHis.').$file->getClientOriginalExtension();
 //新規データの作成
 $cabinet=new Cabinet;
 $cabinet->G_id=Input::get('G_id');
 $cabinet->name=Input::get('name');
 //テーブルのdataカラムにバイナリデータで保存
 $cabinet->data=file_get_contents($file);
 $cabinet->mime=$file->getMimeType();
 $cabinet->path='images/'.$name;
 $cabinet->save();
 //publicフォルダに保存
 $file->move('images/',$name);
 return Redirect::to('cabinet/view/'.$cabinet->id);
 }
 //画像ファイルをブラウザに表示する為の準備
 public function getView($id){
 //データベースに保存してあるデータを取得
 $file=Cabinet::find($id);
 //バイナリデータをbase64でエンコード
 $data['base64']=base64_encode($file->data);
 //mimeタイプを取得
 $data['mime']=$file->mime;
 return View::make('cabinet.view',$data);
 }

※31行目:file_get_contents()関数で、アップロードしたファイルを保存します。

ファイルのアップロード用ビューファイルを作成します。

@extends('uk.base')
 @section('content')
 <h3 class="menuTab">現場資料のアップデート</h3>
 {{ Session::get('warning') }}
 {{ Form::open(['files'=>'true','class'=>'uk-form uk-form-horizontal']) }}
<div class="uk-form-row">
 {{ Form::label('name','現場名',['class'=>'uk-form-label uk-form-large']) }}
 {{Form::text('name',$genba->name,['class'=>'uk-form-width-large','disabled'=>'disabled'])}}
 </div>
   <div class="uk-form-row">
 {{ Form::label('path','保存パス',['class'=>'uk-form-label']) }}
 {{Form::text('path','',['class'=>'uk-form-width-large'])}}
 </div>
 <div class="uk-form-row">
 {{ Form::label('item','ファイル種別',['class'=>'uk-form-label']) }}
 {{Form::text('item','',['class'=>'uk-form-width-large'])}}
 </div>
<div class="uk-form-row">
 {{ Form::label('file','保存ファイル',['class'=>'uk-form-label']) }}
 {{ Form::file('file') }}
 </div>
<hr>
{{ Form::hidden('name',$genba->name) }}
 {{ Form::hidden('G_id',$genba->id) }}
 {{ Form::submit('アップロード',['class'=>'uk-button uk-button-primary uk-width-1-2'] )}}
{{ Form::close() }}
 @stop

画像表示用のビューファイルです。

@extends('uk.base')
 @section('content')
 <h1>Cabinet</h1>
 <div class="uk-thumnail uk-thumnail-large">
 <img src='data:{{$mime}};base64,{{$base64}}'>
 </div>
 @stop

※<img src=”data:img/png;base64,base64_encode(バイナリデータ)”>で、データベーステーブルに保存したバイナリデータを表示します。

Laravel5(開発版)のインストール

今月中にリリース予定のLaravel5ですが、待ちきれないので、開発版をインストールして試してみたいと思います。

インストール

  1. まず、コマンドプロンプトを起動したら、下記のコマンドを入力します。
    • composer create-project laravel/laravel C:\xampp\htdocs\laravel dev-develop
    • 上記のC:\xampp\htdocs\laravelには、インストールしたいフォルダ名(場所)を指定します。
  2. laravel5は、フォルダ構成が大幅に変更になっています。
  3. ルートフォルダ(laravel直下のトップフォルダ)内には、app、bootstrap、config、database、public、resources、strage、tests、vendorがあります。
  4. appフォルダ内には、Console、Http、Providersフォルダがあります。
  5. そして、Httpフォルダの中に、Controllers、Middleware、Requestsフォルダと、kernel.phpファイルとroutes.phpファイルがあります。
    • 2014-11-06 10-24-02
  6. laravel4とは、大幅に変更されていますので、最初は戸惑います。また、リリースまでにさらに変更になる可能性もあります。※ほんの1週間前までは、routes.phpファイルすらありませんでした。

ルーティング

  1. まず、気になるのが、ルーティングですが、app/Http/routes.phpファイルでルーティングを指定します。
  2. デフォルトのroues.phpの中身を見てみましょう。
    • <?php
      $router->get('/', 'HomeController@index');
      $router->controller('auth', 'AuthController');
      $router->controller('password', 'PasswordController');
  3. デフォルトでは、3つのルーティングが指定されています。
  4. まず、トップページの指定ですが、HomeControllerのindexメソッドが指定されています。
  5. そして、AuthControllerと、PasswordControllerがレストフルコントローラとして指定されています。
  6. Laravel4では、下記のような指定になるはずですので、違いを確認して下さい。
    • <?php
      Route::get('/', 'HomeController@index');
      Route::controller('auth','AuthController');
      Route::controller('password','PasswordController');

コントローラ

  1. それでは、コントローラの中身を確認してみましょう。下記のようになっています。
    • <?php namespace App\Http\Controllers;
      class HomeController extends Controller {
      public function Index()
      {
       return view('hello');
       }
      }
  2. まず、一番の違いは、名前空間の指定です。laravel4では、コントローラは名前空間を指定する必要が無かったのですが、laravel5からは、名前空間の指定が必須になるようです。
  3. 試しに、<?php //namespace App\Http\Controllers; と、名前空間の指定箇所をコメントアウトしてみると、下記のようにエラーが表示されます。
    • 2014-11-06 10-57-50
  4. そして、ビューの指定ですが、View::make()では、なくて、view()に変更になっています。
  5. ここもView::make(‘hello’)に変更してみると、下記のようなエラーが表示されます。
    • 2014-11-06 11-03-30
  6. つまり、「Viewクラスが、App\Http\Controllersフォルダ内に見つかりません。」と表示されます。
  7. Laravel4のようにViewクラスを使うには、use演算子で指定(インポート)する必要があります。つまり、下記のように修正すれば、Viewクラスのmakeメソッドが使えるようになります。
    • <?php namespace App\Http\Controllers;
       use Illuminate\Support\Facades\View;
       class HomeController extends Controller {
       public function Index()
       {
       //return view('hello');
       return View::make('hello');
       }
       }

ビュー

  1. ビューの場所は、resourcesフォルダ内に移動になっています。resourcesフォルダ内には、assetsフォルダ、langフォルダとviewsフォルダがあります。
  2. ビューに関しては、場所が変更になった程度で他に特段明記するような変更は無いように思われます。

モデル

  1. モデルに関してですが、laravel4のようにモデルだけを格納しておくようなフォルダはなくなったようです。モデルは、好きなように好きな場所に作成して下さいと言うことでしょうか。
  2. モデルの例として、app/User.phpファイルが作成されていますので、中身を確認してみましょう。
    • <?php namespace App;
      use Illuminate\Auth\UserTrait;
      use Illuminate\Database\Eloquent\Model;
      use Illuminate\Contracts\Auth\User as UserContract;
      use Illuminate\Auth\Passwords\CanResetPasswordTrait;
      use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;
      use Illuminate\Database\Eloquent\SoftDeletingTrait;
      class User extends Model implements UserContract, CanResetPasswordContract {
      use UserTrait, CanResetPasswordTrait, SoftDeletingTrait;
      /**
       * The database table used by the model.
       *
       * @var string
       */
       protected $table = 'users';
      /**
       * The attributes excluded from the model's JSON form.
       *
       * @var array
       */
       protected $hidden = ['password', 'remember_token'];
       protected $dates = ['deleted_at'];
       
      }
    • 7行目と22行目は、ソフトデリートを使用するために、私が追加しました。
  3. まず、Laravel5では、名前空間は必須ですので、namespace App;で現在のファイルのある場所を指定します。
  4. そして、このUserモデルで使用するクラスやトレイトをuse演算子で指定します。
  5. 尚、このUserモデルを試しにHomeControllerで使用してみます。HomeControllerを下記のように修正します。
    • <?php namespace App\Http\Controllers;
      use App\User;
      class HomeController extends Controller {
      public function Index()
       {
       $user=User::find(1);
       return view('hello',compact('user'));
       }
      }
    • Userモデルを使用するには、2行目のuse演算子が必要になってきます。尚、2行目のuse演算子を使用しないで、6行目を下記のように記述してもOKです。
    • $user=\App\User::find(1);
  6. そして、app/resources/views/hello.phpファイルの<h1>You have arrived.</h1>を<h2>ようこそ<?php echo $user->name;?>さん</h2>と変更したら下記のように表示されます。
    • 2014-11-06 12-04-44

まだ、さわり程度ですが、使ってみた感想は、Laravel4に比べてコードの記述量が増えています。しかし、Laravelの特徴であった記述の簡易さを多少犠牲にしてでも自由度を追求した結果でしょうか。好みの分かれるところだと思いますが、私としては歓迎しています。いまからリリースが楽しみです。

Laravel Excelでシート内の操作

Laravel Excelのシート内の操作方法を調べてみたいと思います。

行の操作

Laravel Excelで行の操作を行うには、rowメソッドを使用します。rowメソッドの第1引数には、指定行、第2引数には、行内のセルの値を配列で指定します。

//1行目のセルに値を代入
 $sheet->row(1,['test1','test2']);
//2行目のセルに値を代入
 $sheet->row(2,['test3,'test4']);

又、指定行のセルのプロパティを変更するには、第2引数にクロージャーでset+プロパティメソッドを指定します。

$sheet->row(1,function($row){
 //1行目のセルの背景色に青を指定
 $row->setBackground('#0000FF');
 //1行目のセルの文字色に白を指定
 $row->setFontColor('#FFFFFF');
 });

行の追加

行を追加するには、appendRowメソッドを使用します。第1引数に指定した行の直後に、第2引数で指定した配列の値のセルを追加します。又、第1引数に行を指定せずに、配列を直接指定すれば、最終行の後に指定した配列の値のセルを挿入します。

//2行目の後に行を追加します。
$sheet->appendRow(2,['test1','test2']);
//最終行の後に行を追加します。
$sheet->appendRow(['test3',test4']);

行の挿入

又、prependRowメソッドを使用すれば、指定した行の直前に行を挿入します。又、上記と同様に第1引数に行を指定しないで、配列を直接指定すれば、最初の行の直前に行を挿入します。

//3行目の直前に指定した値の行を挿入します。
$sheet->prependRow(3,['test1',test2']);
//最初の行の直前に行を挿入します。
$sheet->prependRow(['test3','test4']);

複数行の追加

複数行を追加するには、rowsメソッドを使用します。

$sheet->rows([
['test1',test2'],
['test3','test4']
]);

セルの操作

セルを操作するには、cellメソッドを使用します。cellメソッドの第1引数にはセルの位置、第2引数は、クロージャーを指定します。そして、複数のセルを同時に操作するにはcellsメソッドを使用します。

$sheet->cell('A1',function($cell){
 //ここにセルの操作を記述します。
 });
 #sheet->cells('A1:A5',cunftion($cell){
 //ここに複数のセルの操作を記述します。
 });

セルのプロパティを操作するには、set+プロパティ名メソッドを使用します。

  • 背景色の変更
    $cells->setBackground('#000000');
  • フォントカラーの変更
    $cells->setFontColor('#FFFFFF');
  • フォントの種類の変更
    $cells-&gt;setFontFamily('MS ゴシック');
  • フォントサイズの変更
    $cells->setFontSize(16);
  • フォントの太さの変更
    $cells->FontWeight('bold');
  • フォントの複数のプロパティを同時に変更
    $cells->Font([
     'family' => 'MS明朝',
     'size'  => '16',
     'bold' => true
     ]);
  • 罫線を上、右、下、左の順に指定
    $cells->setBorder('solid','none','none','solid');
  • 罫線の種類の指定を配列で指定
    $cells->setBorder([
     'borders' => [
     'top' => ['style' => 'solid'],
     ]
     ]);
  • セル内の横の配置を指定
    $cells->setAlignment('center');
  • セル内の縦の配置を指定
    $cells->setValignment('middle');

 シートのスタイル変更

シートのスタイルを変更するには、setStyleメソッドを使用します。

$sheet->setStyle([
 'font' => [
 'name' => 'MS明朝',
 'size' => '15',
 'bold' => true
 ]
 ]);

また、シートのフォントをまとめて変更するには、setFont()メソッドを使用し、別々に変更するには、set+プロパティ名メソッドを使用します。

//シートのフォントをまとめて変更
 $sheet->setFont([
 'family' => 'MSゴシック',
 'size' => '15',
 'bold' => true
 ]);
//シート内のフォント種類を変更
 $sheet->setFontFamily('MS明朝');
 //シート内のフォントサイズを変更
 $sheet->setFontSize(15);
 //シート内のフォントの太さを変更
 $sheet->setFontBold(true);
//シート内のすべての罫線をまとめて変更
 $sheet->setAllBorders('thin');
 //シート内のセルの罫線を指定して変更
 $sheet->setBorder('A1','thin');
 //シート内のセルの罫線の範囲を指定して変更
 $sheet->setBorder('A1:F10','thin');

シートのウインドウ枠の固定

シートのウインドウ枠を固定するには、freeze+固定位置メソッドを使用します。

//シートの最初の行を固定します。
 $sheet->freezeFirstRow();
 //シートの最初の列を固定します。
 $sheet->freezeFirstColumn();
 //シートの最初の行と列を固定します。
 $sheet->freezeFirstRowAndColumn();
 //固定位置をセルで指定します。
 $sheet->setFreeze('A2');

オートフィルター

オートフィルターを使用可能にするには、setAutoFilterメソッドを使用します。引数には、オートフィルターを使用する範囲を指定しますが、範囲の指定しない場合は、シート全体にフィルターが適用されます。

//シート全体にオートフィルターを適用する
$sheet->setAutoFilter(); 
 //範囲を指定してオートフィルターを適用する
 $sheet->setAutoFilter('A1:E10');

セルのサイズ変更

セルのサイズを変更するには、setWidth,setHeightメソッドを使用します。setWidthとsetHeightは、それぞれ一つの列や幅を変更するには、第1引数に、列(行)を指定して、第2引数でその値を指定します。また、まとめて指定するには、配列で指定します。

  • セルの幅を変更
    //一つの列の幅を変更する
     $sheet->setWidth('A5',5);
     //複数の行の幅を同時に変更する
     $sheet->setWidth([
     'A' => 5,
     'B' => 10
     ]);
  • セルの高さを変更
    //一つの行の高さを変更する
     $sheet->setHeight(1,50);
     //複数の行の高さを同時に変更する
     $sheet->setHeight([
     1 => 50,
     2 => 25
     ]);

セルのサイズ(幅、高さ)を同時に変更するには、setSizeメソッドを使用します。setSizeメソッドの第1引数には、セルの位置、第2引数には、幅、第3引数には、高さを指定します。また、配列で指定することもできます。

  • 一つのセルのサイズを変更
    $sheet->setSize('A1',500,50);
  • セルのサイズを配列で指定して変更
    $sheet->setSize([
     'A1' => [
     'width' => 50,
     'height' => 500,
     ]
     ]);

オートサイズ

エクスポートされたファイルは、自動的にサイズは設定されています。オートサイズはsetAutoSizeメソッドで、変更することができます。

//オートサイズを有効にする
 $sheet->setAutoSize(true);
 //オートサイズを無効にする
 $sheet->setAutoSize(fale);
 //指定列だけのオートサイズを無効にする
 $sheet->setAutoSize([
 'A','C'
 ]);

 セルの結合

セルを結合するには、mergeCellsメソッドや、setMergeColumnメソッドを使用します。mergeCellsメソッドは、結合するセルの範囲を指定します。

$sheet->mergeCells('A1:E1');

setMergeColumnメソッドは、結合する列や行を配列で指定します。

$sheet->setMergeColumn([
'columns' => ['A','B','C','D'],
'rows => [
[2,3],[5,11]
]
]);

列のフォーマット指定

列のフォーマットを変更するには、setColumnFormatメソッドを使用します。setColumnFormatメソッドは、フォーマット形式を配列で指定します。

//列のフォーマットを%形式に変更
$sheet->setColumnFormat([
'C' => '0%'
]);
$sheet->setColumnFormat([
'A2:K2' => '0000'
]);
$sheet->setColumnFormat([
'B' => '0',
'D' => '0.00',
'E' => '@',
'F' => 'yyyy-mm-dd',
]);

 PHPExcelのメソッド

$excelメソッドや、$sheetメソッドから、PHPExcelのメソッドも呼び出すことができます。

Laravel Excelでシートの作成

Laravel Excelでシートを作成するには、sheetメソッドを使用します。

sheet(‘シート名’,’クロージャー’)

sheetメソッドの第1引数には、シート名、第2引数にはクロージャーを指定します。

Excel::create('filename',function($excel){
 $excel->sheet('sheetname',function($sheet){
 //ここにシートを作成するためのロジックを記述します。
 });
 })->export('xlsx');

また、複数シートの指定もできます。

Excel::create('Filename',function($excel){
 //一つ目のシート
 $excel->sheet('First sheet',function($sheet){
 });
 //二つ目のシート
 $excel->sheet('Second sheet',function($sheet){
 });
 })->export('xlsx');

シートのプロパティ変更

シートのプロパティは、set+プロパティメソッドで、変更することができます。

Excel::create('Filename',function($excel){
 $excel->sheet('Sheetname',function($sheet){
 //印刷方向を横に指定します。
 $sheet->setOrientation('landscape');
 });
 ])->export('xlsx');

ページ余白の設定

シートのページ余白を指定するには、setPageMarginメソッドを使用します。余白の指定方法は、すべての余白を同じ数字にするには、数値で指定し、上下左右別々で指定するには、配列で(上、右、下、左)の順に指定します。

//ページの上、右、下、左の余白を指定します。
 $sheet->setPageMargin(array(
 0.25,0.30,0.25,0.30
 ));
//すべての余白を同じ値で指定します。
 $sheet->setPageMargin(0.25);

※上記余白の値は、インチでの指定ですので、0.25インチは、約0.635センチ、0.30インチは0.762センチになりますので注意して下さい。

尚、app/config/maatwebsite/excel/export.phpの83行の’page_margin’=>false,のfalseの箇所にデフォルトの余白の値をインチ数で指定しておくこともできます。

配列の値でシートの作成

fromArrayメソッドを使用すれば、配列の値で、シートを作成することができます。

fromArray(‘配列データ’,nullの値、セルの開始位置,0の表示の有無,見出し行の有無)

fromArrayの第1引数には、配列の値を指定します。第2引数には、空白セルの指定値?を指定します。第3引数にはセルの開始位置、そして第4引数には、*0を表示するかどうかの指定を行います。第5引数は、セルの見出し行の有無を指定します。

Excel::create('Filename',function($excel){
 $excel->sheet('Sheetname',function($sheet){
 $sheet->fromArray([
 ['data1','data2'],
 ['data3,'data4']
 ]);
 });
 })->export('xlsx');

with()メソッド

fromArrayメソッドの代わりに、withメソッドを使用することもできます。

$sheet->with([
 ['data1,'data2'],
 ['data3,'data4']
 ]);

use($data)

外部からクロージャーに変数を渡したい場合は、use()を使用することができます。

public function getIndex(){
 $data = User::all();
 Excel::create('ユーザー一覧', function($excel) use($data) {
 $excel->sheet('ユーザー一覧', function($sheet) use($data) {
 $sheet->fromArray($data);
 });
 })->export('xlsx');
 }

下記のようなExcelファイルが簡単に作成できます。

2014-08-16 16-34-27

0の値の表示

デフォルトでは、配列データに0の値を指定しても、空白セルと判断して、何も表示されません。そこで、第4引数にtrueを指定することで、0の値を0と判断して、0の文字を表示するようになります。

見出し行の生成の有無

上記の画像でも分かるように、デフォルトでは、モデルの属性名を見出し行として、生成します。見出し行としてモデルの属性名を使用したくないときは、fromArrayメソッドの第5引数にfalseを指定するか、app/config/packages/maatewbsite/excel/export.phpの48行目のtrueをfalseに変更します。

‘generate_heading_by_indices’  => false,

 fromModel(‘モデル名’)

fromModelメソッドを使用すれば、Eloquentモデルからデータを取得することができます。

Laravel ExcelでExcelファイルの作成

Laravel ExcelでExcelファイルを作成するには、createメソッドを使用します。

Excel::create(ファイル名,クロージャー)

createメソッドの第1引数には、作成するExcelファイル名、第2引数には、クロージャー(無名関数)を指定します。

(例)

Excel::create('Filename',function($excel){
 //ここに作成するExcelのメソッドを記述します。
});

プロパティの変更

書き出すExcelファイルのプロパティは、デフォルトで、app/config/packages/maatwebsite/excel/config.phpの19行目以下の内容が適用されます。

/*
 |--------------------------------------------------------------------------
 | Default properties
 |--------------------------------------------------------------------------
 |
 | The default properties when creating a new Excel file
 |
 */
 'properties' => array(
 'creator' => 'Maatwebsite',
 'lastModifiedBy' => 'Maatwebsite',
 'title' => 'Spreadsheet',
 'description' => 'Default spreadsheet export',
 'subject' => 'Spreadsheet export',
 'keywords' => 'maatwebsite, excel, export',
 'category' => 'Excel',
 'manager' => 'Maatwebsite',
 'company' => 'Maatwebsite',
 ),

デフォルトのプロパティを変更したい場合は、ここを変更して下さい。特に、creatorやmanager、company等は変更しておいた方がいいと思います。

さらに、作成するExcelファイルごとに変更したい場合は、set+プロパティ名メソッドを使用します。

(例)

Excel::create('Filename',function($excel){
 //タイトルの変更
 $excel->setTitle('Winroda徒然草');
 //作成者の変更
 $excel->SetCreator('nakada')->setCompany('builwing');
 //概要(説明文)の変更
 $excel->setDescription('このファイルはWinroadが作成しました');
 });

 エクスポート

作成したExcelファイルを書き出すには、exportメソッドか、downloadメソッドを使用します。exportメソッドとdownloadメソッドの引数には、書き出すファイルの拡張子を指定します。

  • export(‘xls’),download(‘xls’)
    拡張子がxlsのExcel97-2003ブックを書き出します。
  • export(‘xlsx’)、download(‘xlsx’)
    拡張子がxlsxのExcel2007ブックを書き出します。
  • export(‘csv’)、download(‘csv’)
    拡張子がcsvのCSVファイルを書き出します。

(例)

Excel::create('Filename',function($excel){
 //ここにExcelファイルを作成するメソッドを記述します。
 })->export('xlsx');

サーバーに保存

作成したExcelファイルをサーバーに保存するには、storeメソッドを使用します。保存場所は、デフォルトで、app/storage/exportsフォルダになっています。

このデフォルトフォルダは、app/config/packages/maatwebsite/excel/export.phpの123行目に指定されていますので、デフォルトフォルダを変更する場合は、ここを修正します。

/*
 |--------------------------------------------------------------------------
 | Store settings
 |--------------------------------------------------------------------------
 */
'store' => array(
/*
 |--------------------------------------------------------------------------
 | Path
 |--------------------------------------------------------------------------
 |
 | The path we want to save excel file to
 |
 */
 'path' => storage_path('exports'),

また、ファイルごとに、保存場所を変更したい場合は、sotoreメソッドの第2引数に、指定することもできます。

(例)

Excel::create('Filename',function($excel){
 //ここに作成するExcelのメソッドを記述します。
 })->store('xlsx',public_path('excel');

尚、保存と書出を同時にする場合はメソッドチェーンを使用します。

->sotore(‘xlsx’)->export(‘xlsx’);

Laravel Excelの導入

LaravelでExcelファイルを扱うためのパッケージ、Laravel Excelについて調べてみたいと思います。

社内サイトで、名簿や請求書を印刷するのに、ブラウザを使用していましたが、きちっとした帳票を作成したくて探し出したのがこのLaravel Excelです。Excelファイルなら、好みのレイアウトに簡単にできますので、このLaravel Excelで作成したいと思います。

Laravel Excelのインストール

Laravel Excelのインストールは例のごとく、composer.jsonを使用します。ルートフォルダ(appフォルダと同じ階層のトップフォルダ)内のcomposer.jsonに下記を追加します。

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

上記の3行目を追加したら、コマンドプロンプトでLaravelをインストールしているフォルダへ移動して、composer updateを行います。

cd \xampp\htdocs\laravel
 composer update

アップデートが完了したら、サービスプロバイダーとエイリアスに登録します。

app/config/app.php

123行目あたり:’Maatwebsite\Excel\ExcelServiceProvider’,

191行目あたり: ‘Excel’ => ‘Maatwebsite\Excel\Facades\Excel’,

そして、コンフィグファイルをインストールします。コマンドプロンプトから下記のコマンドを入力します。

php artisan config:publish maatwebsite/excel

このコンフィグファイルは、app/config/packages/maaewebsite/excelに作成され、excelフォルダ内には、cache.php、config.php、csv.php、export.php、import.php、view.phpの6個のファイルが作成されています。

これで、Laravel Excelのインストールは完了です。次回からは、使い方を調べてみたいと思います。

HomesteadにphpMyAdminのインストール

Homesteadには、phpMyAdminがついていませんので、ちょっと不便です。

そこで、HomesteadにphpMyAdminをインストールしてみたいと思います。

ターミナル(Git Bash)から、vagrant sshでHomesteadにSSH接続します。

下記のコマンドでphpmyadminをインストールします。

$ sudo aptitude install phpmyadmin

Do you want to continue?[y/n]にyと入力してEnterします。

phpmyadminの使用Webサーバーを訪ねてきますが、何も選択せずに、そのままEnterします。

2014-06-17 7-26-26

データベースの設定をするかどうか確認してきますが、データベースの設定は既にHomesteadで行っていますので、ここでは設定を変更しないので、Noを選択して、Enterします。

2014-06-17 7-30-54

これで、phpMyAdminはインストールされました。

Homestead.yamlの編集

それでは、インストールしたphpMyAdminをHomestead.yamlファイルに追加記述します。

C:\Users\Hide\.homestead\Homestead.yaml

sites:
-map: homestead.app
to: /home/vagrant/laravel
-map: homestead.phpmyadmin
to: /usr/share/phpmyadmin
  • 4行目と5行目を追加します。
  • 4行目のマップの名前は任意ですので、もっと短い名前でも構いません。たとえば、hs.adminとか。
  • ただし、この名前は、下記のhostsファイルの名前と一致するように作成しなければなりません。

hostsファイルにも、上記phpmyadminを追加します。

C:\Windows\System32\drivers\etc\hosts

127.0.0.1 homestead.app
127.0.0.1 homestead.phpmyadmin
  • 2行目を追加しました。

vagrant provisionの実行

上記設定が完了したら、vagrant provisonコマンドで、設定をprovison(供給)します。

$vagrant provision

再設定が完了したら、ブラウザから、homestead.phpmyadmin:8000と入力してください。

下記のようにphpMyAdminのログイン画面が表示されますので、ユーザー名はhomestead、パスワードはsecretでログインできます。

2014-06-17 17-25-27

ログインしたら、homesteadデータベースが確認できました。

2014-06-17 21-34-46

これで、Homesteadがより使いやすくなりました。

Homesteadの使用方法

前回、vagrand destroyでhomesteadを削除したので、再度、vagrant upでhomesteadを作成します。ほんの数分で、homesteadを作成したり、削除したりできるのが便利ですね。

homesteadを作成したら、http://homestead.app:8000とブラウザから入力して、Webサーバーへアクセスします。

2014-06-10 0-56-33

「No input file specified.」と表示されました。それは当たり前です。前回作成したC:\Users\Hide\laravelフォルダには、何も入っていませんので。

Git Bashで下記のコマンドを入力して、Laravelをインストールします。

composer create-project laravel-ja/laravel C:/Users/Hide/laravel dev-master –prefer-dist

再度、http://homestead.app:8000にアクセスして、Laravelのロゴが表示されていれば、OKです。

NetBeansの設定

それでは、NetBeansでHomesteadのLaravelを使用できるように設定をしたいと思います。

  • NetBeansを起動したら、ファイル→新規プロジェクトとクリックして、新規プロジェクトダイアログを開きます。
  • カテゴリでPHPを選択、プロジェクトで「既存のソースを使用するPHPアプリケーション」を選択して、次へをクリックします。
    2014-06-10 10-38-15
  • ソースフォルダは、C:\Users\Hide\laraveを選択します。
  • プロジェクト名を(ここでは、homesteadと名前をつけました)つけたら、PHPのバージョンは、PHP5.5を選択し、次へをクリックします。
    2014-06-10 10-42-37
  • 実行方法は、ローカルWebサイト(ローカルWebサーバーで実行中)を選択します。
  • プロジェクトURLをhttp://homestead.app:8000に変更します。
  • 開始ファイルは未入力のまま、終了をクリックします。
    2014-06-10 10-46-16

それでは、早速使用してみましょう。app/routes.phpを下記のように書き換えたら、「プロジェクトを実行アイコン」をクリックするか、F6キーを押します。

Route::get(‘/’,function()
{
//retrun View::make(‘hello’);
return ‘Hello Homestead!!!’;
});

2014-06-10 10-53-38

下記のようにブラウザから「Hello Homestead!!!」の文字が表示されたら、OKです。

2014-06-10 10-56-48

これで、一応HomesteadでLaravelが使用できるようになりました。ローカルのフォルダとVirtual Box内のHomesteadフォルダは共有していますので、NetBeansでLaravelのコントローラーやビューファイルを変更したら、Homestead内のLaravelも同時に変更されます。

SSHによる接続

ターミナル(Git Bash)から、vagrant sshをコマンド入力すると、Homestead環境に接続することができます。SSH接続を終了するには、exitを入力してください。

2014-06-10 11-04-26

データベースへの接続

homesteadのデータベースは、最初からMySQLとPostgresが利用できるように設定されています。

app/config/local/database.phpファイルを開いてみてみましょう。

<?php
return array(
'connections' => array(
'mysql' => array(
 'driver' => 'mysql',
 'host' => 'localhost',
 'database' => 'homestead',
 'username' => 'homestead',
 'password' => 'secret',
 'charset' => 'utf8',
 'collation' => 'utf8_unicode_ci',
 'prefix' => '',
 ),
'pgsql' => array(
 'driver' => 'pgsql',
 'host' => 'localhost',
 'database' => 'homestead',
 'username' => 'homestead',
 'password' => 'secret',
 'charset' => 'utf8',
 'prefix' => '',
 'schema' => 'public',
 ),
),
);
  • データベース名:homestead、ユーザー名:homestead、パスワード:secretで既に設定されています。

Git BashでHomestead環境に接続して、データベーステーブルを作成してみましょう。

まず、homesteadフォルダに移動して、SSH接続を行います。

cd homestead
vagrant ssh

vagrant@homestead:~$と表示されたら、laravelフォルダに移動して、migrationsテーブルを作成してみましょう。

cd laravel
php artisan migrate:install

Migration table created successfully.と表示されたら、migrationsテーブルは作成されたはずです。

mysqlを起動して確認してみましょう。

mysql -u homestead -p

Enter password:にsecretと入力すると、mysql>の入力待ちモードになります。

まず、データベースを調べてみます。

mysql>show databases;

下記のように4つのデータベースの中に、homesteadデータベースがあるのが確認できるはずです。

2014-06-10 16-40-12

それでは、homesteadデータベースの中に、migrationsテーブルがあるかどうかを確認してみましょう。

mysql>use homesetad;
mysql>show tables;

migrationsテーブルがあるのが確認できました。

2014-06-10 16-48-36

 

今日で、一応Homesteadの章は終了します。

尚、vagrantbox.esというサイトに、世界中の有志により配布されたVagrant boxがありますので、興味のある方は覗いてみてください。

Vagrant boxを起動する

Vagrant boxを起動する前に、C:\Windows\System32\drivers\etcフォルダにあるhostsファイルへhomesteadを追加します。

hostsファイルのセキュリティ解除

hostsファイルを開く前に、下記の手順で、hostsファイルのセキュリティをフルコントロールに変更します。この手順を踏まなければ、このファイルは修正できません。

  1. hostsファイルを右クリック→プロパティとクリックします。
  2. セキュリティタブの編集をクリックします。
    2014-06-09 17-14-34
  3. hostsのアクセス許可ダイアログで、Usersを選択して、許可項目のフルコントロールにチェックを入れ、OKをクリックします。
    2014-06-09 17-17-47
  4. Windowsセキュリティダイアログが表示されたら、「はい」をクリックします。
    2014-06-09 17-19-18
  5. これで、hostファイルを修正することができます。

hostsファイルが修正できるようになったら、テキストエディタでhostsファイルを開き、下記を追加します。

127.0.0.1    homestead.app

2014-06-09 17-29-42

ファイルを保存したら、セキュリティを元に戻してください。

Vagrant boxを起動する

一通りの準備ができたら、C:\Users\Hide\laravelフォルダを作成してから、Homesteadフォルダに移動し、vagrant upコマンドを実行します。

 mkdir laravel
 cd Homestead
 vagrant up

2014-06-09 23-42-39

VirtualBox生成のセキュリティチェックが起動したら、はいをクリックします。

セキュリティソフトで新しいネットワークが検出されましたと表示されたら、自宅/職場ネットワークをクリックします。

2014-06-09 15-26-15

長々とコマンドが表示され、コマンド入力待ちモードになったらOKです。結構早いです、1分程度で終わります。

2014-06-09 15-27-11

VirtualBoxを起動してみてください。Homesteadが実行中になっているはずです。

2014-06-09 15-37-19

Vagrantの基本コマンド

下記にVagrantの基本コマンドを記述しておきます。

  • box
    boxを管理するためのコマンドです。サブコマンドにadd、list、remove、repackage等があります。

    • box add NAME URL
      与えられたURL(または、ファイルパス)のboxをVagrantに追加し、指定したNAME(ボックス名)で保存します。
    • box list
      Vagrantにインストールされているすべてのboxを一覧表示します。
    • box remove NAME PROVIDER
      指定したNAME(ボックス名)、PROVIDERに一致したboxをVagrantから削除します。
    • box repackege NAME PROVIDER
      指定したboxを再パッケージし、使用できるようにカレントフォルダに作成します。
  • init
    カレントフォルダ(現在のフォルダ)に、Vagrantfileが存在していなければ、初期状態のVagrantfileを生成し、カレントフォルダをVagrant環境にするために初期化します。最初の引数に、再生成する元になるボックス名、次の引数にそのボックスが存在するURLを指定します。
    vagrant init NAME URL
  • package
    このコマンドは、現在起動中のVirtualBox環境を、再利用可能なboxファイルにパッケージします。
  • status
    仮想マシンの現在の状況を確認します。
  • vagrant up
    仮想マシン(Homestesd)が作成されていないときは、仮想マシンを作成します。
    仮想マシン(Homestead)が既に作成されているときは、仮想マシンを再開します。
  • vagrant suspend
    仮想マシンをスリープ状態にします。
  • vagrant resume
    仮想マシンをスリープ状態から、復帰させます。
  • reload
    仮想マシンを再起動させます。
  • vagrant halt
    仮想マシンをシャットダウンします。再開するときは、vagrant upを実行します。
  • vagrant ssh
    仮想マシンへシェルアクセスします。
  • vagrant destroy
    仮想マシンを削除します。

それでは、vagrantを削除してみたいと思います。vagrant destroyを実行します。

vagrant destroy
default:Are you sure you want to destroy the ‘default’ VM? [y/m]

yと入力してEnterすると、Homesteadが削除されます。

2014-06-09 15-45-29

VirtualBoxを起動してみてください。先ほどのHomesteadが削除されているはずです。

いよいよ、明日は、Homesteadを実際に動かして、使用方法を調べてみましょう。

Homestead.yamlの編集

SSHキーが生成されたら、C:\Users\Hide(Windowsのエクスプローラーでは、Usersはユーザーと日本語表記になっていると思います。)\Homesteadフォルダ内のHomestead.yamlファイルをテキストエディタで開きます。デフォルトでは、下記のようになっています。

---
ip: "192.168.10.10"
memory: 2048
cpus: 1

authorize: /Users/me/.ssh/id_rsa.pub

keys:
 - /Users/me/.ssh/id_rsa

folders:
 - map: /Users/me/Code
 to: /home/vagrant/Code

sites:
 - map: homestead.app
 to: /home/vagrant/Code/Laravel/public

variables:
 - key: APP_ENV
 value: local

SSHキーの設定

SSHを下記のように修正します。※Hideの部分は、各自のアカウント(フォルダ)名に変更してください。

authorize: C:/Users/Hide/.ssh/id_rsa.pub

keys:
– C:/Users/Hide/.ssh/id_rsa

共有フォルダーの設定

共有フォルダーを下記のように修正します。

folders:
– map: C:/Users/Hide/laravel
to: /home/vagrant/laravel

  • 事前にLaravelがインストールされている場合は、-map: にそのフォルダを指定します。
  • 今回は、C:\Users\Hide\laravelフォルダに新しくLaravelをインストールする事を前提に設定します。
  • to:以下は、仮想マシンのフォルダになります。

Nginxサイトの設定

siteプロパティを下記のように修正します。

sites:
– map: homestead.app
to: /home/vagrant/laravel/public

  • Laravelはデフォルトでは、publicフォルダが公開フォルダになりますので、publicフォルダを指定します。
  • つまり、homestead.app:8000でアクセスしたときに、このpublicフォルダのindex.phpが起動します。