Laravelをスーパー雑に理解するためのメモ その1

間違ってたらスマン

## Laravel is 何？

LaravelはMVCモデルを用いたうぇぶアプリ開発用のフレームワーク

つまり、Laravelを使ってWebアプリを開発すると、全体のおおまかな部分がフレームワークとして完成してるから、ちょっと頑張るとWebアプリが作れるというわけです。
難しかったけどな！！！！

### じゃあ、MVCモデル is 何？

MVCモデルは、プログラムの役割後ごとにModel, View, Controllerに分割してコーディングしようねというモデル。

#### Modelの役割

システムのビジネスロジックを担当する。300倍くらいわかりやすくすると、実際にデータの処理を行う(ex. データベースの設計とか接続とか？)を行うイメージ。

#### Viewの役割

表示や入出力の処理を担当する。これはイメージしやすいところで、Modelの状態を表示する、実際にページを表示する部分(ex. htmlファイル、LaravelだとBlade)

#### Controllerの役割

ユーザーの入力に基づきModelとViewの制御を担当する。2倍くらいわかりやすくすると、ModelとViewに処理をお願いする(ex. 入力したデータをデータベースに保存する、データベースからデータを取得する)

MVCモデルを使う利点は、

- 機能ごとに分割できることで、分担作業がしやすい
- それぞれが独立しているので、変更や修正が簡単になる
- 他のプログラムへの影響が少なくなる

などなど。いろいろと嬉しいことがあるわけです。

## LaravelのFrontend

ここからはほとんど、[Blade Templates - Laravel(https://laravel.com/docs/7.x/blade)](https://laravel.com/docs/7.x/blade)を雑な日本語にしたものです。

### Introduction

> \# Introduction
> Blade is the simple, yet powerful templating engine provided with Laravel. Unlike other popular PHP templating engines, Blade does not restrict you from using plain PHP code in your views. In fact, all Blade views are compiled into plain PHP code and cached until they are modified, meaning Blade adds essentially zero overhead to your application. Blade view files use the .blade.php file extension and are typically stored in the resources/views directory.

BladeはLaravelで提供されているシンプルでパワフルなテンプレートエンジンです。他の一般的なPHPテンプレートエンジンとは異なり、BladeはViewに素のPHPコードを使用することを制限しません。実際、すべてのBlade Viewは素のPHPコードにコンパイルされ、変更されるまでキャッシュされます。BladeのViewファイルは .blade.php という拡張子を使用しており、通常は resources/views ディレクトリに格納されています。

LaravelのViewでは純粋なhtmlファイルとjsではなく、Bladeを使うことで中にPHPコードが書けるようですね。そうするとどうやら嬉しいらしい。続きを読んでみましょ。

### Template Inheritance(テンプレート継承)
#### Defining A Layout(レイアウトの定義)

> \# Defining A Layout
> Two of the primary benefits of using Blade are template inheritance and sections. To get started, let's take a look at a simple example. First, we will examine a "master" page layout. Since most web applications maintain the same general layout across various pages, it's convenient to define this layout as a single Blade view:

Blade を使用する主な利点の 2 つは、テンプレートの継承とセクションです。まずは、簡単な例を見てみましょう。まず、「master」ページのレイアウトを見てみましょう。ほとんどのWebアプリケーションは、さまざまなページにわたって同じ一般的なレイアウトを維持しているので、このレイアウトを単一のBladeビューとして定義すると便利です。

```php
<!-- Stored in resources/views/layouts/app.blade.php -->

<html>
    <head>
        <title>App Name - @yield('title')</title>
    </head>
    <body>
        @section('sidebar')
            This is the master sidebar.
        @show

        <div class="container">
            @yield('content')
        </div>
    </body>
</html>
```

> As you can see, this file contains typical HTML mark-up. However, take note of the @section and @yield directives. The @section directive, as the name implies, defines a section of content, while the @yield directive is used to display the contents of a given section.

> Now that we have defined a layout for our application, let's define a child page that inherits the layout.

ご覧のように、このファイルには典型的な HTML マークアップが含まれています。しかし、@section ディレクティブと @yield ディレクティブに注意してください。section ディレクティブはその名が示すように、コンテンツのセクションを定義し、一方 @yield ディレクティブは与えられたセクションの内容を表示するために使われます。
アプリケーションのレイアウトを定義したので、レイアウトを継承する子ページを定義してみましょう。

ということで、 `@section`と`@yield`を用いることで、Layoutを定義してヘッダーとかフッターとかを1つのファイルで共通化して使えるわけですね。(ガバガバ日本語)

#### Extending A Layout(レイアウトの拡張)

> When defining a child view, use the Blade @extends directive to specify which layout the child view should "inherit". Views which extend a Blade layout may inject content into the layout's sections using @section directives. Remember, as seen in the example above, the contents of these sections will be displayed in the layout using @yield:

子ビューを定義する際には、Blade の @extends ディレクティブを使用して、子ビューがどのレイアウトを「継承」するかを指定します。Blade レイアウトを拡張するビューは、@section ディレクティブを使ってレイアウトのセクションにコンテンツを注入することができます。上の例のように、これらのセクションの内容は @yield を使ってレイアウトに表示されることを覚えておいてください。

```php
<!-- Stored in resources/views/child.blade.php -->

@extends('layouts.app')

@section('title', 'Page Title')

@section('sidebar')
    @parent

    <p>This is appended to the master sidebar.</p>
@endsection

@section('content')
    <p>This is my body content.</p>
@endsection
```

> In this example, the sidebar section is utilizing the @parent directive to append (rather than overwriting) content to the layout's sidebar. The @parent directive will be replaced by the content of the layout when the view is rendered.

この例では、サイドバーセクションはレイアウトのサイドバーにコンテンツを追加（上書きではなく）するために @parent ディレクティブを利用しています。parent ディレクティブは、ビューがレンダリングされたときにレイアウトの内容に置き換えられます。

> The @yield directive also accepts a default value as its second parameter. This value will be rendered if the section being yielded is undefined:

yield ディレクティブは、2 番目のパラメータとしてデフォルト値も受け付けます。この値は、生成されるセクションが未定義の場合にレンダリングされます。

```php
@yield('content', View::make('view.name'))
```

> Blade views may be returned from routes using the global view helper:

グローバルビューヘルパーを使用して、ルートからブレードビューを返すことができます。

```php
Route::get('blade', function () {
    return view('child');
});
```

### なるほどわからん。

え？読んだだけで理解できた？？？？
だとしたら、プログラミングの天才、晴れてつよつよの仲間入りです。

私はよわよわなので意味がわかりません。というわけでここまでの内容をわかりやすく書くよ。

まず、LaravelのView作成にはBladeというテンプレートエンジンを使います。メリットとして、Viewの中にPHPが直接書けるというのがあります。実際これがメリットなのかどうかは開発をしてみないとわからないわけですが、まぁ魅力的なわけです。嬉しい。

そして、その中にディレクティブと呼ばれる機能があります。コードで例を示すと、上に出てきた`@extends`, `@section`, `@yield`ですね。これで何をしてるかというと、親ビューと子ビューというものを作って活用しているわけです。

各ページで共通して使っているレイアウトがあるが、異なる部分を修正したり継ぎ足しして、1つずつページを作るというのは想像以上に大変です。
そこで、共通のレイアウトを**親ビュー**、各ページで異なる部分を**子ビュー**として作成すれば簡単じゃね？と考えたわけです(作った人がね)

スーパー雑にやり方を説明すると、

- 子ビューで`@extends`を使って、「今からこの親ビューを使うで！」と宣言します。
- 子ビューで`@section`を使って、各ページで異なる部分(固有のパーツ)を定義します。
- 親ビューでは、子ビューの固有パーツをどこで使いたいのかを`@yield`を使って指定します。

とまぁ、こんな感じです。2%くらい理解できたらもう一度上の公式ドキュメントを読んで開発して完全理解しちゃいましょう。

### Displaying Data

> \# Displaying Data
> You may display data passed to your Blade views by wrapping the variable in curly braces. For example, given the following route:

Blade ビューに渡されたデータは、変数を中括弧で囲むことで表示することができます。例えば、次のようなルートを指定したとします。

```php
Route::get('greeting', function () {
    return view('welcome', ['name' => 'Samantha']);
});
```

> You may display the contents of the name variable like so:

このように変数の内容を表示することができます。

```
Hello, {{ $name }}.
```

> You are not limited to displaying the contents of the variables passed to the view. You may also echo the results of any PHP function. In fact, you can put any PHP code you wish inside of a Blade echo statement:

ビューに渡された変数の内容を表示することに限定されません。任意の PHP 関数の結果を echo することもできます。実際には、Blade の echo 文の中に任意の PHP コードを記述することができます。

```
The current UNIX timestamp is {{ time() }}.
```

#### Displaying Unescaped Data

> By default, Blade {{ }} statements are automatically sent through PHP's htmlspecialchars function to prevent XSS attacks. If you do not want your data to be escaped, you may use the following syntax:

デフォルトでは、Blade {{ }}文は、XSS攻撃を防ぐためにPHPのhtmlspecialchars関数を介して自動的に送信されます。データをエスケープしたくない場合は、以下の構文を使用します。

```
Hello, {!! $name !!}.
```

> ! Be very careful when echoing content that is supplied by users of your application. Always use the escaped, double curly brace syntax to prevent XSS attacks when displaying user supplied data.

【注意】アプリケーションのユーザから提供されたコンテンツをエコー処理する際には、非常に注意が必要です。ユーザから提供されたデータを表示する際には、常にエスケープされた二重中括弧構文を使用して、XSS 攻撃を防ぎます。

#### Rendering JSON

> Sometimes you may pass an array to your view with the intention of rendering it as JSON in order to initialize a JavaScript variable. For example:

JavaScript の変数を初期化するために JSON でレンダリングするために、配列をビューに渡すこともあります。例えば、次のようになります。

```html
<script>
    var app = <?php echo json_encode($array); ?>;
</script>
```

> However, instead of manually calling json_encode, you may use the @json Blade directive. The @json directive accepts the same arguments as PHP's json_encode function:

しかし、手動で json_encode を呼び出す代わりに @json Blade ディレクティブを使うことができます。json ディレクティブは PHP の json_encode 関数と同じ引数を受け取ります。

```html
<script>
    var app = @json($array);

    var app = @json($array, JSON_PRETTY_PRINT);
</script>
```

> ! You should only use the @json directive to render existing variables as JSON. The Blade templating is based on regular expressions and attempts to pass a complex expression to the directive may cause unexpected failures.

【注意】しかし、手動で json_encode を呼び出す代わりに @json Blade ディレクティブを使うことができます。json ディレクティブは PHP の json_encode 関数と同じ引数を受け取ります。

#### HTML Entity Encoding

> By default, Blade (and the Laravel e helper) will double encode HTML entities. If you would like to disable double encoding, call the Blade::withoutDoubleEncoding method from the boot method of your AppServiceProvider:

デフォルトでは、Blade（とLaravelのeヘルパー）はHTMLエンティティをダブルエンコードします。ダブルエンコーディングを無効にしたい場合は、AppServiceProviderのbootメソッドからBlade::withoutDoubleEncodingメソッドを呼び出します。

```php
<?php

namespace App\Providers;

use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Blade::withoutDoubleEncoding();
    }
}
```



## 参考文献

- [MVCモデルについて(https://qiita.com/s_emoto/items/975cc38a3e0de462966a)](https://qiita.com/s_emoto/items/975cc38a3e0de462966a)
- [Laravel - Wikipedia(https://ja.wikipedia.org/wiki/Laravel)](https://ja.wikipedia.org/wiki/Laravel)
- [Blade Templates - Laravel(https://laravel.com/docs/7.x/blade)](https://laravel.com/docs/7.x/blade)
- [【Laravel入門】ビューとBladeの継承(https://qiita.com/yukibe/items/86ccd3f72ecf943825a6)](https://qiita.com/yukibe/items/86ccd3f72ecf943825a6)