PHP
laravel

Laravelで開発を行う際に覚えておきたいことまとめ

はじめに

最近Laravelを触り始めたので、自分用の開発リファレンスとしてまとめてみました。
Railsも良いんですが、個人的にはPHPの気軽さは魅力です。

laravelのインストール

https://qiita.com/morisuke/items/bedb27418a65f6924fb1

プロジェクトの作成

$ composer create-project laravel/laravel projectname

以下の記事を参考にlaravelコマンドをインストールすると、もう少し簡単に作成することもできます
Laravel5のインストール方法とディレクトリ構成について

$ laravel new projectname

ローカルサーバーを起動する

以下のコマンドでlaravelに内蔵のWebサーバーが立ち上がります。

$ php artisan serve

コントローラーの作成

これで指定した名前でControllerが作成されます。

$ php artisan make:controller MyController

--resource(-r)」オプションを追加すると、リソースコントローラーが作成されます。
リソースコントローラーでは、show()、update()等のメソッドの引数にあらかじめモデルクラスが定義されています。

$ php artisan make:controller MyController --resource

APIリソースの作成

https://qiita.com/zdjjs/items/1c2437fcdd35c6754bcf

ルーティング

デフォルトではroutesディレクトリの中にある、web.phpの中でルーティング処理が記述されています。

Route::get('/', function () {
    return view('books');
});

ルーティングする際にDBからデータを取ってきてViewに渡したり、saveやdeleteも可能です。
簡単なアプリならControllerなしで書けるので便利そうです。

use App\Book;
use Illuminate\Http\Request;

Route::group(['middleware' => ['web']], function() {

    Route::get('/', function() {
        $books = Book::all();
        return view('books', ['books' => $books]); // Viewでbooksという変数名でアクセス可能
    });


    Route::post('book', function(Request $request) {
        $validator = Validator::make($request->all(), [
                'name' => 'required | max: 255',
        ]);

        if ($validator->fails()) {
            return redirect('/')
                ->withInput()
                ->withErrors($validator);
        }

        $book = new Book();
        $book->title = $request->name;
        $book->save();
        return redirect('/');
    });

    Route::delete('/book/{book}', function(Book $book) {
        $book->delete();
        return redirect('/');
    });

});

パラメーターの受け取り

パラメーターの受け取りは2つの方法で行うことができます。
違いはURLが異なることです。

アドレスにルートパラメーターを定義

show/01という形でアクセスできます。

UserController.php
public function show($id) {
  $data = ['id' => $id ];
  return view('show', $data);
}
web.php
Route::get('show/{id?}', 'UserController@show');

クエリー文字列の利用

show?id=01という形でアクセスできます。

UserController.php
public function show(Request $request) {
  $data = ['id' => $request->id ];
  return view('show', $data);
}
web.php
Route::get('show', 'UserController@show');

データベース

テーブルを作成するクラスを生成

以下のコマンドでbooksテーブルを作成するcreateBooksTableクラスをDatabase/migrationsディレクトリに生成してくれます。

$ php artisan make:migration create_books_table --create=books

マイグレーション実行時に、以下のメソッド内で実際のテーブル作成が行われるのでここに追加したいカラムを追加することが出来ます。

public function up() {
  Schema::create('books', function (Blueprint $table) {
    $table->increments('id');
    $table->string('title'); // titleカラムを追加
    $table->timestamps();
  });
}

マイグレーションの実行

$ php artisan migrate

モデルの作成

booksテーブルに対応するモデルを作成します。
appディレクトリ配下にBook.phpが追加されます。
先頭文字は大文字にし、単数形にする必要があるので注意して下さい。

$ php artisan make:model Book

--controller(-c)オプションで、モデルクラスに対応したコントローラーが作成されます。
さらに、コントローラーの作成と同じように、--resource(-r)」オプションでリソースコントローラーの作成も可能です。

$ php artisan make:model Book --controller --resource

Model\Bookとすると自動的にapp/Model/Book.phpとして作成してくれます。
オプションとして--factory(-f)を指定することで,Factoryも一緒に作ることができます。

$ php artisan make:model "Model\Post" --factory

Factoryの作成

モデルの生成時にではなく、Factory単体で作成することも出来ます。
-mオプションモデルを指定することで生成時に自動的に使用するようにしてくれます。

$ php artisan make:factory BookFactory

シーダーの定義

手動でも作成できますが、ミスを防ぐためにもコマンドで自動生成しましょう。
database/seedsディレクトリに設置されます。
runメソッドの中でデータベースにデータを挿入することが出来ます。

$ php artisan make:seeder UsersTableSeeder

データベース接続設定

SQLite3対応

プロジェクトのルートフォルダ内の、.envファイルを開いて以下の指定をします。
この時DB_DATABASEでは、データベースファイルを一番上の階層から絶対パスで指定する必要があります。
たとえば、/home/username/projectname にLaravelのプロジェクトを作成した場合は以下のようなパスを指定する必要があります。

DB_CONNECTION = sqlite
DB_DATABASE=/home/username/projectname/database/database.sqlite

このやり方でsqliteを使う際は、デフォルトで記述されている以下の設定はいらないようなので削除しておきます。(Laravel同梱のsqliteで、usernameやpassword等の設定はしていないから?)

DB_HOST=127.0.0.1
DB_PORT=3306
DB_USERNAME=homestead
DB_PASSWORD=secret

また/home/username/projectname/config/database.phpに以下のような指定を行います。

'default' => env('DB_CONNECTION', 'sqlite'),

DBの設定に関しては以上の2ファイルをイジる必要があります。

最後にdatabaseディレクトリ配下にdatabase.sqliteというファイルを作成します。
touchでもsqlite3でもどっちのコマンドでも可です。

$ touch database.sqlite
$ sqlite3 database.sqlite
SQLite version 3.13.0 2016-05-18 10:57:30
Enter ".help" for usage hints.
sqlite> .tables
sqlite> .exit

ユーザー登録・認証機能

Laravelでユーザー登録・認証機能を作成する(たぶん)最も簡単な方法

ログイン中のユーザーの取得

use Illuminate\Support\Facades\Auth;

// 現在認証されているユーザーの取得
$user = Auth::user();

// 現在認証されているユーザーのID取得
$id = Auth::id();

ログイン中どうか判定

use Illuminate\Support\Facades\Auth;

if (Auth::check()) {
    // ユーザーはログインしている
}

ログの出力

まずFacadesをuseします。

use Illuminate\Support\Facades\Log;

後はメソッドを呼び出してやるだけでログが書き出されます。

Log::debug('log message')

参考: https://qiita.com/ak-ymst/items/00b41873be55e878eb84

クロスドメイン対応

Laravelでクロスドメインに対応する