Laravel5のお勉強
第一回 環境構築
第二回 ControllerとViewの追加
第三回 Database連携(Mysql)
第四回 モデルの作成/tinker紹介
第五回 テストデータの挿入/Fakerの使用
第六回 CRUDの作成
第七回 Herokuにdeploy
第一回 環境構築-
前提条件
Mac OS yosemite
PHP 5.5以上
Mysql 5.6以上
目的
Laravel5のお勉強。
ここが公式の日本語翻訳サイト
今回はコマンドを利用して簡単にCOntrollerを追加すること
使用技術
- Laravel5(FW)
- Heroku(deploy)
- Eloquent(ORM)
- Blade(テンプレートエンジン)
- tinker(REPL (Read-Eval-Print Loop))※対話型
- Faker(テストデータ挿入)
前回の解説
前回で環境構築が完成し、
Laravel5のようこそ画面が表示されました。
「http://localhost:8000」にアクセスしたので、URLパターンとしては、ドキュメントルートの「/」となります。
Laravel5のtree構成は以下となっています。
Blog
├── app
│ ├── Article.php
│ ├── Console
│ │ ├── Commands
│ │ │ └── Inspire.php
│ │ └── Kernel.php
│ ├── Events
│ │ └── Event.php
│ ├── Exceptions
│ │ └── Handler.php
│ ├── Http
│ │ ├── Controllers
│ │ │ ├── Auth
│ │ │ │ ├── AuthController.php
│ │ │ │ └── PasswordController.php
│ │ │ └── Controller.php
│ │ ├── Kernel.php
│ │ ├── Middleware
│ │ │ ├── Authenticate.php
│ │ │ ├── EncryptCookies.php
│ │ │ ├── RedirectIfAuthenticated.php
│ │ │ └── VerifyCsrfToken.php
│ │ ├── Requests
│ │ │ └── Request.php
│ │ └── routes.php
│ ├── Jobs
│ │ └── Job.php
│ ├── Listeners
│ ├── Policies
│ ├── Providers
│ │ ├── AppServiceProvider.php
│ │ ├── AuthServiceProvider.php
│ │ ├── EventServiceProvider.php
│ │ └── RouteServiceProvider.php
│ └── User.php
├── artisan
├── bootstrap
│ ├── app.php
│ ├── autoload.php
│ └── cache
│ └── services.json
├── composer.json
├── composer.lock
├── config
│ ├── app.php
│ ├── auth.php
│ ├── broadcasting.php
│ ├── cache.php
│ ├── compile.php
│ ├── database.php
│ ├── database.php.org
│ ├── filesystems.php
│ ├── mail.php
│ ├── queue.php
│ ├── services.php
│ ├── session.php
│ └── view.php
├── database
│ ├── factories
│ │ └── ModelFactory.php
│ ├── migrations
│ │ ├── 2014_10_12_000000_create_users_table.php
│ │ ├── 2014_10_12_100000_create_password_resets_table.php
│ └── seeds
│ └── DatabaseSeeder.php
├── gulpfile.js
├── package.json
├── phpspec.yml
├── phpunit.xml
├── public
│ ├── favicon.ico
│ ├── index.php
│ └── robots.txt
├── readme.md
├── resources
│ ├── assets
│ │ └── sass
│ │ └── app.scss
│ ├── lang
│ │ └── en
│ │ ├── auth.php
│ │ ├── pagination.php
│ │ ├── passwords.php
│ │ └── validation.php
│ └── views
│ ├── errors
│ │ └── 503.blade.php
│ ├── vendor
│ └── welcome.blade.php
├── server.php
├── storage
│ ├── app
│ ├── framework
│ │ ├── cache
│ │ ├── sessions
│ │ └── views
│ └── logs
│ └── laravel.log
├── tests
│ ├── ExampleTest.php
│ └── TestCase.php
└── vendor
…
「/」でアクセスしてどのモジュールが呼ばれているのかが気になると思います。
上のtreeで見ると「/Http」があります。
ここがクライアントのリクエスト(Http)に関わる場所です。
ここの「route.php」にURLマッピングが記載されてます。
※Blog/app/Http/routes.php
1 <?php
2
3 Route::get('/', function() {
4 return view('welcome');
5 });
こんな感じです。
見たまま直感で読めるとも思いますが、「/でアクセスしたら、**view('welcome')**を返却する」となってます。
つまり、今回はControllerを介さずに、viewを返却しています。
LaravelのViewは「/(PJのルート)直下のresources下」にあります。
resources
├── assets
│ └── sass
│ └── app.scss
├── lang
│ └── en
│ ├── auth.php
│ ├── pagination.php
│ ├── passwords.php
│ └── validation.php
└── views
├── errors
│ └── 503.blade.php
├── foo.blade.php
├── vendor
└── welcome.blade.php
viewsの下のwelcome.blade.phpが「/」で呼ばれてます。
※bladeは後述します。
routingの追加
では次は「/hello」で呼ばれるroutingを追加してみましょう。
routes.phpに以下を追記してください。
※Blog/app/Http/routes.php
1 <?php
2
3 Route::get('/', function() {
4 return view('welcome');
5 });
6
7 Route::get('/hello', function() {
8 return 'HelloWorld!';
9 });
追記したのち、ブラウザから「http://localhost:8000/hello」にアクセスすると
とテキストのみが表示されるのがわかる。
このように、単純にtextを返却することも可能。
Controllerの追加
routes.phpに以下を追記
1 <?php
2
3 Route::get('/', function() {
4 return view('welcome');
5 });
6
7 Route::get('/hello', function() {
8 return 'HelloWorld!';
9 });
10
11 Route::get('/foo/{name}', 'Lists\FooController@index');
12 Route::get('/foo', 'Lists\FooController@index');
11行目と12行目が新規に追加したrouting設定。
11行目は「/foo/taro」でアクセスした場合、「Lists下のFooCOntrollerのindexAction」が呼ばれ、パラメータとして{name}が$nameとして渡される挙動を取ります。
12行目は「/foo」でアクセスした場合に、「FooControllerのindexActionをコールする」記述となります。
ではFooControllerを作って、画面が表示されるようにしましょう。
PJのルートに戻って、以下のコマンドを実行。
php artisan make:controller Lists/FooController
すると「app/Http/Controller」下のLists下に「FooController」が作成される。
中身は以下のようになっている。
<?php
namespace App\Http\Controllers\Lists;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
class FooController 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)
{
//
}
}
こんな感じでたくさんのメソッドを持ったControllerが自動で生成される。
LaravelもRestFul設計に則っているため、delete系はHttpのdeleteメソッドを。
insertやuodateはupdateやpatchに紐付いて呼ばれる設計となっており、
そのための一般的なメソッドをデフォルトで自動で作成してくれる。
ただ、今回はindexAction以外は不要なので、以下にしてしまいましょう。
1 <?php
2 namespace App\Http\Controllers\Lists;
3
4 use Illuminate\Http\Request;
5 use App\Http\Requests;
6 use App\Http\Controllers\Controller;
7
8 class FooController extends Controller
9 {
10 public function index($name = 'hoge')
11 {
12 return view('foo', ['name' => $name]);
13 }
14 }
indexが呼ばれる際に、$nameを受け取り、値が空ならデフォルト値のhogeという文字列を与えている。
それをviewの「foo」に連携し、viewを表示する際に、値としてnameキーに$nameの値を渡している。
なので、Viewとしてfooを作成しなければいけない。
viewの作成
viewはresources/views下になるので、ここに「foo.blade.php」を作成し、
以下を記載する。
※ resources/views/foo.blade.php
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <title>test</title>
5 </head>
6 <body>
7 <div class="container">
8 <div class="content">
9 <div class="title">Foo!!{{$name}}</div>
10 </div>
11 </div>
12 </body>
13 </html>
これでhttp://localhost:8000/foo/taroにアクセスすると、**「Foo!!taro」**が表示されますね。
ControllerからViewに値を渡す方法
方法は2通りあるのかな。
- 配列で渡す
- compact関数を使う
先ほどの例は前者でした。
return view('foo', ['name' => $name]);
ですね。こrは
$datas = ['name' => $name];
return view('foo', $datas);
と同じです。
次がcompact関数の例です。
$name = "taro";
return view('foo', compact('name'));
viewでのアクセスは変わりありません。
bladeを使うならこう。
{{$name}}
phpのままなら
<?php echo $name; ?>
以上です。