Laravel(ララベル)とは、最近最も勢いのあるPHPのフレームワークの一つです。2011年当時人気を博していたCodeIgniterのようなPHPフレームワークの使いにくい部分を克服しようとして作成されました。そのあと、注目されるようになり、ここ数年人気が急上昇しています。
Google Trendsで比較してみてもその人気の高さがわかります。
かつて、PHPのフレームワークといえば日本ではCakePHPでしたが、そのCakePHPよりも人気あるPHPフレームワークであることがわかります。また、2016年8月からは、Ruby on Rails の人気を超えるまでになりました。
LaravelにはArtisanという独自コマンドが用意されています。このコマンドラインからコントローラやモデルの雛型ファイル(スケルトン)を作ることができます。 その他にもマイグレーションの実行やシーダーの実行、メンテナンスモードの実行など、かなり色々なコマンドが用意されています。
# コントローラのひな形の作成
php artisan make:controller UserController
# モデルのひな形の作成
php artisan make:model User
# マイグレーションの実行
php artisan migrate
Laravelでデータベースと連携し、データを取得したり登録・更新・削除など一連の操作を行うにはEloquent ORMという、データ操作を簡単に行うための機能を使います。
// 名前空間インポート
use App\User;
// Eloquentを使って全件取得
$users = User::all();
// 各レコードごとの名前とメールを表示
foreach($users as $user){
echo $user->name;
echo $user->email;
}
ファサードを使うと、どこからでも簡単にクラスを呼ぶことができます。コードをすっきり書くことができます。 例えばRouteファサードはルーティングを行う際に使うのですが、Routeファサードを使うことで、見やすく、簡単なルーティングを書くことができます。
Route::get('/home', 'HomeController@index');
Route::
と記述しているところがファサードになります。 Laravelではこの他に標準で37種類のファサードが提供されています。
ファサード名 | 使い方 |
---|---|
Config | config/app.phpの値を取得したりする。 |
DB | クエリビルダなどを提供。普通はEloquentを使う。 |
Log | ログの書き出しなど。storage/logsなどに書き出せるのでデバッグなどで重宝します。 |
Request | $_REQUEST周りの処理。laravel5からはInputファサードの代わりにこちらを使う。 |
システム開発を行っていくと、クラスのインスタンス同士がさまざまに依存しあうようになります。
この依存度を極力下げて、実行時に外部から与えてもらえるようにした仕組みがDIです。
Laravelには、DIの仕組みが内蔵されていて、メソッドの引数にインジェクトしたいオブジェクトを書くだけで、DIできます。
Laravelは、このDIを実現する方法として、サービスコンテナというのを用いています。
コンストラクタの引数にインジェクトしたいオブジェクトを書きます。これだけで、コントローラー内のすべてのメソッドから、いちいちnewすることなくUserクラスのメソッドを呼び出すことができます。
#UserController.php
namespace App\Http\Controllers;
use App\User;
class UserController extends Controller
{
private $user;
public function __construct(User $user)
{
$this->user = $user;
}
}
特定のアクションメソッド(ルーティングで使われるコントローラーのメソッド)だけで使用したいクラスもあります。その場合は、コンストラクタインジェクションではなくメソッドインジェクションを使います。
#UserController.php
// DIの際は実態ファイルをuseしておく
use Illuminate\Http\Request;
class ContactController extends Controller
{
// 引数がメソッドインジェクション
public function postIndex(Request $req)
{
// nameを取得
$name = $req->name;
}
}