Laravel5.7でcontorllerからmodelの呼び出し

mysqlにデータが入っており、controllerからmodelを呼び出してviewの*.blade.phpに表示させたい。

何をするか?こんなところでしょうか??(色々試していたら2日かかった)

1. mysqlにデータを入れる
2. modelから1で入れたテーブルを読み込む
3. controllerでmodelを読み込む
4. viewでmysqlのデータを表示する

1. mysqlにデータを入れる
まず、mysqlのtableにデータを挿入します。

INSERT INTO company(company_name, type, status) VALUES ('富士通', 1, 1),('リク ルート', 1, 1),('日本ユニシス', 1, 1);

2. modelから1で入れたテーブルを読み込む
app/Company.php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Company extends Model
{
    protected $table = 'company';
}

3. controllerでmodelを読み込む
use App\Company;でmodelを読み込みます。 App\Models\Company;だとエラーが出ます。ディレクトリがそのままと考えてよいでしょう。

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Company;

class CompanyIndexController extends Controller
{
    public function index(){
    	$data = new Company();
    	$table = $data::all();
    	return view('companyindex', ['data'=> $table]);
    }
}

4. viewでmysqlのデータを表示する
companyindex.blade.php
@foreachでcontrollerからpostする
$d->${カラム名}

@section('content')
      @foreach($data as $d)
      <li>{{$d->company_name}}</li>
      @endforeach
@endsection

反映されました。OK~~~~~~~~~~~~♪♪♪

さあ、次はbaldeからinputです。

mysqlで複数データをまとめてinsert

mysqlで複数データをinsertしたいとします。sql文はどう書けばいいのでしょうか?
insert into values の後を複数で繋げます。

INSERT INTO {table_name} (column_name1, column_name2) VALUES ('value1','value2'), ('value3', 'value4');

では実際にやってみましょう。まずsql文を作ります。データは適当に用意します。

INSERT INTO company(company_name, type, status) VALUES ('富士通', 1, 1),('リクルート', 1, 1),('日本ユニシス', 1, 1);

select * from でデータが入っているか確認します。

複数データが入っています。

AWS 踏み台サーバー(bastion)経由でSSH接続

踏み台サーバーの英語:bastion
英語名のbastionをそのままAWSのインスタンス名に使用することが多いかと思います。

踏み台サーバのセキュリティ
踏み台サーバーは、例えば アクセスする地域が限定されていてアクセスできない場合に、許可されている地域のサーバ経由でアクセスするなど、悪いイメージがあるかもしれませんが、アプリケーションのセキュリティ対策としては有効な手段の一つとなっています。

踏み台サーバーとは?
踏み台サーバーとは中継サーバーで、踏み台サーバーを経由してでないとターゲットのサーバーにアクセスできないようセキュリティグループを設定する。
踏み台サーバーからアクセスすれば、接続先のWebサーバに踏み台サーバから接続してきたと思わせることができる。

– パブリックIPをインスタンスに割り当てる必要がない
– アクセス制御の対象を踏み台サーバに限定できるため、運用負荷を軽減

AWSでの設定方法
1. VPCの作成
2. Subnetの作成(踏み台サーバ、アプリサーバ、データストア)
3. Internet Gateway
4. Route Tableの確認、設定
5. Security Groupの作成(踏み台サーバ、アプリケーションサーバ、DB用)
6. 踏み台サーバの構築

※セキュリティグループをそれぞれ作成する

MySQLでINDEXを貼るメリットと方法

indexとは何か?indexという言葉が頭に入ってこない。index.htmlと混合する。などなど。
indexは「あかさたな」でいうア行、サ行など、検索のショートカットと感がれば分かり易い。

MySQLでどんなケースだとINDEXを設定するのか?
– レコード(n)が多く、検索(O(n))に時間がかかっている
– それによってアプリケーションのパフォーマンスに影響が出る

イメージしやすいと思うが、select文での検索(O(n))の時間は Olog(n)となり、レコードの処理に時間がかかる。indexをおくと、全件検索しなくて済むので、処理時間が短くなる。

indexの種類は幾つかあるが、mysqlではB-TreeIndexが使用されている。

(あ、この図、検索アルゴリズムの本などで見たことある!!クイックソートだ。)
ということで、関連する書籍を「情報検索アルゴリズム」などのワードでamazonで調べると良いだろう。

インデックスをはると、クイックソートの並び替えが短縮されるので、処理が短くなるという算段だ。

インデックスの追加は

ALTER TABLE table_name ADD INDEX index_name(column_name);

ソフトウェアの開発プロセス

ソフトウェアの開発プロセス、開発手法というと、ウォーターフォールが一般的であろう。しかし、近年はアジャイル、スクラムといった開発手法が注目されているし、DevOpsなどのワードも一般的だ。ここで開発プロセスを整理したい。

ウォーターフォール型の開発
1. 基本設計→外部設計→内部設計→プログラム設計→プログラミング→テストという工程に分けて順に段階を追う。
– 管理しやすいが、行程を後戻りできない。

アジャイル開発
1.大きな単位でシステムを区切るのではなく、小単位で実装とテストを繰り返して開発を進めていく
– 開発期間が大幅に短縮され、不具合発生時の後戻り工数が少ない。ただし、厳密な方針を固めてないので、ぶれやすい。進捗を把握しにくく、コントロールが難しい。


では具体的に実装タスクをブレイクダウンしてみましょう。
1.実装
– 実装・GHEプルリク
– コードレビュー
– 修正対応

2.単体テスト
一つの関数の判定
– テスト仕様書
– コードレビュー
– 修正対応

3.結合テスト
– テスト仕様書作成
– テスト仕様書レビュー
– レビュー指摘対応
– テスト実施(不良対応)
– テスト結果確認
– 確認の指摘対応

4.受け入れテスト
– テスト仕様書作成
– テスト仕様書レビュー
– テスト実施
– 不良対応
– 不良対応確認

5.商用リリース
– 手順書作成
– 手順書レビュー
– 指摘対応
– リリース実施

大まかな流れを記載したが、開発タスクのサイズや方針によって変わってくると思う。

Laravel5.7に静的HTMLファイルを配置する

Laravel5.7で静的HTMLファイルを配置する場合

/resources/views配下の*.blade.php はcontrollerで呼び出しているので、viewsディレクトリではなく、/public配下に*.htmlを配置する。

例: help.htmlを置いてみます。

help.html

hello

htmlを確認すると、反映されています。

Laravel5.7 テンプレートの継承

公式ドキュメントのBladeテンプレートの継承に習って構築していきます。
https://readouble.com/laravel/5.7/ja/blade.html

レイアウト定義
Bladeビューとして定義する。マスターのテンプレート名は迷いますね。公式ドキュメントではapp.blade.phpと記載がありますが、これは悩みますな。
とりあえず入れてみます。
/resources/views/app.blade.php

<!DOCTYPE html>
<html>
  <head>
  	<meta http-equiv="Content-Type" charset="utf-8">
    <title>@yield('title')</title>
    <meta name="description" content="Zeusはメール配信管理システムです。" />
    <link href="https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.css" rel="stylesheet">
    <link rel="stylesheet" href="{{ asset('/css/style.css') }}">
    <link rel="stylesheet" href="{{ asset('/css/main.css') }}">
    <link rel="shortcut icon" href="/assets/img/favicon.png">
    <script src=""></script>
  </head>
  <body>
   <!-- 共通ヘッダー -->
   <div id="header">
    <h1><a href="/"><img src="/asset/img/log.png" alt="" />Zeus</a></h1>
    <ul id="helpNav">
        <li><a href="/top.html">ホーム</a></li>
        <li><a href="/logout.html">ログアウト</a></li>
    </ul>    
    <ul id="gNav">
        <li class="menu__single"><a href="/profile">アカウント一覧</a>
        <ul class="second_level">
          <li><a href="/profile">プロフィール詳細</a></li>
          <li><a href="/account/index">アカウント一覧</a></li>
          <li><a href="/account/input">アカウント新規登録</a></li>
          <li><a href="/company/index">原稿管理会社一覧</a></li>
        </ul>
        </li>
        <li class="menu__single"><a href="/manu/index">原稿一覧</a>
        <ul class="second_level">
          <li><a href="/manu/index">原稿一覧</a></li>
        </ul>
        </li>
        <li class="menu__single"><a href="/help.index">Zeusについて</a>
          <ul class="second_level">
            <li><a href="/help.index">ヘルプ</a></li>
            <li><a href="/manual/zeus.pdf">マニュアル</a></li>
            <li><a href="/rules.html">利用規約</a></li>
            <li><a href="/login">ログイン</a></li>
          </ul>
        </li>
        </ul>
    </div>
    <!-- / 共通ヘッダー -->

    <div id="content">
      @yield('content');
    </div>

    <!-- 共通フッター -->
  	<footer>
  		hpscript
  	</footer>
    <!-- / 共通フッター -->
  </body>
</html>

継承するレイアウトを指定する
resources/views/top.blade.php

@extends('app')
@section('title', 'トップページ')

@section('content')
<div id="top-main">
         <h2>Zeus</h2>
         <p>原稿作成・入稿ツールです。<br>原稿の作成・保存・入稿作業にご利用いただくことができます。</p>
      </div>
      <div id="news_h">
            <p>お知らせ</p>
      </div>
      <div id="news_t">
            <p>2018/10/17 ツールをリニューアルしました。</p>
      </div>
@endsection

ああああああああああ、これはマジで凄い。
Laravelびっくりした。

便宜的にlayoutフォルダの下に格納した方が良さそうですね。

Laravel5.7 bladeファイルをインクルードする手順

1. 何をインクルード化するか決める
2. /resources/views/ 配下にテンプレート化するbladeファイルを作成する
3. 2で作成した共通ファイルにインクルードする内容を書く
4. @include(”)構文を利用してインクルードする

1. 何をインクルード化するか決める
なにをインクルードするか。
パーツとして思いつくのは、head、header navi、footer。他にもあるかもしれないが、まずは、この3つをインクルードする。

2. /resources/views/ 配下にテンプレート化するbladeファイルを作成する
共通ヘッダをインクルードするため、common-head.blade.phpをviewsディレクトリ配下に作る。

3. 2で作成した共通ファイルにインクルードする内容を書く
あれ、titleはインクルードできないじゃん。

<head>
  	<meta http-equiv="Content-Type" charset="utf-8">
    <title>トップページ</title>
    <meta name="description" content="Zeusはメール配信管理システムです。" />
    <link href="https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.css" rel="stylesheet">
    <link rel="stylesheet" href="asset/css/style.css">
    <link rel="stylesheet" href="asset/css/main.css">
    <link rel="shortcut icon" href="/assets/img/favicon.png">
    <script src=""></script>
  </head>

もう一度しっかり公式ドキュメントを見てみよう。
Bladeテンプレートについて記載がありました。
https://readouble.com/laravel/5.7/ja/blade.html
やり直しましょうw

Laravel5.7でCSSを読み込む時

Laravelで読み込む際は、{{ asset(‘$path’)}}を使う。

<link href="{{ asset('$path') }}" media="all" rel="stylesheet" type="text/css" />

具体的に見てましょう。views配下にlogin.blade.phpがあります。
/resources/views/loging.blade.php
viewsの中に以下のようにassetフォルダはおきません。全てpublic配下に置きます。

<head>
    <meta charset="utf-8">
    <title>ログイン</title>
    <link rel="stylesheet" href="asset/css/style.css">
    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.4.1/css/all.css" integrity="sha384-5sAR7xN1Nv6T6+dT2mhtzEpVJvfS3NScPQTrOxhwjIuvcA67KV2R5Jz6kr4abQsz" crossorigin="anonymous">
    <script src=""></script>
  </head>

CSSが効いていません。

/public/css/style.css を作る
css, js, imgなどはpublic配下に置く

先に作っていたcssをペーストします。

body {
  margin: 0px; }
  body #content {
    margin-right: 50px;
    margin-left: 50px; }
    body #content .sm {
      font-size: 11px; }

h1 {
  text-align: center; }

p {
  font-size: 0.975px; }

#form {
  font-size: 0.875px; }
  #form tr {
    height: 80px; }
  #form th {
    border: solid 1px #ccc;
    width: 200px;
    text-align: left;
    background-color: #f5f5f5;
    padding: 5px; }
  #form td {
    border: solid 1px #ccc;
    width: 800px;
    padding-left: 10px; }

.button_wrapper {
  text-align: center; }

input[type="text"] {
  border: 0;
  padding: 10px;
  font-size: 1.3em;
  color: #aaa;
  border: solid 1px #ccc;
  margin: 0 0 20px;
  width: 700px;
  -webkit-border-radius: 3px;
  -moz-border-radius: 3px;
  broder-radius: 3px; }

#square_btn {
  position: relative;
  text-align: center;
  display: inline-block;
  padding: 0.55em 0.7em;
  text-decoration: none;
  color: #fff;
  background: #483d8b;
  border: solid 1px #483d8b;
  border-radius: 4px;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2);
  text-shadow: 0 1px 0 rgba(0, 0, 0, 0.2); }

footer {
  position: fixed;
  margin-top:;
  bottom: 0px;
  width: 100%;
  height: 30px;
  padding-top: 10px;
  padding-bottom: 10px;
  background: #483d8b;
  text-align: center;
  color: #fff; }

/resources/views/loging.blade.php のCSSパスを書き換え
bladeのパスを{{ asset(‘/css/style.css’) }}とします。

<head>
    <meta charset="utf-8">
    <title>ログイン</title>
    <link rel="stylesheet" href="{{ asset('/css/style.css') }}">
    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.4.1/css/all.css" integrity="sha384-5sAR7xN1Nv6T6+dT2mhtzEpVJvfS3NScPQTrOxhwjIuvcA67KV2R5Jz6kr4abQsz" crossorigin="anonymous">
    <script src=""></script>
  </head>

サーバーで確認
下図赤線で囲っているように、/loginでCSSが通っているのが分かります。

OKじゃないでしょうか。
では、数十ページやりましょうかね。やっぱり、Controllerとview、modelはそれぞれ考えることが違うので、モデル、フロントは先に作っておいた方が効率いいですね。
一人称でサイトつくるとMVCのメリットがイマイチわからんと思ってたけど、ER図、frontなどをそれぞれ作るなら、MVCの利が理解できます。

Laravel5.7でController、Routing、Viewを構築する

laravel5.7でloginページを作りたいとします。

構築の流れ
1. コマンドラインphp artisan make:controllerでloginをつくる
2. /routes/web.phpでLoginControllerのgetメソッドを書く
3. /app/Http/Controllers/LoginController.phpでviewを書く
4. /resources/views/login.blade.phpでviewを書いていく
5. php artisan server –host でサーバーを立てる
6. ブラウザで192.168.35.10:8000/login で表示確認

1. コマンドラインphp artisan make:controllerでloginをつくる
Laravelは命名規則は他のフレームワークに較べて、然程厳しくないと言われています。
しかしながら、Controllerはキャメル記法が推奨されています。
キャメル記法とは単語の頭を大文字にする記述方法です。
例えば、userのcontrollerならUserControllerとします。複数形が推奨されており、UsersControllerの方が良いとされています。ここでは、キャメル記法に習ってLoginControllerとします。
[vagrant@localhost zeus]$ php artisan make:controller LoginController
Controller created successfully.
すると、/app/Http/Controllers/ 配下に、LoginController.phpが出来ます。

2. /routes/web.phpでLoginControllerのgetメソッドを書く
web.phpに以下のように$uriと$callbackを追加します。これは、LoginController.phpの”login”メソッドを呼び出せ、という意味です。上の’/’に関しては、ホームディレクトリにアクセスがあった場合には、AccountControllerのindexメソッドを呼び出せ、という意味になります。

Route::get('/', 'AccountController@index');
Route::get('/login', 'LoginController@login');

なお、Httpリクエストに対して定義できるメソッドは以下のようになります。

Route::get($uri, $callback);
// GETリクエストに対してのルーティング
Route::post($uri, $callback);
// POSTリクエストに対してルーティング 主にフォームのPOSTリクエスト
Route::put($uri, $callback);
// PUTリクエストに対してルーティング
Route::patch($uri, $callback);
// PATCHリクエストに対してのルーティング
Route::delete($uri, $callback);
// DELETEリクエストに対してのルーティング
Route::options($uri, $callback);
// OPTIONSリクエストに対してのルーティング

3. /app/Http/Controllers/LoginController.phpでviewを書く
上記1で作成されたLoginController.phpに、loginメソッドを書きます。
viewのlogin.blade.phpを読み込みます。

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class LoginController extends Controller
{
    public function login(){
    	return view('login');
    }
}

4. /resources/views/login.blade.phpでviewを書いていく
なんでもいいですが、hello laravelとしておきます。

<!DOCTYPE HTML>
<html>
<head>
    <title>login</title>
</head>
<body>
    <h1>Hello Laravel</h1>
</body>
</html>

5. php artisan server –host でサーバーを立てる
サーバーを立ち上げます。
[vagrant@localhost zeus]$ php artisan serve –host=192.168.35.10
Laravel development server started:

6. ブラウザで192.168.35.10:8000/login で表示確認