Laravelを使いたかったので雑に入門した
はじめに
なぜか急にwebシステムを作る必要がでてきたため、Laravelを使ってみようとおもった。
だが使ったことないので備忘録も兼ねてまとめていこうと思う。
対象
などなど、何が言いたいかというと初心者に向けた記事じゃなくて
自分用のメモ兼ある程度のサーバサイド経験者に共有したい内容となっている
Laravelとは
Laravel は、MVCのWebアプリケーション開発用の無料・オープンソースのPHPで書かれたWebアプリケーションフレームワークのこと。
PHPのwebアプリケーションフレームワークといえば、CakePHPやFuelPHPあたりを想像するだろうが、最近はLaravelが熱いらしい。
Laravelの環境を構築する
composerが入っていることを前提にする。
その上で最初にComposerを使用し、Laravelインストーラをダウンロードする。
composer global require "laravel/installer"
またはcomposerを使ってプロジェクトを作る
composer create-project --prefer-dist laravel/laravel project-name
プロジェクトを作成したらそのディレクトリに移動して、ローカル開発サーバを起動する。
その前にドキュメントによるとアプリケーションキーの設定と設定ファイルのあれこれを行う。
設定ファイルをリネームする
cp -p .env.example .env
そしてアプリケーションキーを作成する。
php artisan key:generate
ここまで完了した段階で、以下のコマンドを実行することで最初のHello,World的なページが表示される。
$ php artisan serve Laravel development server started: <http://127.0.0.1:8000>
ブラウザからlocalhost:8000にアクセスすると…
ここまででとりあえず最低限起動するところまでは完了した。
ルーティング
webアプリケーションを作る上でまずやらないといけないのがルーティング
普段はLeague\RouteをつかってやっているがLaravelではどうおこなうかわからなかったのでまとめてみる。
まずルーティングがどこにあるかというとroutesディレクトリにおいてある。
そうするといくつかのファイルがあると思うが、 web.php がwebインターフェースのルーティングを定義する。
Laravelではルーティング内で毎回App\Http\Controllerを指定しなくて済むようにデフォルトでRouteServiceProviderが設定している。
Laravelで利用できるルート定義メソッドは以下の通り
Route::get($uri, $callback); Route::post($uri, $callback); Route::put($uri, $callback); Route::patch($uri, $callback); Route::delete($uri, $callback); Route::options($uri, $callback);
HTTPのリクエストメソッドに対応している。
引数のタイプは、URIとクロージャーになっている。
複数のHTTPリクエストメソッドを利用したい場合はmatchメソッドを使用して
<?php Route::match(['get', 'post'], '/', function () { // }); Route::any('foo', function () { // });
のように書くこともできる
anyはすべてのHTTPリクエストメソッドに対してルーティングを登録する場合にもちいられる。
また一般的なGETリクエストを使用するルーティングは次のように書かれる
<?php Route::get('/hello', 'HogeController@index');
第一引数については言う必要はないと思うが、問題は第二引数。
呼び出すコントローラのメソッドを@で指定している。
また、単純にViewを表示するだけなら以下のようにも書ける。
<?php Route::view('/welcome', 'welcome'); Route::view('/welcome', 'welcome', ['name' => 'Taylor']);
シンプルなルーティングはこれでかけるがもう少し詳しく書きたい場合がある。
そういう時にルートパラメータは次のように書ける。
<?php Route::get('user/{id}', function ($id) { return 'User '.$id; }); Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) { // });
パラメータ名の後ろに?をつけると任意パラメータになる。
<?php Route::get('user/{name?}', function ($name = null) { return $name; }); Route::get('user/{name?}', function ($name = 'John') { return $name; });
さらに詳しいことは公式ドキュメントに書いてある。
ルーティング 5.6 Laravel
リクエスト周り
LaravelでHTTPリクエストのインスタンスを利用するには
Illuminate\Http\Requestクラスをコントローラのメソッドに指定する必要がある
ひとまず、以下のクラスとルーティングを前提に説明していく
<?php namespace App\Http\Controllers; use Illuminate\Foundation\Bus\DispatchesJobs; use Illuminate\Routing\Controller as BaseController; use Illuminate\Foundation\Validation\ValidatesRequests; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Http\Request; class SampleController extends BaseController { public function index() { return 'hello,world'; } public function sampleRequest(Request $request) { $name = $request->name; return $name; } public function sampleRequestWithParam(Request $request, $val) { return $id; } }
<?php /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/', function () { return view('welcome'); }); Route::get('hello', function() { return 'Hello,World'; }); Route::get('/sample', 'SampleController@index'); Route::get('/sample2/{name}', 'SampleController@sampleRequest'); Route::get('/sample3/{val}', 'SampleController@sampleRequestWithParam');
このコードにおいて、 パラメータの値を取得する方法は2つある。
ひとつ目が、
<?php $name = $request->name;
上記の部分。
こちらは動的プロパティを参照する方法となる。
ふたつ目が
<?php public function sampleRequestWithParam(Request $request, $val) { return $id; }
の引数部分。
プロパティ名を変数として宣言するとそちらに直接代入される。
プロパティだけでなく、URL全体を取得するのは次のように行う。
<?php // クエリストリングなし $url = $request->url(); // クエリストリング付き $url = $request->fullUrl();
クエリストリングから値を取り出したい場合は以下のようにする
<?php $name = $request->query('name');
またこのRequestクラスは、PSR7を満たしている以下のパッケージで置き換えることができる
composer require symfony/psr-http-message-bridge composer require zendframework/zend-diactoros
その他、リクエストまわりは先程と同様に公式に全てまとまっている
HTTPリクエスト 5.6 Laravel
ビュー
LaravelのViewはBladeを使用している。
Bladeは .blade.php という拡張子でテンプレートを用意し
サーバサイドから呼び出しとデータを渡して表示する。という手順で利用する
//sample_view.blade.php <html> <body> <h1>Hello, {{ $name }}</h1> </body> </html>
ルーティングでは以下のように直接viewを呼び出す方式を今回は取ってみる。
<?php Route::get('/sample4', function (){ return view('sample_view', ['name' => 'scala']); //view('sample_view')->with('name', 'scala');でも同様に行える });
雑感だけど、League/Plateと似ている
諸々のテンプレートエンジンとほとんど使い方自体は同じ
コントローラ
コントローラはapp/Http/Controllers以下のディレクトリに配置する。
namespaceはPSR準拠のものを設定する。
ドキュメントに乗っているサンプルコントローラは以下の通り
<?php namespace App\Http\Controllers; use App\User; use App\Http\Controllers\Controller; class UserController extends Controller { /** * 指定ユーザーのプロフィール表示 * * @param int $id * @return Response */ public function show($id) { return view('user.profile', ['user' => User::findOrFail($id)]); } }
このように、コントローラクラスを継承し拡張することでコントローラは作成できる
メソッドではURLパラメータを受け取ることも、PSR7準拠のリクエストを受け取ることも出来る。
ルーティングと関連するところはコントローラの名前空間で、ルーティングではApp\Http\Controllerまでは自動で設定されているので
それより深いnamespaceを持つ場合は適宜指定しないと行けない。
シングルアクションコントローラでは__invokeメソッドを使用することができる。
この場合のルーティングは クラス名@アクションメソッド ではなく、 クラス名 となる。
モデル
モデル関連は公式ドキュメントに情報が少ない。
それもそれで何故かわかった。
そもそも、MVCのモデルは開発者やベンダーで割と作り方がバラバラでそれに対応するためにLaravelでも自由に作れるようになっているとあった。
たしかに、コントローラやビューほどある一定の形式を保つ必要が無いからその理由に同意できる。
Laravelではモデルはartisanコマンドをつかって作る
それらは以下のサイトが参考になった。
udemy.benesse.co.jp