Laravel

インストール

http://readouble.com/laravel/5/0/dev/ja/installation.html
に従ってインストール。


1.ドキュメントルートは生成したプロジェクトのpublicディレクトリに設定する。
2.プロジェクトのディレクトリ内でphp artisan key:generateを実行する
3.app/storage/をHTTPサーバが書き込み可能にする
4.app/storage/sessions/をHTTPサーバが書き込み可能にする
5.apacheを使っている場合、ドキュメントルートの「AllowOverride」を「All」に変更する
Laravel4のインストールと初期設定|Laravel|PHP|開発ブログ|株式会社Nextat(ネクスタット)

インストール(5.3、2017/01/25追記)

composer require "laravel/installer"
laravel new project #laravelコマンドはvender/binにあるので適時
cd project
composer update #これやらないと謎のエラーがでる
chmod -R 777 storage
chmod -R 777 bootstrap/cache
mv .env.example .env
php artisan key:generate
php artisan config:clear


インストール 5.3 Laravel
さくらのVPS(CentOS7)にLaravel5.3をインストールする - Qiita
Hello Laravel 5! しようとしたら一瞬つまづいた時の対応 - Qiita
Laravel、デモ画面までに行き着かなかったら

routes/web.phpにルーティングを書いても反映されない

ドキュメントルートを設定したhttpd.confのDirectoryタグのAllowOverrideをAllにする


Laravelでroutingは合ってるはずなのに404not foundが出るときにやること|Laravel|私の生き方にタイトルなど要らない

return Redirect::to('')->withInput()

パラメータをリダイレクト先でも使用出来るようにする。
リダイレクト先ではInput::old()を使ってアクセスする


http://forumsarchive.laravel.io/viewtopic.php?pid=12176

Viewでデータを加工したい

  1. Modelで頑張る
  2. Viewに処理を書く
  3. robclancy/presenterを使う
robclancy/presenterのインストール
  1. Laravelをインストールしたディレクトリにあるcomposer.jsonの「"require"」キーに「"robclancy/presenter": "1.3.*"」を追加する
  2. composer updateを行い、robclancy/presenterをインストールする
  3. app/config/app.phpのprovidersキーの最後に'Robbo\Presenter\PresenterServiceProvider'を追加する。'Illuminate\View\ViewServiceProvider'より後に設定するのがポイント。


参考:GitHub - robclancy/presenter: Decorate your objects using presenters. Primarily to keep presentation logic out of your models.

Model

public function(Request $request){
    $model->fill($request->all())->save();
    return view("hoge");
}

Modelクラスを継承した場合、fillを使うとprotected $fillableに書かれたもの以外の値は無視される。
なので、$request->all()を使用すると楽。カラム名がコントローラに記載されないので、DBとHTMLのパラメータが一致するならなお楽。

jsonとして出力する時、リレーションの対象になっているテーブルの値も出したい
namespace App;

use Illuminate\Database\Eloquent\Model;

class Hoge extends Model
{
	protected $fillable = [];

	public function user(){
                //Hogesテーブルのuser_idを元にリレーションを構成。
		return $this->belongsTo('App\User');
	}
}

Hoge::create($data)->with('user')->get();

withを使用しないと遅延ローディングの影響でjsonとしては出力されないっぽい。
withは自分自身のクラスに定義されたメソッド名を指す。また、jsonのキー名としても使用される為、必要に応じてメソッド名を変更すると良い。


参考:Eloquent:リレーション 5.4 Laravel

参考になりそうなもの

メソッドの呼び出しについて:LaravelのORMで初心者から職人へ - Qiita


Controller

コントローラとURLの紐付け

コントローラのメソッド名をURLにする事が出来る。
楽ちんではあるけど、コントローラのメソッド名変わる時に大変そうなので注意が必要。


routes

Route::controller('url名', 'HogeController');


controller

class HogeController extends BaseController {
    #HTTPのPOSTで「url名/aaa」でアクセスすると、jsonが取得出来る
    #HTTPのGETで取得したい場合、prefixはgetになる
    public function postAaa(){
        return Response::json([
            "test" => "はらへった"
        ]);
    }
}


参考:LaravelでRest APIを開発する | Webエンジニアブログ
参考:Controllers - Laravel - The PHP Framework For Web Artisans

フォームからのファイルが渡ってこない

formの属性にenctype="multipart/form-data"を追加する

テーブルのマイグレーション

php artisan migrate:make クラス名

上記のコマンドが使えない場合は、appフォルダの親までディレクトリを移動すると良い。
app/database/migrations/に上記クラス名に日付がついたものが生成される。

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateHogeTable extends Migration {

	public function up()
	{
		Schema::create("hoge", function(Blueprint $table){
                        #自動採番
			$table->increments('id');
			#$table->date('created_time');
                        #タイムスタンプ。default now()にしたい場合は下記のようにする
                        $table->timestamp('created_time')->default(DB::raw('CURRENT_TIMESTAMP'));
                        #stringはvercharらしい
			$table->string('title');
                        #text型を使いたい場合はtextメソッドを使う
			$table->text('body');
		});
	}

	public function down()
	{
	}
}

upメソッドには追加のSQL文を。
downメソッドには追加を取り消すSQL文を書く。
upメソッドのみ書いても動くが、バージョンを下げたい時には苦労するのだと思われる。

php artisan migrate

実行されていないマイグレーションが全て実行される。


参考:初めてのLaravel(PHP Framework) - Qiita
参考:Laravel のマイグレーションで MySQL の COMMENT を扱う - takaya030の備忘録

エラーと対応策

ServerException in Client.php
ServerException in Client.php line 370:
MOVED 15807 10.0.0.243:6379

ElastiCacheのRedisを設定した場合におこる。
database.phpの設定を変更すると解決する場合がある

'redis' => [

        'client' => 'predis',

        'clusters' => [
            'default' => [
                [
                    'host' => env('REDIS_HOST', '127.0.0.1'),
                    'password' => env('REDIS_PASSWORD', null),
                    'port' => env('REDIS_PORT', 6379),
                    'database' => 0,
                ],
            ]
        ]

    ],
S3にアップロードした画像が公開されない
  1. config/filesystems.phpのs3項目に「'visibility' => 'public'」を追加する
  2. Storage::disk('s3')->setVisibility($hoge, 'public');
  3. $request->file->store('hoge', ['disk' => 's3', 'visibility' => 'public']);


storeの第二引数は文字列だとディスクの指定、配列だとその他オプションの設定が可能になる。

参考:ファイルストレージ 5.4 Laravel