【自分用メモ】Laravel入門
はじめに
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
にアクセスすると下の画面が表示される。
データベースの設定
.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=booklists
でdatabase/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テンプレートとかも書くと長くなるので今回は省略。