はじめに
Laravelを導入してみましたが構成が全然わからないので自分なりの備忘録として作成。
導入手順、環境については過去の記事を参照。
2017/02/23追記:
色々やっているうちにLaravelのバージョンが5.4に上がっちゃうという不測の事態が発生。少し環境が変わっています。
前提環境
- Composer 導入済み
- Laravel 5.4 導入済み
- MySQL 導入済み
- PHP 5.6( + phpmcrypt)導入済み
Controllerを生成してみる
# プロジェクトルートへ移動
$ cd /var/www/html/sample/
# データ操作に必要なメソッドを生成する場合
$ php artisan make:controller PagesController
# デフォルトメソッドが不要である場合
$ php artisan make:controller --plain PagesController
Controllerからページを表示させる
概要
ページアクセス時にroutes.php web.phpからPagesController.phpを呼び出して、特定のページ(about.blade.php)を表示できるようにしてみる。
アクセス先 : http://{ localhost or IP }:8000/about/
構成
旧環境
[/var/www/html/sample]
|
+-[resources]
| |
| +-[views]
| |
| +-[pages]--about.blade.php
|
+-[app]
|
+-[Http]--routes.php
|
+-[Controllers]--PagesController.php
Laravel 5.4環境
[/var/www/html/sample]
|
+-[resources]
| |
| +-[views]
| |
| +-[pages]--about.blade.php
|
+-[app]
| |
| +-[Http]
| |
| +-[Controllers]--PagesController.php
|
+-[routes]--web.php
ソースコード
Laravel 5.4ではroutes.phpがなくなり、代わりにそれぞれの処理に応じたphpファイルroutesディレクトリ内に生成されるようになっていました。
<?php
/*
|--------------------------------------------------------------------------
| Application Routes
|--------------------------------------------------------------------------
|
| Here is where you can register all of the routes for an application.
| It's a breeze. Simply tell Laravel the URIs it should respond to
| and give it the controller to call when that URI is requested.
|
*/
Route::get('/', function () {
return view('welcome');
});
Route::controller("about","PagesController@getIndex"); // Controller名@クラス名で指定
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
class PagesController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function getIndex()
{
$name = [];
$name['first_name'] = 'Tetsuro';
$name['last_name'] = 'Degawa';
return view("pages.about", $name); // サブディレクトリを参照する場合は「.」でつなぐ 第二引数に連想配列を渡すことでフォーム側から出力できる
}
}
<?php
echo "<h1>About: {$first_name} {$last_name}.</h1>";
レイアウトを別に分ける
概要
about.blade.phpの内容はコンテンツの表示のみに留め、レイアウトを別のところ(layout.blade.php)で管理したい。
構成
[/var/www/html/sample]
|
+-[resources]
| |
| +-[views]--layout.blade.php[!]
| |
| +-[pages]--about.blade.php
|
+-[app]
| |
| +-[Http]
| |
| +-[Controllers]--PagesController.php
|
+-[routes]--web.php
ソースコード
// 先ほどと変更なし
// 先ほどと変更なし
// 先ほどの記述はすべてコメントアウト
// <?php
// echo "<h1>About: {$first_name} {$last_name}.</h1>";
// 代わりに以下を記述
@extends('layout') // layout.blade.phpを読み込み
@section("content") // layout.blade.phpのcontentセクションに表示する部分
<h1>Hello, {{$first_name}} {{$last_name}}.</h1> // 変数を表示する場合は{{ }}で囲う
@endsection // contentセクション終了
<!DOCTYPE html>
<html>
<head>
<title>sample</title>
</head>
<body>
@yield('content') // contentセクションを表示する部分
</body>
</html>
フォームの作成・値の取得
概要
Webページの基礎部分となる、フォームの生成と値の取得について記述していきます。
なお、他のサイトでよく利用されているHTMLファサード、FORMファサードはLaravel 5.4では標準インストールされていないため、色々とゴニョゴニョしないと利用できない模様。
実はこのゴニョゴニョしている最中にハマってしまい、プロジェクトを再作成するハメに。Versionが5.4にあがったのはそのせいおかげです。
今回はプレーンな状態のLaravelでフォームを作成していきます。ビギナーのためのLaravel入門を参考にさせていただきました。
今回編集するのは以下の3ファイル。
- about.blade.php
- PagesController.php
- web.php
早速ソースコードを見ていきます。
ソースコード
@extends('layout')
@section("content")
<h1>Hello, {{$login}}.</h1>
@endsection
<form method="post" action='/about'>
<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>"> // *これを記述しないとCSRFチェックに引っかかる模様
<input type="text" name="message" placeholder="write message.">
<input type="submit">
</form>
*の部分を記述し忘れると、TokenMismatchException in VerifyCsrfToken.php line 68:
とかいうエラーが表示されます。
こちらを参考にさせていただきました。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
class PagesController extends Controller
{
// getIndex : フォームに何も入力されていないときに表示
public function getIndex()
{
$data = [];
$data["login"] = "Please Login.";
$data["message"] = 'please type message.';
return view("pages.about", $data);
}
// フォーム側Submitボタンが押されたときに表示
public function postIndex(Request $request)
{
$data = [];
$data["login"] = "Hello, Tetsuro Degawa.";
$data['message'] = $request->input('message'); // フォームからPostされた値を取得
return view("pages.about", $data);
}
}
<?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("about", "PagesController@getIndex");
Route::post("about","PagesController@postIndex");
web.phpにgetとpostの処理を分けてあげたらフォームの値を取得できるようになりました。
テーブルの作成
概要
Laravelは直接テーブルを生成するのではなく、Artisanからマイグレーションファイルを作成します。
その後マイグレーションを実行することでテーブルが生成される、という流れのようです。
「マイグレーションファイル」がテーブルの設計書で、その設計書を元にテーブルを作成するのが「マイグレーション実行」ということのようです。難解。
マイグレーションが実行可能になるまで紆余曲折がありましたが、詳しい話はこちら(現在執筆中)をご覧ください。
構成
[sample]--artisan
|
+-[database]
|
+-[migrations]--{timestamp}_create_users_table
マイグレーションファイルの生成
# マイグレーションファイル生成
$ php artisan make:migration create_users_table
# マイグレーションファイルを確認
$ cd ./database/migrations/
$ ls
# vimでマイグレーションファイルを編集
$ vim {timestamp}_create_users_table.php
ここで中身を見てみると、関数が2つ生成されていました。
up()がテーブル生成や処理の追加、down()がテーブル削除や処理の取り消しを行っているようです。
今回はテーブルを生成する処理のため、up()内に追記していきます。
// 修正前
public function up()
{
}
// 修正後
public function up()
{
Schema::create('users' /* テーブル名 */, function(Blueprint $table)
{
$table->increments('id');
$table->string('user_name');
$table->string('user_address');
$table->string('user_photo');
});
}
マイグレーション実行
$ php artisan migrate
これでDBにテーブルが生成されました!確かに環境を構築するまでは大変だけど、一度作ってしまうと後がラクになりそうですね。
データベースとマイグレーションについてはReaDoubleさんに詳しい記述があります。
MySQLと連携して簡単なWebアプリを動かす
現在作業中です。
foreach ($users as $user) {
echo $user->name;
}
[http://blog.hrendoh.com/using-form-and-html-in-laravel5/]
[https://laravel10.wordpress.com/2015/03/08/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AElaravel-5-16-form%E3%81%AE%E4%BD%9C%E6%88%90/]