ConoHaとCentOS7でLaravel5.4掲示板の作成

今回はLaravel5.4で掲示板を作成したいと思います。

一通り完成すれば2チャンみたいに使用できると想定しております。

namespaceとuseの使い方下記参考URL

namespaceとuseの使い方

 

環境

OS/ミドルウェア バージョン
CentOS 7.2.1511
Apache 2.4.6
PHP 5.4.16
Laravel 5.4.33

 

まずは、コマンドラインでDBを作成します。

bbc 用のデータベースを作成します。

 

データベース作成

[MySQLに接続]

[DB作成コマンド]

[DBが作成出来たか確認]

[実行結果]

これで、bbcのDBが出来ました。

[DB接続を終了]

 

DB接続の設定

Laravel5では .env ファイルによって環境ごとの設定を管理するようになっているので 、自分の環境に設定します。

プロジェクトディレクトリまで移動する

[.envファイルのバックアップ]

[.envファイルの修正]

[ディレクトリ移動]

[database.phpファイルのバックアップ]

[database.phpファイルの修正]

env 関数で .env の値を取得して、なければデフォルトの値を使用するようになっています。

 

DEBUGの有効化とタイムゾーンの設定

[app.phpファイルのバックアップ]

[app.phpファイルの修正]

 

マイグレーションでテーブル作成

※プロジェクトまで移動してからコマンドを打つ。

[ポストテーブル]

[実行結果]

[カテゴリーテーブル]

[実行結果]

[コメントテーブル]

[実行結果]

※Laravelの規約に従うために、データベース名は必ず複数形に。

上記3つのコマンドで、テーブルを作るための「マイグレーションファイル」がそれぞれ作成される。

ファイルの場所は、プロジェクト名/database/migrationsの中に、日付時刻_create_テーブル名_table.phpファイルが生成される

 

マイグレーションファイルを変更

[ディレクトリの移動]

[ファイルの編集]

[ファイルの中身]

// useを使うと、Illuminate\Support\Facades\Schemaというnamespace(名前空間)のエイリアスを作成し、Schemaで参照できるようになります!
// useを使うと、Illuminate\Database\Schema\Blueprintというnamespace(名前空間)のエイリアスを作成し、Blueprintで参照できるようになります!
// useを使うと、Illuminate\Database\Migrations\Migrationというnamespace(名前空間)のエイリアスを作成し、Migrationで参照できるようになります!

マイグレーションはupとdownの2メソッドを含んでいます。upメソッドは新しいテーブル、カラム、インデックスをデータベースに追加するために使用し、一方のdownメソッドはupメソッドが行った操作を元に戻します。

新しいデータベーステーブルを作成するには、Schemaファサードのcreateメソッドを使用します。createメソッドは引数を2つ取ります。最初はテーブルの名前で、2つ目は新しいテーブルを定義するために使用するBlueprintオブジェクトを受け取る「クロージャー」です。

[ファイルの編集]

[ファイルの中身]

[ファイルの編集]

[ファイルの中身]

 

マイグレーションを実行する

[ディレクトリの移動]

[テーブルを実際に作成するコマンド]

※プロジェクトまで移動してからコマンドを打つ。そうしないと[Could not open input file: artisan]のメッセージが表示される。

[実行結果]

 

モデルの作成

※プロジェクトまで移動してからコマンドを打つ。

[ポスト]

[実行結果]

[カテゴリー]

[実行結果]

[コメント]

[実行結果]

ファイルの場所は、プロジェクト名/appの中に、☓☓☓.phpファイルが生成される。

モデル作成時にデータベースマイグレーションも生成したければ、--migration-mオプションを使ってください。

参考URLはコチラ⇒Laravel 5.4 Eloquent:利用の開始

 

リレーションの設定

[ディレクトリの移動]

[ファイルの編集]

[ファイルの中身]

namespace(名前空間)

PHPでは、定義済みのクラス名、関数名、定数名は、名前の衝突が起こるので使用できません。そのため、識別子は長くなりがちですが、PHP5.3から追加された名前空間という機能を利用することで名前の衝突を避けることができます。名前空間とは、OSのディレクトリに似た概念で、同じ名前でも名前空間(ディレクトリ)が違えば、使用することができます。

 

リレーション

要は結合です。
素のSQLでは正規化されたテーブルを結合するにはJOIN句を利用しますが、これをEloquentでより簡単にしたいということになります。

 

1対多

「1対多」リレーションは一つのモデルが他の多くのモデルを所有する関係を定義するために使います。ブログポストが多くのコメントを持つのが一例です。他のEloquentリレーションと同様に1対多リレーションはEloquentモデルの関数として定義します。

 

hasMany

hasMany(モデル名,外部キー,内部キー)

hasManyは、hasOneと同様に第1引数に関連づけをするモデル名を記述します。第2引数に外部キー、第3引数に内部キーを指定するところも同様です。第2引数の外部キーと第3引数の内部キーを省略できるところも同様です。つまり、引数の記述方法は全く同じです。

それでは、何が違うのでしょうか。hasOneとhasManyでは、関連モデルの紐付けが違います。hasOneでは、一つのモデルに対して一つの関連モデルが紐付けされていましたが、hasManyでは、一つのモデルに対して複数のモデルが紐付けされています。 ですので、hasOneとhasManyの一番の違いは、紐付けされているモデルが一つなのか、複数なのかの違いがあります。

 

belongsTo(逆の関係の定義)

hasOneの逆のリレーションを定義するには、belongsToメソッドを使います。

belongsTo(モデル名,外部キー,内部キー)

上の例でEloquentはPostモデルのcat_idに一致するidを持つCategoryモデルを見つけようとします。Eloquentはリレーションメソッド名に_idのサフィックスを付けた名前をデフォルトの外部キー名とします。しかしPostモデルの外部キーがcat_idでなければ、belongsToメソッドの第2引数にカスタムキー名を渡してください。

[ファイルの編集]

[ファイルの中身]

[ファイルの編集]

[ファイルの中身]

 

ダミーデータの作成

Seed機能をつかってダミーデータを生成します。 まず、Seederファイルを作成します。

database/seeds/PostCommentSeeder.php

[ディレクトリの移動]

[ファイル作成]

[ファイルの編集]

[ファイルの中身]

データの保存

save()は更新データとの差分を見て更新するか決めてる

※$commentは自ら$comment->save()しようとすると、外部キー制約に引っかかりINSERTできない。必ず、$post->comments()からsaveしてやる必要がある。

 

外部キー制約

外部キー制約とは、テーブルの指定したカラムに格納できる値を他のテーブルに格納されている値だけに限定するものです。参照される側のテーブルを親テーブル、参照する側のテーブルを子テーブルと呼びます。「親 postsテーブル、カラムid」、「子 commentsテーブル、カラムpost_id」

 

mt_rand

int mt_rand ( int $min , int $max )

mt_rand (最小値, 最大値(省略可));

 

カラム値の増加/減少

クエリービルダーは指定したカラムの値を増やしたり、減らしたりするのに便利なメソッドも用意しています。これはシンプルな短縮記法で、update分で書くのに比べるとより記述的であり、簡潔なインターフェイスを提供しています。

両方のメソッドともに変更したいカラムを第1引数に指定します。オプションの第2引数はそのカラムの増減値を指定します。第2引数なしの場合、自動増分

 

次のコマンドを実行します。

[実行コマンド]

※実行結果は何も表示されない。エラーが出なければOK

 

リソースコントローラーを生成する

プロジェクトまでディレクトリを移動します。

[コマンド]

ファイルの場所は、プロジェクト名/

app/Http/Controllersに作成される。

app/Http/Controllers/PostsController.php

[ディレクトリの移動]

[ファイルの編集]

[ファイルの中身]

全データ取得

$posts = Post::all();

Eloquentのallメソッドはモデルテーブルの全レコードを結果として返します。

 

PHP

PHPコードをビューへ埋め込むと便利な場合もあります。Bladeの@phpディレクティブを使えば、テンプレートの中でプレーンなPHPブロックを実行できます。

ビューへデータを送る

取得したデータは with() を利用し、ビューへ送る。

 

ルーティングの設定

ルーティング_詳しくはコチラを参考

routes/web.php

[ファイルの編集]

[ファイルの中身]

ルーティング

ルーティングとは「ページを見ている人が ☓☓☓.☓☓.☓☓☓.☓☓/index という URL にアクセスをしたら HogehogeControllerhoge() というメソッドを通りますよ」というような設定をしてあげること。
フレームワークにおいて大事な要素となる。

Laravelにおけるルーティングは、route/web.phpにまとめて記述していく。

「HTTPリクエストが GET で http://☓☓☓.☓☓.☓☓☓.☓☓/bbc にアクセスされたら、PostsController の index() メソッドを通ってね。別名(View名)は bbc.index だよ。」と記述してある。

[ルーティングを確認]

[実行結果]

 

共通テンプレート作成

resources/views/layouts/default.blade.php

[ディレクトリの移動]

[ファイル作成]

[ファイルの編集]

[ファイルの中身]

lang=”ja”

HTMLのlang属性は、要素内で使用されている言語を表記する属性です。よく見かけるのが、<html lang=”ja”>という記述だと思います。これは、html要素内で使われている言語はja、つまり日本語ですよという意味です。

 

@yield(‘content’)

bodyタグの中に @yield(‘content’) と記入しました。この箇所が実際のページのコンテンツを流し込む箇所になります。

引数で渡している ‘content’ は 複数の@yieldがある場合に、場所を特定する為の名前になります。

 

一覧用の画面を作成

resources/views/bbc/index.blade.php

[ディレクトリの移動]

[ディレクトリの作成]

[ディレクトリの移動]

[ファイル作成]

[ファイルの編集]

[ファイルの中身]

@extends('layouts.default') で先ほど作成した共通レイアウトを読み込み、@section('content')@endsectionで content を定義している。

 

$post->category->nameに関して

Post.phpモデルのCategory()メソッドからカテゴリー名を取得しています。
Eloquent ORMの便利な機能です。

 

link_to

指定されたURLへのHTMLリンクを生成します。

link_to を使って、’/bbc/{$post->id}’へのリンクタグを作成します。bootstrap3のclassを設定して、リンクタグをボタンの様に表示します。

 

PHP

PHPコードをビューへ埋め込むと便利な場合もあります。Bladeの@phpディレクティブを使えば、テンプレートの中でプレーンなPHPブロックを実行できます。

 

link_toを使用出来るように対応

Laravel5になってlink_toヘルパーが使用できなくなっています。
私の場合は、エラーが出てかなりハマりました…

参考にしたサイト

以下に対応策を書いておきます。

まずは、ディレクトリをプロジェクトまで移動してください。

[ファイルの編集]

[ファイルの中身]

[ファイルの編集]

[ファイルの中身]

[Laravel集合パッケージをインストール]

[実行結果]

ここで画面の確認をしてみます。

大きく Laravel の文字が出ていたページの URL に「/bbc」を足すとindexページが見られる。

 

続きを読むボタンを作っていく

現状では、続きを読むボタンは動きません。
続きを読むボタンを動かすためにコントローラーを作ります。
編集ファイル:app/Http/Controllers/PostsController.php

[ディレクトリの移動]

[ファイルの編集]

[ファイルの中身]

※find() は指定したIDのレコードを単一のオブジェクトで返します。

つぎにビューをつくります。
新規に作成ファイル:resources/views/bbc/single.blade.php

[ディレクトリの移動]

[ファイル作成]

[ファイルの編集]

[ファイルの中身]

ルーティングの設定をします。

[ファイルの編集]

[ファイルの中身]

ページが表示されるか確認します。

 

投稿機能

ビューを作ります。

resources/views/bbc/create.blade.php

[ディレクトリの移動]

[ファイル作成]

[ファイルの編集]

[ファイルの中身]

以下のページが完成しました。

コントローラーにビューの呼び出しを追加します。

app/Http/Controllers/PostsController.php

[ディレクトリの移動]

[ファイルの編集]

[ファイルの中身]

投稿ボタンをクリックした時の動作も追加します

[ファイルの中身]

FormRequestという機能を使うためにPostStoreRequestクラスを作成してそれを 読み込んでいます。 そのため、store() はシンプルになっています。 PostStoreRequestの内容は以下のとおりです。

[フォームリクエストを生成]

[ディレクトリの移動]

[ファイルの編集]

[ファイルの中身]

FormRequestクラスを継承して、バリデートの内容をrules()で、 カスタムメッセージの内容をmessages()でそれぞれ返しています。

createメソッドでデータを挿入するので Postモデルに $fillable プロパティを定義する必要があります。

app/Post.php

[ファイルの編集]

[ファイルの中身]

これで完成です。
バリデーションエラーがおきると以下のようになります。

投稿するページにリンクがないので作成します。

[ディレクトリの移動]

[ファイルの編集]

[ファイルの中身]

ルーティングの設定をします。

[ファイルの編集]

[ファイルの中身]

これで投稿するページにリンクができるようになりました。

 

特定のカテゴリーに属する記事一覧の表示

まず、index ビューをすこし修正して、カテゴリーをクリックできるようにします。

resources/views/bbc/index.blade.php

[ディレクトリの移動]

[ファイルの編集]

[ファイルの中身]

つぎにコントローラーにshowCategory()メソッドを作成します。

app/Http/Controllers/PostsController.php

[ディレクトリの移動]

[ファイルの編集]

[ファイルの中身]

つづいて、ビューファイルを作成します。

resources/views/bbc/category.blade.php

[ディレクトリの移動]

[ファイル作成]

[ファイルの編集]

[ファイルの中身]

最後にルーティングの設定をします。

[ファイルの編集]

[ファイルの中身]

これでカテゴリごとの表示ができるようになりました。

 

コメントの投稿機能

はじめに、ビューを編集します。

resources/views/bbc/single.blade.php コメント一覧の下に追加

[ディレクトリの移動]

[ファイルの編集]

[ファイルの中身]

次にコントローラーを作成します。

プロジェクトまでディレクトリを移動します。

[コマンド]

[ディレクトリの移動]

[ファイルの編集]

[ファイルの中身]

PostsController と同じように FormRequestを継承したCommentStoreRequestを使用しています。

CommentStoreRequestの内容は以下のとおりです。

[フォームリクエストを生成]

[ディレクトリの移動]

[ファイルの編集]

[ファイルの中身]

FormRequestクラスを継承して、バリデートの内容をrules()で、 カスタムメッセージの内容をmessages()でそれぞれ返しています。

次にルーティングの設定をします。

routes/web.php

[ファイルの編集]

[ファイルの中身]

これでコメントの投稿ができるようになりました。

 

ページネーション

Laravel5 ではすでにページネーション機能が組み込まれています。

ですのでページネーションの実装は簡単です。

Controller

app/Http/Controllers/PostsController.php

[ディレクトリの移動]

[ファイルの編集]

[ファイルの中身]

pagenate()の引数の “10” が1ページに表示するデータ数です。

View

resources/views/bbc/index.blade.php

[ディレクトリの移動]

[ファイルの編集]

[ファイルの中身]

これだけでクエリストリングスからpageという値を自動で読み取ってくれます。

動作確認をすると生成するリンクにも?page=xxxが付与されているのがわかります。

掲示板の一番下にページの切り替えボタンが作成されていることを確認して下さい。

 

戻るボタン

resources/views/bbc/create.blade.php

[ディレクトリの移動]

[ファイルの編集]

[ファイルの中身]

href="#" というのは「そのページの最上部へのリンク」という意味で、スクロールした場所から一番上に戻したい場合に使います。
return falseを書くと、そのリンクがクリックされた時に history.back() という関数を実行し、他の処理はするな、という意味です。
history.back() … 1つ前に戻る
以下のように戻るボタンが作成されます。

 

resources/views/bbc/single.blade.php

[ファイルの編集]

[ファイルの中身]

以下のように戻るボタンが作成されます。

 

resources/views/bbc/category.blade.php

[ファイルの編集]

[ファイルの中身]

以下のように戻るボタンが作成されます。

 

削除ボタン

app/Comment.php

[ファイルの編集]

[ファイルの中身]

ソフトデリートの処理を追加。詳しくはコチラ⇒Laravel 5.4 Eloquent:利用の開始
app/Http/Controllers/CommentsController.php

[ディレクトリの移動]

[ファイルの編集]

[ファイルの中身]

既存の書いてある中身をけっこう変更しているでファイルごとコピーで上書きしていいレベルです。(笑)

 

resources/views/bbc/single.blade.php

[ディレクトリの移動]

[ファイルの編集]

[ファイルの中身]

 

routes/web.php

[ファイルの編集]

[ファイルの中身]

以下のように削除ボタンが作成されます。

 

まとめ

Laravel4とはディレクトリの構成が変わったり、メソッド名、コマンド名が変わったりと すこし戸惑う部分もありましたが、Laraveを初めて使用してみましたが、やり方が分かっていれば結構簡単に色々作成できると感じました。

投稿者: samancha

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA