Aimless Blog

【自分用メモ】Laravel入門

Tag:
laravelphp

はじめに

XdomainでPHP/mysqlサーバーが無料で使えるので久々にPHPを使ってみようと思い、今一番人気のPHPフレームワークLaravelを使ってみた。PHPフレームワークはCodeigniterを以前使用したことがあります。
公式サイト及び日本語翻訳サイトからベーシックな部分を備忘録的にまとめてみた。

公式サイト
日本語訳サイト

環境:Laravel5.6 Windows10 Xampp php7.2.6

Composerをインストール

Composer のダウンロードページからComposer-Setup.exeをダウンロードしてインストール。 使用するPHPを指定するときは、XAMPPの中のPHPC:\xampp\php\php.exeを指定する。

Laravelをインストール

composer global require "laravel/installer"でLaravelインストーラーをインストール。

プロジェクトの作成

laravel new プロジェクト名(ここではmyapp)と打つとmyappというディレクトリが作成されて、そこに必要とするパッケージが全部揃った、Laravelがインストールされる。
myappディレクトリに移動してphp artisan serveでローカルサーバーを起動してブラウザでhttp://localhost:8000にアクセスすると下の画面が表示される。
laravel

データベースの設定

.envファイルのデータベース名・ユーザー名・パスワードを変える。xamppはMariaDBが使用されてるけどmysqlのままでOK。

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=hoge
DB_USERNAME=taro
DB_PASSWORD=1234

Eloquent ORM

Eloquent ORMというO/Rマッパーを使用するにはモデルを作成する必要がある。

モデルの作成

php artisan make:model クラス名(ここではBooklist)と打つとappディレクトリにBooklist.phpが作成される。 マイグレーションに必要なファイルも一緒に生成する場合はphp artisan make:model Booklist -m

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Booklist extends Model
{
    //
}

Booklistクラスは空ですが、この場合はクラス名を複数形(booklists)の「スネークケース」にしたものがテーブル名として使用される。

マイグレーション


php artisan make:migration create_booklists_table --create=booklistsdatabase/migrationsディレクトリにファイルが生成される。createオプションでテーブル名を指定。 上記のモデルの作成時に-mオプションで作成した場合は既にマイグレーションファイルが生成されている。
ファイル名にはマイグレーションの実行順をフレームワークに知らせるため、名前にタイムスタンプが含まれている。

create_booklists_table.phpを開いてテーブルの定義をする。

<?php

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

class CreateBooklistsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('booklists', function (Blueprint $table) {
			$table->increments('id');
			$table->string('title'); /* 追加 */
			$table->string('author'); /* 追加 */
			$table->string('published'); /* 追加 */
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('booklists');
    }
}

php artisan migrateでマイグレーションを実行。MySQLにBooklistsテーブルが作成される。

マイグレーションを実行して、SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes のエラーが出る場合

Laravelは絵文字の保存をサポートしているのでutf8mb4を使用しています。なので、バージョン5.7.7より古いMySQLや、バージョン10.2.2より古いMariaDBを使用している場合、デフォルトの文字列長255文字だと767バイトを超えてしまうので、 app\Providers\AppServiceProvider.phpを開き、use Illuminate\Support\Facades\Schema;と。 Schema::defaultStringLength(191);を追加する。

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema; /*追加*/

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Schema::defaultStringLength(191); /* 追加 */
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

ルーティング


ルートはroutes/web.phpで定義する。

Route::get('/', function () {
    return 'Hello World';
});

php artisan serveでローカルサーバーを起動して、http://localhost:8000 にアクセスするとHello Worldが表示される。

ビュー

ビューはresources/viewsディレクトリに作成する。Bladeテンプレートを使用しているので、***.blade.phpで保存。
hello.blade.phpで保存しているならview('hello')
resources/views/aboutのようなサブディレクトリを作成した場合は、view(about.テンプレートファイル)

Route::get('/hello', function () {
    return view('hello');
});
Route::get('/hello', function () {
    return view('about.hello');
});

http://localhost:8000/helloで表示される。

コントローラー

ルートファイルに全リクエストの処理を書いても問題ないけど、分離して管理したいときはコントローラクラスを使用する。
コントローラーの作成はphp artisan make:controller コントローラ名で、app\Http\Controllers\に作成される。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class TestController extends Controller
{
    //
}

例としてテーブルの全データを表示するページを作りたいときは、

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use app/Booklist; /* <---- */

class TestController extends Controller
{
    public function alllist()
    {
        $results = Booklist::all();
        return view('alllist',['results'=>$results]);
    }
}

使用するモデルを定義use app/Booklist;して、
ファンクション'alllist'にクエリとビューを記述。
ルートファイルは

Route::get('/alllist', 'TestController@alllist');

コントローラ名@ファンクション名でメソッドが実行される。

おわりに

とりあえず必要最低限の情報をまとめてみた。
他に必要そうなEloquent ORMのクエリとかフォームのPOSTされたデータの取得とかBladeテンプレートとかも書くと長くなるので今回は省略。