フリーランスのためのネットビジネス専門学校 ネットで独立開業を目指す人を応援
フリーランスのためのネットビジネス専門学校 ネットで独立開業を目指す人を応援

今月クリスマスだけど、一緒にケーキを食べてくれる人がいないからCakePHPについて記事を書いてみた

昔書いたものを復刻しました。

windowsの方はこちら
windows Laravel環境構築
qiita.com/homhom99/items/3161ed3eb8ea0e6ba14e

macの方はこちら
mac Laravel環境構築
qiita.com/homhom99/items/38bc4e4a02a66acead91


最低限の設定

configapp.php
'timezone' => 'Asia/Tokyo',
'locale' => 'ja',

Controllerを作る

php artisan make:controller HelloController

ここを見てみましょう

できたファイルを編集してみましょう

appHttpControllersHelloController.php
    public function index()
    {
        $msg = 'hello';
            return view('hello.index', ['msg' => $msg]);
    }

ルーティングを設定する

routesweb.php
Route::get('/hello', 'HelloController@index');

bladeを作成する

resourcesviewshelloindex.blade.php

次のURLを確認してみましょう
localhost:8000/hello


@foreachを使う

appHttpControllersHelloController.php
    public function index()
    {
        $msgs = [
            'hello',
            'こんにちは',
            '尓好'
        ];
            return view('hello.index', ['msgs' => $msgs]);
    }

bladeの中でforeachを使う

resourcesviewshelloindex.blade.php
@foreach($msgs as $msg)
<br>
@endforeach

Bladeを使わないとこんな書き方です

参考サイト
flatFlag
endforeachの書き方でHTML埋め込みもスッキリ!
www.flatflag.nir87.com/foreach-294#endforeachHTML


ほかはこういうのもあります

@if(bool)
    // code
@endif

次とイコール

<?php if(boo) : ?>
    // code 
<?php endif; ?>
@php
// code
@endphp

次とイコール

<?php
// code
?>

他にはこんなものもあります

参考サイト
Laravel 5.7 Bladeテンプレート
readouble.com/laravel/5.7/ja/blade.html#introduction


DB作成

マイグレーションファイルを作成
DBの移行を簡単にするファイル。
ここでは、DBを作成するために使う。

php artisan make:migration create_articles_table

マイグレーションファイルを編集

databasemigrations2018_08_10_183909_create_article_table.php
<?php

use IlluminateSupportFacadesSchema;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateDatabaseMigrationsMigration;

class CreateArticleTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('article', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('user_id');
            $table->string('title');
            $table->string('body');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('article');
    }
}

マイグレーション実行

php artisan migrate

DBが作られているかDB Browser for SQLiteで確認する

macは

mysql> show column from article;

サンプルデータを作る

seederファイルを作成。
サンプルデータを作れる。

php artisan make:seeder ArticleSeeder

databaseseedsArticleSeeder.php
<?php

use IlluminateDatabaseSeeder;

class ArticleSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        // テーブル内のデータを一旦全削除
        IlluminateSupportFacadesDB::table('article')->truncate();

        // データのインサート
        DB::table('article')->insert([
            [
                'user_id' => 2,
                'title' => '暁美ほむらの名言1',
                'body' => '私は冷静な人の味方で、無駄な争いをする馬鹿の敵。貴女はどっちなの?佐倉杏子。',
                'created_at' => '2018-06-10 21:07:31',
                'updated_at' => '2018-06-10 21:07:31'
            ],
            [
                'user_id' => 2,
                'title' => '暁美ほむらの名言2',
                'body' => '貴女は自分を責めすぎているわ。鹿目まどか、貴女を非難できる者なんて、誰もいない。いたら、私が許さない。',
                'created_at' => '2018-06-10 21:07:31',
                'updated_at' => '2018-06-10 21:07:31'
            ],
            [
                'user_id' => 2,
                'title' => '暁美ほむらの名言3',
                'body' => '私は嘘をつきたくないし、出来もしない約束もしたくない。',
                'created_at' => '2018-06-10 21:07:31',
                'updated_at' => '2018-06-10 21:07:31'
            ]
        ]);
    }
}

seederを登録する

databaseseedsDatabaseSeeder.php
<?php

use IlluminateDatabaseSeeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call([
            ArticleSeeder::class,
        ]);
    }
}

seederを実行

php artisan db:seed

データができているか見てみましょう。

mac

select * from article;

モデルを作成

$ php artisan make:model Article

次を追加
bash
protected $table = 'article';


Controllerを作る

php artisan make:controller ArticleController
appHttpControllersArticleController.php
// モデルを追加
use AppArticle;


    public function index()
    {
            // データベースから全データを取得
            $article = Article::all();
            // viewにデータを渡す
            return view('article.index', ['articles' => $article]);
    }

ルーティングを設定する

routesweb.php
Route::get('/article', 'ArticleController@index');

bladeを作成する

次の場所にファイルを作成
resourcesviewsarticleindex.blade.php


一旦ここでDBからデータが取れるか確認

resourcesviewsarticleindex.blade.php
@foreach($articles as $article)
    
    
@endforeach

localhost:8000/article


errorになる場合

ヒント
DB設定を見直す

serverを一旦ストップ、再起動

キャッシュをクリアしてみる

$ php artisan config:clear
$ php artisan cache:clear

データを作成するメソッドを追加

appHttpControllersArticleController.php
<?php

namespace AppHttpControllers;

use IlluminateHttpRequest;
use AppArticle;
use Validator;

class ArticleController extends Controller
{
    public function index()
    {
        $articles = Article::orderBy('id', 'desc')->get();
        return view('article.index', ['articles' => $articles]);
    }

    public function add (Request $request)
    {
        // 保存の処理
        $article = new Article;
        $article->user_id = 1; // 今回は1固定       
        $article->title = $request->input('title');
        $article->body = $request->input('body');
        $article->save();

        return redirect()->to('/article');
    }
routesweb.php
Route::post('/article/add', 'ArticleController@add');

bladeを作成

多いのでコピペしましょう。

resourcesviewslayoutscommon.blade.php
<html>
    <head>
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/css/bootstrap.min.css" integrity="sha384-Smlep5jCw/wG7hdkwQ/Z5nLIefveQRIY9nfy6xoR1uRYBtpZgI6339F5dgvm/e9B" crossorigin="anonymous">
        <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
        <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/js/bootstrap.min.js" integrity="sha384-o+RDsa0aLu++PJvFqy8fFScvbHFLtbvScb8AjopnFD+iEQ7wo/CG0xlczd+2O/em" crossorigin="anonymous"></script>
        <title>@yield('title')</title>
    </head>
    <body>
        <div class="mx-auto" style="width: 600px; background-color: #2ff1d4; margin: 10px 10px">
            <div class="container-fluid">
                @yield('content')
            </div>
        </div>
    </body>
</html>

少しだけ解説

タイトルをはめ込みます

<title>@yield('title')</title>        

設定したコンテンツをはめ込みます

@yield('content')

resourcesviewsarticleindex.blade.php
@extends('layouts.common')
@section('title', '掲示板')
@section('content')
    <div class="row">
        <div class="col-sm-12">
            <form method="POST" action="/article/add">
                <div class="form-group">
                    
                    <p class="ext-monospace">タイトル</p><input type="text" name="title" class="form-control">
                    <p class="ext-monospace">本文</p><input type="text" name="body" class="form-control">
                    <br><input type="submit" value="投稿" class="btn btn-default">
                </div>
            </form>

        </div>
    </div>
    <div class="mx-auto" style="width: 450px;">
        <div class="row">
            <div class="col-sm-12">
                @foreach($articles as $article)
                    <div class="card border-primary mb-4" style="max-width: 30rem;">
                    <div class="card-body text-primary">
                        <h5 class="card-title"></h5>
                        <p class="card-text"> </p>
                    </div>
                    </div>
                @endforeach
            </div>
        </div>
    </div>
@endsection

親bladeとの関係性を設定します。

@extends('layouts.common')

タイトルを設定できます

@section('title', '掲示板')

はめ込む部品を書きます。

@section('content')
    //code
@endsection

コメントを追加してみよう
localhost:8000/article


削除機能をつける

resourcesviewsarticleindex.blade.php
<p class="card-text"></p>
// この下に入れる
<form method="post" action="/article/delete/">

<input type="submit" value="削除" class="btn btn-danger btn-sm" onclick='return confirm("君は本当に削除するつもりかい?");'>
</form>

Controllerに削除メソッドを追加

appHttpControllersArticleController.php
public function delete (Request $request)
{
    Article::find($request->id)->delete();
    return redirect('/article');
}

ルートを設定し、deleteメソッドを起動させる。

routesweb.php
Route::post('/article/delete/{id}', 'ArticleController@delete');

削除できるか確認してみよう

localhost:8000/article


Validate機能を設定する

保存処理の前にValidateの設定を書きます。

appHttpControllersArticleController.php
// Validateをインポート
use Validator;

// 省略

    public function add (Request $request)
    {
        // Validation
        // 入力情報の取得
        $inputs = $request->all();

        // ルールを設定
        $rules = [
            'title' => 'required|max:15',
            'body' => 'required|max:256'
        ];

        // エラーメッセージを設定
        $messages = [
            'title.required' => 'タイトルは必須だよ',
            'title.max' => 'タイトルは15文字以内だよ',
            'body.required' => '本文は必須だよ',
            'body.max' => '本文は256文字以内だよ'
        ];

        $validation = Validator::make($inputs, $rules, $messages);

        if ($validation->fails()){
            return redirect()->back()->withErrors($validation->errors())->withInput();
        }

        // 保存の処理
        $article = new Article;
        $article->user_id = 1; // 今回は1固定
        $article->title = $request->input('title');
        $article->body = $request->input('body');
        $article->save();

        return redirect()->to('/article');
    }


bladeを修正する

ここもコピペしよう

resourcesviewsarticleindex.blade.php
<div class="row">
    <div class="col-sm-12">
        <form method="POST" action="/article/add">
            <div class="form-group">
                
                <p class="ext-monospace">タイトル</p>
                <input type="text" name="title" class="form-control @if ($errors->has('title')) is-invalid @endif" value="">
                @if ($errors->has('title'))
                    <span class="invalid-feedback"></span>
                @endif

                <p class="ext-monospace">本文</p>
                <input type="text" name="body" class=form-control value="">
                @if ($errors->has('body'))
                    <span class="invalid-feedback"></span>
                @endif

                <br><input type="submit" value="投稿" class="btn btn-default">
            </div>
        </form>

    </div>
</div>

Validationが効いているかためしてみよう


参考文献

PHPフレームワーク Laravel入門
掌田津耶乃 (著)
出版社: 秀和システム (2017/9/16)
351ページ
www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF-Laravel%E5%85%A5%E9%96%80-%E6%8E%8C%E7%94%B0%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798052582/ref=tmm_hrd_swatch_0?_encoding=UTF8&qid=&sr=

参考サイト

Laravel 5.7 TOC
readouble.com/laravel/5.7/ja/

どれ使うべき?3大WebフレームワークRails・Django・Laravelを徹底比較してみた
paiza.hatenablog.com/entry/2018/05/07/paizacloud_web_application_frameworks

サンプルデータで使用させていただきました。

出典

魔法少女まどか☆マギカ
www.madoka-magica.com/tv/

【名言多数!】魔法少女まどかマギカ 名言
matome.naver.jp/odai/2140776872680298201

コメント

記事に戻る

コメントを残す