Laravelの環境を作ってからやったこと

メリークリスマス！
TECH PLAY 女子部 Advent Calendar 2017のラストバッター吉澤です！

今年は出産育児などがあり、あまり技術に触る時間が確保できないという思いがありました。そんな中やはり何かやりたいと最近は時間を捻出して、フレームワークのLaravelを触りはじました。

LaravelといえばPHPの人気フレームワークです。最近はPHPフレームワークの中でも、今選ぶならLaravelしかなく一人勝ちのような状況と聞いたことがあります。一番人気というからには、きっと使いやすいフレームワークなのかなと期待を抱きつつ、環境づくりからはじめました。

LaravelはHomesteadという開発環境が用意されているため、Vagrantを入れてあれば特に環境のことを心配せず利用することができます。Dockerを利用した環境も幾つか試したのですが、結局公式が推しているHomesteadを使うことにしました。

この段階でふと気になったことがあります。フレームワークを勉強するときにどういうフローで学ぶのが良いのでしょうか。

というのは、LaravelでHomesteadの開発環境ができた後、次に何をするべきなのかよくわかりませんでした。

私の場合では、まずルーティングについて学ぶことにしました。ルーティングを学べば、なんらかのURLを生成できますから、フレームワークが動いている感じを体験できると考えたからです。

# ルーティング周りを学ぶ

## 基本的なルーティング
Laravelのルーティングは、`/routes`ディレクトリから始まります。ディレクトリ内にあるweb.phpにルーティングを定義することができます。

ドキュメントのサンプルコードではこう記載されています。

```php
Route::get('foo', function () {
return 'Hello World';
});
```

こちらを`/routes/web.php`に書きます。

`/foo`にアクセスすると、`Hello World`と表示されます。
ほとんどのアプリケーションでは`web.php`から始めれば良いとあるのでここから始めればいいでしょう。

ちょっとWebアプリケーションを作成した経験がある方ならわかると思いますが、上記の`Route::get($uri, $callback);`だけではまだ開発をするには色々情報が足りないと感じるはずです。

コントローラを設定するにはどうしたらよいかみてみます。

## ルート定義メソッド
ドキュメントを読み進めます。ドキュメントには`使用可能なルート定義メソッド`として次のように記載されてます。

```php
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);

Route::match(['get', 'post'], '/', function () {
//
});

Route::any('foo', function () {
//
});
```

ここまで読むとLaravelの使い方がなんとなくわかった気持ちになりました。

つまり`Route:HTTPメソッド`という書き方にすればよさそうです。
例えば`/items`というルーティングをしたければ

```php
Route::any('items', function () {
});
```

こちらを`/routes/web.php`に書きます。すると`/items`周りのメソッドを一気に手に入れることができるのですね。

さて、ここまでで勝手にわかった気持ちになった次に、よくあるCRUDのコントローラを生成したくなりました。

## リソースコントローラ
Laravelのようなフレームワークには、CRUDのコントローラを生成するコマンドが用意されているようです。

試してみるということで`ItemsController`を生成してみました。

```bash
php artisan make:controller ItemsController --resource
```

コマンドを実行すると、`app/Http/Controllers/ItemsController.php`が生成されています。

中身を見てみます。

```php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ItemsController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//
}

/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
//
}

/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//
}

/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
//
}

/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
//
}

/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
//
}

/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
//
}
}
```



うん。私が欲しかったものが生成されています。CRUDのアクションが生成されました。

アクションへのルーティングを`/routes/web.php`に記述します。

```Route::resource('items', 'ItemsController');
```



こちらにより各アクションが動作するはずです。試しに`index()`アクションへアクセスすると無事動作を確認できました。

ルーティングを１つ１つ書くのは大変なので`Route::resource();`で一度に定義できるのはだいぶありがたいです。

Webアプリを作れば大抵はCRUDが必要になりますからこれがわかってだいぶ安心しました。

## 振り返り
Laravelの開発環境ができてからの最初の一歩として、ルーティング周り、基本的なルーティングとリソースコントローラについて学びました。

これがわかったからすぐ何ができるということではありませんが、最初の一歩としてはここからなのかなと考えています。

もうちょっと色々わかればまた記事にしていきます！


# 参考
- https://readouble.com/laravel/5.5/ja/routing.html
- https://readouble.com/laravel/5.4/ja/controllers.html


TECH PLAY 女子部ではサーバーからフロントまでフルスタックで技術を身につけたい女子の部活です。
普段はLTやもくもく会、ハンズオン、年に3回くらい男性もWelcomeな大きめのイベントも開催予定なので気になってくださった方はフォローお願いいたします！
[Twitter](https://twitter.com/dotsgirls)
[Facebook](https://www.facebook.com/dots%E5%A5%B3%E5%AD%90%E9%83%A8-457992851057604/)

良い年末を＼(^o^)／