ドドスコblog

PHP Laravel viewのコンポーネントとサブビューの違い

コンポーネントとサブビューの違い

それぞれはviewの作り方を指していて、webページのテンプレートを作る為にある。 通常はcontrollerからviewを呼び出しているが、コンポーネントとサブビューはview(メイン)からview(コンポーネントとサブビュー)を引数を渡して呼び出している。

コンポーネントはhtmlタグ渡して正しく表示できるのに対して、サブビューはそれができない。 以下のサンプルを動かして見るとわかりやすい。

コンポーネント

viewsの直下に下記のmessage.blade.php(メイン)を置く。

<html>
<head>
    <title>@yield('title')</title>
    <style>
        body {font-size:16pt; color: #999999; margin: 5px;}
        h1 {font-size: 50pt; text-align: right; color: #f6f6f6;
            margin: -20px 0px -30px 0px; letter-spacing: -4px;}
        ul {font-size: 12px}
        hr {margin: 25px 100px; border-top: 1px dashed #ddd;}
        ul {font-size: 12pt;}
        hr {margin: 25px 100px; border-top: 1px dashed #ddd;}
        .menutitle {font-size: 14px; font-weight: bold; margin: 0px;}
        .content {margin: 10px;}
        .footer {text-align: right; font-size: 10pt; margin: 10px; border-bottom: solid 1px #ccc; color: #cccccc}
    </style>
</head>
<body>
    <h1>@yield('title')</h1>
    @section('menubar')
    <ul>
        <p class="menutitle">メニュー</p>
        @show
    </ul>
    <hr size="1">
    <div class="content">
        @yield('content')
    </div>
    <div class="footer">
        @yield('footer')
    </div>
</body>
</html>

viewsの直下にhelloフォルダを作り下記のindex.blade.phpを置く。

@extends('layouts.helloapp')

@section('title', 'Index')

@section('menubar')
    @parent
    インデックスページ
@endsection

@section('content')
    <p>ここが本文のコンテンツです。</p>
    <p>必要なだけ記述ができます。</p>
    @component('components.message')
    @slot('msg_title')
    <ul>
    <li>CAUTION!</li>
    <li>aaaa</li>
    </ul>
    @endslot

    @slot('msg_content')
    これはメッセージ
    @endslot
    @endcomponent
@endsection
@section('footer')
    coptyright 2018 VVVVVV.
@endsection

index.blade.phpを下記の様に書き換える。

サブビュー

@extends('layouts.helloapp')

@section('title', 'Index')

@section('menubar')
    @parent
    インデックスページ
@endsection

@section('content')
    <p>ここが本文のコンテンツです。</p>
    <p>必要なだけ記述ができます。</p>
    @include('components.message',
        ['msg_title' =>'OK'],
        ['msg_content'=> '<ul>                <li>CAUTION!</li>
                <li>aaaa</li></ul>'])
@endsection
@section('footer')
    coptyright 2018 VVVVVV.
@endsection

Laravel viewファイルの読み込まれる優先順位

Laravelのviewに同じディレクトリに.phpと.blade.phpの同じ名前のファイルがある場合の挙動を記す。

viewフォルダ

views
 └ hello ┳index.php
          └ index.blade.php

コントローラー

class HelloController extends Controller
{
    public function index(Request $request){
        return view('hello.index');
    }
}

hello.indexはhelloフォルダのphp拡張子を持つindexファイルを呼び出すのでindex.phpとindex.blade.phpのどちらを読み込むかというと、Laravel仕組みで同名ファイルが存在する場合.blade.phpを読み込むことになる。

PHP Laravel メモ

Laravel触ってみた感想
  • MVCがわかれば難しくない。
MVCとは
シングルアクションコントローラー
  • 1つのコントローラーに1つのアクションを作るルール
通常は/ControllerName/ActionNameのようにアドレスは以下の通り
/job/search
/job/get
/job/Quit
一つのコントローラーに複数のアクション(一つのclassに複数のメソッド)ではなく
/job/search -> /job_search
/job/get -> /job_get
/job/quit -> /job_quit

Apache LaravelでHelloWorldを出そうと思ったらつまづいた

Apacheエイリアス使ってHelloWorld出すのに時間がかかってしまった。

httpd.conf

## http://localhost/laravelapp/publicをhttp://localhost/でアクセスできる
Alias / "/MAMP/htdocs/laravelapp/public/"

<Directory "/MAMP/htdocs/laravelapp/public/">
    Options Indexes FollowSymLinks MultiViews
    ##.htaccessを有効にする。
    AllowOverride all
    ## アクセス許可してから拒否
    ## 特定のアクセスを拒否したい場合に記述する。
        Order allow,deny
    ## 全てのアクセス許可
    Allow from all
</Directory>

*localhost/helloにルーティング

web.php

Route::get('hello', function (){
    return '<html><body><h1>Hello</h1><p>this is sample page.</p></body></html>';
});

ここまで順調に行けたのにlocalhost/helloにアクセスするとerror500が出てしまった。

apacheで500errorが出た場合の対処法

  • とにかく初めに.htaccessを確認すること

今回の500errorの原因

  • .htaccessに記述漏れ
  • RewriteBase /を記述することでrewite処理後のベースURLを設定する。
<IfModule mod_rewrite.c>
...
    RewriteBase /
...
</IfModule>

centos7 頻出コマンド 随時更新

ディレクト削除

# -fは強制削除。これをつかわないと延々と削除許可をする可能性があるので絶対つける。
# -rはディレクトリを削除する際につける。これをつけないと「ファイルではない」とエラーが出る。
#ディレクトリを消す際はこの二つを組み合わせて、-rfとする。
rm -rf [directory name]

ページスクロール

mac

shift + fn + ↑or↓

ディレクトリ一覧表示

#treeインストール
yum install tree

#カレントディレクトリより下全て表示
tree
#一階層下表示
tree -L 1
ls

ファイル検索

find / -name "hogehoge" -print

パスワード変更(ログインできるユーザーいる場合)

  • ログインできるユーザーがいない、rootのパスワードがわからない場合はこちらを確認。
#ログインしているユーザーのパスワード表示
passwd 

#ログインしているユーザー以外のパスワード変更
###ユーザーの一覧を表示してidを確認
cat /etc/passwd

passwd [ユーザーid]

cat /etc/passwd|sed -e 's/:.*//g'

webセキュリティ ハッシュ化とか暗号化とか

 注意事項

ここに書いてあるものは古いものが含まれているためwebサービスに適用しないこと。考え方を学ぶためのページ。

暗号化とハッシュ化の違い

  • 暗号化 可逆性がある(復元できる)
  • ハッシュ化 可逆性がない(復元できない)
  • ハッシュ化された文字列を復元できるかもしれないサイトは下記のように存在し、
    5f4dcc3b5aa765d61d8327deb882cf99
    を入力してやるとpasswordであると判定される。
    よく使われる文字列には有効
    復元できればそのハッシュ値はセキュアではない。 crackstation.net

ハッシュ化をより強固する

  • ハッシュ化する文字列に対してsaltと呼ばれる呼ばれる文字列を付与する。
  • 脆弱性のないハッシュ関数を使っていく。md5 < sha1 < sha256
    PHPならpassword_hash() を使えばいい。

saltとは

  • ハッシュ化したい文字列に何かしらの文字列を加えて文字列を加えてより複雑なハッシュ値を作る。
    例) ユーザーのID(すでにハッシュ化したものでもいい) + パスワード
    これならユーザーごとにランダムなsaltを付与できてよりセキュアになる。
  • レインボーアタックに強い
  • レインボーアタックはすでにハッシュ化したテーブルを使ってハッシュ値を予測していく手法。

さくらVPS CentOS7でシングルユーザーモードに切り替える方法

なぜシングルユーザーモードを使うのか

rootのパスを忘れてパスワード更新の必要があったから。

作業の流れ

  1. サーバーを再起動
  2. シングルユーザーモードでrootアカウントでログイン
  3. パスワード更新

苦戦したポイント

さくらvps公式ページにパスワード変更方法があるがシングルユーザーモードに切り替える画面が表示されず、シングルユーザーモードにできなかった。

さくらvps公式

解決策

  1. VNCコンソールとシリアルコンソールを開く。
  2. VNCコンソールでCtrl + Alt + Delボタンを押して再起動
  3. すぐにシリアルコンソールでEキー連打

VNSコンソールではbootしてすぐにサーバーに繋がる訳ではないみたいなので切り替えができない。 シリアルコンソールはbootしてすぐにサーバーに繋がるが、表示がされないのでEキー連打する。

パスワード変更に関してはこちらを参考にしてください。

shimi-dai.com