20210113のlaravelに関する記事は13件です。

Laravelで手軽にログイン認証機能を実装する

【前提条件】
Lamp環境が正常にインストール出来ている。
Node.jsのインストールが出来ている。
データ・ベースの設定が出来ている。
artisanコマンドがある程度扱える。

Node.jsがインストール出来ていない方は@seiba様の記事を参照して下さい
【引用リンク】
https://qiita.com/seibe/items/36cef7df85fe2cefa3ea

1、バージョンを確認する

まずはLaravelのバージョンを確認しましょう、以下のコマンドを入力して下さい。

php artisan --version

Laravelのバージョンが6系か7系かを確認します。

2、Laravel/uiをインストールする。

6系の場合は以下のコマンドでインストール

composer require laravel/ui:^1.0 --dev

7系の場合は以下のコマンドでインストール

composer require laravel/ui:^2.4

3、認証機能を実装する

6系、7系共通で以下のコマンドを入力してログイン機能を実装する

php artisan ui vue --auth

この時点ではログイン機能は完成していません、この時点でREGISTER場面を
見てみると………フロントエンド部分が実装されていません。
authtest.png

4、フロントエンド部分を実装する〜完成

npmをインストールする

npm install

npmをビルドする

npm run dev

最期に忘れずにmigrationコマンドででログイン情報を格納するテーブルを作成する。

php artisan migration

完成です
Laravelを立ち上げてみて右端のRegisterをクリックしてみる
authtest1.png
すると先程は実装されていなかったフロントエンド部分の実装がなされている。
authtest2.png
実際に登録してみる
authtest3.png

実際にログインに成功するとログイン後のページに遷移できる。
authtest4.png

番外編:どのようにデータが格納されているか

実際にパスワードが格納されているテーブルを見てみるとパスワードが暗号化されて格納されており、手軽に実装出来てかなり高度な認証機能である事がわかる。

|  1 | ララベルユーザー       | laravel@gmail.com | NULL |
 $2y$10$KPPRJJH0fOYl1JocEdQscu3NNl5BrJU.MpEu4AY1I2ye6F5z18Zsq | NULL           | 2021-01-13 12:40:02 | 2021-01-13 12:40:02 |
+----+--------------------+-------------------+-------------------+--------------------------------------------------------------+----------------+---------------------+---------------------+

参考サイト
【公式版】Laravel公式チュートリアル日本語訳
https://readouble.com/laravel/7.x/ja/authentication.html

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker x Laravel 脅威の1ファイル!最小構成でローカル開発環境を構築する

docker-compose.yml の1ファイル、ウェブサーバーコンテナ、データベースサーバーコンテナなしで作成する最小構成のDocker Laravel開発環境です。

環境

  • PHP: 7.4
  • Composer: 2.0
  • Docker: 20.10.2
  • Docker Compose: 1.27.4

docker-compose.yml 1ファイルのみ

docker-compose.yml

docker-compose.yml
version: "3.8"
services:
  composer:
    image: composer:2.0
    volumes:
      - ./backend:/work/backend
    working_dir: /work/backend

  app:
    image: php:7.4-cli-buster
    ports:
      - 8000:8000
    volumes:
      - ./backend:/work/backend
    working_dir: /work/backend
    command: php artisan serve --host=0.0.0.0

使い方

Laravelプロジェクトの作成

$ docker-compose run composer create-project --prefer-dist laravel/laravel .

# Laravelバージョン指定
$ docker-compose run composer create-project --prefer-dist "laravel/laravel=6.*" .

Laravelビルトインサーバーの起動

$ docker-compose up -d app

http://localhost:8000

こだわったポイント

Dockerfileのビルドが必要ないこと。
もはやカップ麺を作るより速く、お湯を沸かす時間だけで作れてしまうほどシンプルな構成です。

作った理由

Dockerfileのビルドの時間がかかるから。
Laravelのお試し環境を作るのに最強の構成を作るまででもないなという時。

GitHub

オススメの記事

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】コントローラーとは?作成や編集方法を実例で解説。

Laravelのコントローラーについて。実際にコントローラーを作成してブラウザに表示させることで理解を深める。

目次

  1. コントローラーとは?
  2. コントローラーの作成方法
  3. コントローラーの保存場所
  4. コントローラーの中身
  5. コントローラーの作成例
  6. コントローラー呼び出し時の注意点
  7. コントローラーでviewファイルを呼び出す


コントローラーとは?

Laravelのコントローラーでは、クラスを作成しメソッドを定義することができる。

ルーティングファイル(web.php)などにメソッドを記述していくとファイル長が膨大になってしまうため、コントローラーを使用することで、メソッドを利用しやすくなる。

コントローラーの作成方法

$ php artisan make:controller コントローラー名

コントローラー名は冒頭大文字のキャメル表記。

$ php artisan make:controller HelloController

Controller created successfully.


コントローラーの保存場所

artisanコマンドを実行すると、app/Http/Controllers内に新たにファイルが生成される。

image.png

image.png

専用のディレクトリの中に入れたい場合

コントローラー名の前にディレクトリ名を付ければOK。

例: php artisan make:controller Test/HelloController

image.png


コントローラーの中身

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloController extends Controller
{
    //
}

namespace App\Http\Controllers;
名前空間。

app/Http/Controllers配下にファイルがあるため、そのまま名前空間として指定。

名前空間をつけることで、同じメソッド名でも名前空間が異なればそれぞれ別のメソッドとして使うことができる。

use 名前空間
指定した名前空間をインポート。

use Illuminate\Http\Request;
LaravelのAPIである、名前空間Illuminate\Http\Requestをインポートしている。
これで、Request.phpに定義されているメソッドが使えるようになる。

▼Illuminate\Http\Requestの場所
vender > laravel > framework > src > Illuminate > Http > Request

Requestメソッド一覧



class HelloController extends Controller
定義したクラス名HelloControllerに、親クラスとして、Controllerクラスを継承している。

Controllerクラスには、validate()middleware()など便利なメソッドが定義されている。

{ // }
ここに、メソッドを記述していく。


コントローラーの作成例

step1. メソッドを定義

//の中に以下を追記

public function message(){
        $msg = 'こんにちは';
        return $msg;
    }

messageメソッドを呼び出すと、「こんにちは」を返す。

HelloController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloController extends Controller
{
    public function message(){
        $msg = 'こんにちは';
        return $msg;
    }
}


step2. ルーティングで呼び出す

web.php
Route::get('msg', 'App\Http\Controllers\HelloController@message');

URIがmsgにアクセスしたら、HelloControllerのmessageメソッドを実行する。

以上で完了。



▼ブラウザの表示

image.png


コントローラー指定時の注意点

Laravel7までは、App\Http\Controllers\が省略できたが、Laravel8からは省略するとエラーが表示されるようになった。

対策として完全な名前空間で指定した。

他にも、Laravel7の環境と同じにする方法や、アクション構文を使用する方法がある。


Laravel7と同じ環境にする

以下ファイルのコメントアウトを解除する。
app > Providers > RouteServiceProvider.php

image.png

解除するコメントアウト
//protected $namespace = 'App\\Http\\Controllers';
RouteServiceProvider.php
    protected $namespace = 'App\\Http\\Controllers';  //コメントアウトを解除

    /**
     * Define your route model bindings, pattern filters, etc.
     *
     * @return void
     */
    public function boot()
    {
        $this->configureRateLimiting();

        $this->routes(function () {
            Route::prefix('api')
                ->middleware('api')
                ->namespace($this->namespace)
                ->group(base_path('routes/api.php'));

            Route::middleware('web')
                ->namespace($this->namespace)
                ->group(base_path('routes/web.php'));
        });
    }



ルーティングのコントローラー名を簡略化して完了。

web.php
Route::get('msg', 'HelloController@message');


アクション構文を使用する

ルーティングファイルの冒頭で、useを使ってHelloControllerクラスをインポートする。

use App\Http\Controllers\HelloController;

getメソッドの第二引数で以下を指定。
[コントローラー名::class, 'メソッド名']

web.php
use Illuminate\Support\Facades\Route;  //デフォルトで記述
use App\Http\Controllers\HelloController; //追記

Route::get('msg', [HelloController::class, 'message']);


コントローラーでviewファイルを呼び出す

コントローラーのメソッドが呼び出されると、viewファイルを描画するプログラムを作成する。

step1. コントローラーの作成

HelloController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;

class HelloController extends Controller
{
    public function message(){
        $msg = 'こんにちは';
        $title = 'this is title!';

        return view('child', ['hello'=>$msg, 'title'=>$title]);
    }
}

HelloControllerのmessageメソッドを実行すると、child.blade.phpを表示する。

その際、helloという変数で$msgを、titleという変数で$titleを渡す。


step2. viewファイルの作成

ここでは、child.blade.phpと、レイアウトとなるapp.blade.phpを作成する。

image.png

app.blade.php
<html>
    <head>
        <title>@yield('title')</title>
    </head>
    <body>
        <div class="container">
            @yield('content')
        </div>
    </body>
</html>

親ビューとなるapp.blade.phpを作成。
@yieldで子ビューのセクションを呼び出している。


child.blade.php
@extends('layouts.app')

@section('title', $title)

@section('content')
    <p>{{ $hello }}</p>
@stop

@extendsで親ビューを継承。
@sectionでコントローラーから渡された変数を使用。


step3. ルーティングの作成

パス「xxx」にアクセスすると、HelloControllerのmessageメソッドを実行するようにルーティングファイルに記述。

web.php
Route::get('xxx', 'HelloController@message');

以上で完了。

>section, yield, extendの詳細はこちらを参照



▼ブラウザの表示

image.png

ページタイトルと、ページの内容に、コントローラーで定義した変数が表示されている。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】Illuminateとは何か?ファイルはどこにあるのか?

Laravelでコントローラーを作成した場合などに、use Illuminate\Http\Request;といった記述がある。

これは名前空間のIlluminate\Http\Requestをインポートしているということだが、そもそもIlluminateとはどこにあり、何なのか?

Illuminateはどこにあるのか?

Illuminateは、laravelでプロジェクトを作成した時に自動生成される、vendorディレクトリ配下に存在する。

vender > laravel > framework > src > Illuminate

image.png

vendorディレクトリはcomposerと依存関係にある。

Illuminateとは?

IlluminateはLaravelのコンポーネントが入っている。
Illuminate\Http\Requestクラスの、hasメソッドのように、各クラスとメソッドが定義されている。

Laravelでデフォルトで使えるありがたいメソッドがたくさんあるのは理解できたが、その名前とマッチしなさすぎる、、

IlluminateはLaravel4のコードネームだそうで、このタイミングでcomposerを通じてframeworkをインストールするように認め、それを記念して(?)Illuminateというフォルダに格納されているらしい。(歴史を知らない人にはとにかくわかりにくい!!)

まぁ、Laravelの大事なコンポーネントが置いてある場所ということ。


・参考
Illuminateメソッド一覧

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

docker+laravelでGeneral error: 1812 が発生

初めに

docker + laravelを使って、なんかプログラムを作ろうと
migrateを行った際に

$ docker exec -it docker-sample_php-fpm_1 bash
root@39aae0ad8da6:/var/www/html# php artisan migrate

   Illuminate\Database\QueryException 

  SQLSTATE[HY000]: General error: 1812 Tablespace is missing for table `laravel`.`migrations`. (SQL: select `migration` from `migrations` order by `batch` asc, `migration` asc)

  at vendor/laravel/framework/src/Illuminate/Database/Connection.php:671
    667|         // If an exception occurs when attempting to run a query, we'll format the error
    668|         // message to include the bindings with SQL, which will make this exception a
    669|         // lot more helpful to the developer instead of just the database's errors.
    670|         catch (Exception $e) {
  > 671|             throw new QueryException(
    672|                 $query, $this->prepareBindings($bindings), $e
    673|             );
    674|         }
    675| 

      +27 vendor frames 
  28  artisan:37
      Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) 

が発生した。
備忘録として、メモしておく

何が起こったか?

出ているエラーをよくみてみると

Tablespace is missing for table `laravel`.`migrations`

と出ている。
dokcerのmysqlのコンテナーにログインして、テーブルを確認すると

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| laravel            |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)

mysql> use laravel;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+-------------------+
| Tables_in_laravel |
+-------------------+
| failed_jobs       |
| migrations        |
| password_resets   |
| tasks             |
| users             |
+-------------------+
5 rows in set (0.00 sec)

migrationsテーブルは存在する。
migrationsテーブルの中身を見てみる。

mysql> select * from migrations;
ERROR 1812 (HY000): Tablespace is missing for table `laravel`.`migrations`.

エラーが出てくる。

解決

色々と調べてみたが、いかが手っ取り早そう

mysql> drop table migrations;
Query OK, 0 rows affected (0.02 sec)

他のテーブルでもmigrateが詰まったら
drop table tbl_name

を実行すれば良さそう。

それでは素敵なdocker lifeを

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

curl error 60を解決した

エラーが出ていた元のコード

//$postと$headersについては省略
$ch = curl_init('URL');
        $options = [
            CURLOPT_CUSTOMREQUEST => 'POST',
            CURLOPT_HTTPHEADER => $headers,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_BINARYTRANSFER => true,
            CURLOPT_HEADER => true,
            CURLOPT_POSTFIELDS => $post,
        ];
        curl_setopt_array($ch, $options);

        $result = curl_exec($ch);

エラーが出なくなったコード

$ch = curl_init('URL');
        $options = [
            CURLOPT_CUSTOMREQUEST => 'POST',
            CURLOPT_HTTPHEADER => $headers,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_BINARYTRANSFER => true,
            CURLOPT_HEADER => true,
            CURLOPT_POSTFIELDS => $post,
            CURLOPT_SSL_VERIFYPEER => false,  //追加
            CURLOPT_VERBOSE => true,          //追加
        ];
        curl_setopt_array($ch, $options);

        $result = curl_exec($ch);

参考(こちらのラインプッシュを試した際に出くわしたエラーです):https://imoni.net/tips/00xx/0012.html

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】ディレクトリ構造の理解。どれが使うディレクトリ?各ディレクトリの意味。

Laravelでプロジェクトを作成すると自動で複数のディレクトリ とファイルが作成される。

いじる必要のないディレクトリを知るなど理解を深める。

image.png

よく触るディレクトリ

  • app   (コントローラーがある)
  • config   (環境設定)
  • database  (マイグレーションファイル)
  • public   (画像やファビコンなど)
  • resources (ビュー)
  • routes  (ルーティング)


あまり触らないディレクトリ

  • bootstrap (フレームワークの自動処理) 
  • storage  (コンパイル後のファイル)
  • tests   (テスト用)
  • vender  (composerの依存ファイル)

最初から存在するか、コマンドやコンパイルで自動生成されるファイルが入る。


appディレクトリ

artisanコマンドによって生成されたディレクトリが配置される。

ほぼすべてのクラスがこの中にある。

image.png

make artisanコマンドを実行するとファイルがここに作成される。(make:jobでjobクラスが生成される)

Consoleディレクトリ
make:commandで作成した、カスタムのartisanコマンドが保存される。

Exceptionsディレクトリ
例外処理を記述したファイルを保存する。

例外処理のログやレンダリングを変更する場合は、Handlerクラスを変更する。

Httpディレクトリ
コントローラー、ミドルウェア、リクエストが保存される。

Providersディレクトリ
リクエストに対する対応方法を記載したファイルが保存されている。

デフォルトで必要なファイルが保存されている。必要に応じて追加可能。

Modelsディレクトリ
データベースを操作するためのeloquent modelクラスが保存されている。

DBの各テーブルに対応するモデルがあり、クエリを投げてDB操作ができるようになる。

Broadcastingディレクトリ
make:channelコマンドで生成したクラスが保存される。
デフォルトでは存在せず、コマンド実行時に生成される。

Eventsディレクトリ
event:generatedmake:eventコマンドで生成したイベントクラスが保存される。
デフォルトでは存在せず、コマンド実行時に生成される。

Mailディレクトリ
make:mailコマンドで生成したクラスが保存される。
デフォルトでは存在せず、コマンド実行時に生成される。

Mailオブジェクトには、Mail::sendメソッドで実行するロジックが保存されている。


bootstrapディレクトリ

基本触らないディレクトリ。

image.png

app.phpはフレームワークの自動処理を行うためのファイル。
また、ページ表示の最適化のためのcacheもここに保存される。


configディレクトリ

すべての環境設定ファイルがあるディレクトリ。

image.png

▼例:database.php
DBに何を使うかを指定できる。


databaseディレクトリ

DBを構築するための、マイグレーションファイルなどが設置される。

image.png

DBにSQLiteを使う場合は、DBとしても使える。


Publicディレクトリ

ここのindex.phpはすべてのリクエストのエントリーポイントとなる。

image.png

また、クローラに指示を出すrobots.txtや、ファビコンもこのディレクトリにある。

イメージもこのPublicディレクトリ内に保存する。(フォルダ名はimgやimagesが一般的)


Resourcesディレクトリ

公開用のビュー(.blade.php)やリソースがあるファイル。

image.png

言語ファイルやcss, jsなどのコンパイル前のリソースもここに入る。


Routesディレクトリ

ルートを定義したファイルが保存されている。

image.png

web.php
基本的にほぼすべてのルーティングをここに記載する。

セッション情報を保存しない、statelessやRESTfull APIの場合は除く。


Storageディレクトリ

コンパイル後のブレードテンプレート、
ログやセッション関連ファイル、キャッシュファイルなどが保存される。

image.png

appディレクトリ
アプリによって生成されたファイルなどが保存される。

framework
キャッシュなどが保存される。

logs
ログファイルが保存される。


testsディレクトリ

テスト用のファイルが保存されている。

image.png

php artisan testでテストを実行できる。


vendorディレクトリ

composerの依存ファイルが保存されている。
基本いじらない。

image.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelでサイトマップを分割する

Laravelium/laravel-sitemapを使う

インストール方法は以下
https://github.com/Laravelium/laravel-sitemap

サイトマップを分割する

サイトマップに関する設定はconfig/sitemap.phpでもできる。
今回は個別に設定するのでコンフィグファイルはいじらない。

use_limit_sizeはfalseのままにする。trueにするとURLが全件出力されないし、ファイル分割もされない。

public static function toXml($data){
  $sitemap = \App::make('sitemap');
  $sitemap->model->setMaxSize(1000); // 1xmlあたりのURL数
  foreach ($data as $d) {
    $sitemap->add(
      $d->url,
      $d->last_modified
      $d->priority,
      $d->frequency,
    );
  }
  $sitemap->store('xml', 'sample_sitemap', '/tmp');
  //** 出力結果例 **//
  // sample_sitemap.xml <= サイトマップインデックス
  // sample_sitemap_0.xml
  // sample_sitemap_1.xml
}

設定するだけで分割されるので便利。
しかもサイトマップ(子)をまとめるサイトマップインデックス(親)も作成してくれるので、ファイル数が多くなってもサイトマップインデックス(親)だけSearch Consoleに登録すれば良い。便利。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel AdminLTE】URLが前方一致する場合、left sidebarがactiveになるようにする

手順

  1. ViewComposerを導入する
  2. 「adminlte::partials.sidebar.menu-item」で使用するviewcomposer「SidebarMenuItemComposer」を作成する
  3. $item['class']に「active」が追加されるようにする
  4. 「SidebarMenuItemComposer」を「adminlte::partials.sidebar.menu-item」に関連付ける

以下コード

/app/Http/ViewComposers/SidebarMenuItemComposer.php
<?php

namespace App\Http\ViewComposers\User\Worker;

use Auth;
use Illuminate\View\View;

/**
 * Class ModalSearchCemeteryComposer
 * @package App\Http\ViewComposers\User\Worker
 */
class SidebarMenuItemComposer
{
    /**
     * @param View $view
     */
    public function compose(View $view)
    {
        // 現在のページに応じて左メニューをactiveにする
        $path = request()->path();
        $host = request()->getHttpHost();
        $http = $this->isSsl() ? 'https' : 'http';

        $item = $view->getData('item'); 
        $pattern = str_replace($http.'://'.$host.'/', '', $item['item']['href']);
        if (!$item['item']['active'] && ($pattern === $path || strpos($path, $pattern.'/') === 0)) {
            $item['item']['class'] .= ' active ';
        }
        $view->with(['item' => $item['item']]);
    }

    //Webサーバー毎にキーと値で判別
    private function isSsl()
    {
        if (isset($_SERVER['HTTPS']) === true ) // Apache
        {
            return ($_SERVER['HTTPS'] === 'on' or $_SERVER['HTTPS'] === '1' );
        }
        elseif (isset($_SERVER['SSL']) === true ) // IIS
        {
            return ($_SERVER['SSL'] === 'on' );
        }
        elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) === true ) // Reverse proxy
        {
            return (strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https' );
        }
        elseif (isset($_SERVER['HTTP_X_FORWARDED_PORT']) === true ) // Reverse proxy
        {
            return ($_SERVER['HTTP_X_FORWARDED_PORT'] === '443' );
        }
        elseif (isset($_SERVER['SERVER_PORT']) === true )
        {
            return ($_SERVER['SERVER_PORT'] === '443' );
        }

        return false;
    }
}
/app/Providers/ViewComposerServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use View;

class ViewComposerServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        View::composers([
            \App\Http\ViewComposers\User\Worker\SidebarMenuItemComposer::class => 'adminlte::partials.sidebar.menu-item',
        ]);
    }
}

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel で画像サイトマップを作る

Laravelium/laravel-sitemapを使う

インストール方法は以下
https://github.com/Laravelium/laravel-sitemap

サンプル

add関数の第5引数が画像サイトマップ用の値。
公式には見当たらなかったのでメモ。

public function toXmlFile(){
  $sitemap = \App::make('sitemap');
  $sitemap->add(
    "http://sample.com/spot/1",  // page url
    "2021-01-12T00:00:00+00:00", // last modified
    0.6,                         // priority
    "yearly",                    // frequency
    [                            // 画像サイトマップの設定
      [
       'url' => "http://sample.com/spot/1.jpg",
       'title' => "サンプルタイトル",
       'caption' => "このサンプルは日本語",
       'geo_location' => "東京都、新宿区",
       'license' => "http://sample.com"
      ]
    ]
  );
}

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】ブレードテンプレートとは?

個人用メモです。
https://laravel.com/docs/8.x/blade

目次

  1. ブレードとは?
  2. ブレードテンプレートの保存場所
  3. ブレードテンプレートの呼び出し
  4. @ブレードディレクティブ
    1. @jsonディレクティブ
    2. @@ブレードディレクティブのエスケープ
    3. @includeディレクティブ
    4. @includeifディレクティブ


ブレードとは?

Laravelで使用しているテンプレートエンジン

テンプレートエンジンとは、HTMLとデータ(PHPやJSなど)を組み合わせて出力ようのHTMLファイルを作成するライブラリのこと。

ブレードは.blade.phpという拡張子のファイルで、HTMLとPHPを合わせて記述することができる。

このファイルをブレードテンプレートと呼ぶ。



▼ブレードテンプレートの例
HTMLの中でif文を使うなど。

.blade.php
<div>
 <table>
  @if ($table->getColgroup())
  <colgroup>
    @if ($table->getColgroup())
      @foreach ($table->getColgroup()->getCols() as $col)
        <col width="{{ $col->getWidth() ?: 'auto'}}">
      @endforeach
    @endif
  </colgroup>
  @endif
 </table>
</div>

divタグやtableタグと、@if@foreachなどphpのコードが混ざっている。


ブレードテンプレートの保存場所

resources/views配下に保存する。

image.png

image.png
viewsフォルダの中に、.blade.phpファイルが格納されている。


ブレードテンプレートの呼び出し

グローバルに定義されているviewヘルパーで呼び出す。

view('ブレードテンプレート名', ['変数名' => '値'])
 ┗ 第2引数で指定した変数に値を代入して渡す

▼viewヘルパーの使用例

Route::get('/', function () {
    return view('greeting', ['name' => 'James']);
});

Routeファサードのgetメソッドで/のパスにアクセスした場合に、greeting.blade.phpを返す。

その際、値Jamesを格納した変数nameを渡す。この文法をブレードシンタックスと呼ぶ。



▼対象のブレード例

greeting.blade.php
Hello, {{ $name }}.

「Hello, James.」が表示される。

・{{ }}の意味

すべて文字列として出力する特殊なecho文。
XSS attack防止仕様(スクリプトを実行しない。)

・{!! !!}の意味

{{ }}と異なりエスケープせずそのまま出力する。
タグを出力したい場合など、こちらを使う。

XSS attack防止のため、ユーザーが入力した内容を出力する場合は{{ }}を使う。

・{{-- --}}の意味

コメントアウト。


@ブレードディレクティブ

ブレードテンプレート内で@をつけることで、phpの処理を実行することができる。(コードの省略表記)

@if, @for, @jsonなど多数ある。

この@をブレードディレクティブと呼ぶ。


@jsonディレクティブ

ブレードテンプレートで簡単にjson形式のデータが入ったデータの呼び出しができる。

@jsonディレクティブ
<script>
    var app = @json($array);
</script>

ディレクティブを使わない通常表記は下記。

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

@jsonディレクティブの呼び出しデータを整形する

第2引数で指定の指示(定義済み定数)を与えると、呼び出したデータを整形できる。

@json($変数名, 定義済み定数)

▼主な定義済み定数

定義済み定数 内容
JSON_PRETTY_PRINT 返される結果の書式を、スペースを使って整形
JSON_HEX_TAG すべての < および > をそれぞれ \u003C および \u003E に変換
JSON_NUMERIC_CHECK 数値形式の文字列を数値としてエンコード

定義済み定数一覧


・@@ブレードディレクティブのエスケープ

@を2つつけるとブレードディレクティブのエスケープとなる。

.blade.php
@@json

HTMLページの出力
@json


@includeディレクティブ

ブレードビュー内で別のビューを呼び出す。

<div>
    @include('shared.errors')

    <form>
        <!-- Form Contents -->
    </form>
</div>

@include('shared.errors')の部分に、shared.errors.blade.phpが表示される。

viewヘルパーと同じく、第二引数でデータを渡すことができる。

@include('view.name', ['status' => 'complete'])
 view.name.blade.phpを読み込む。その際、completeというデータを変数$statusで渡す。

※注意
存在しないビューファイルを指定した場合はエラーになる。


@includeif

存在しない可能性のあるファイルを指定する場合は、@includeifを使う。

@includeIf('view.name', ['status' => 'complete'])



ディレクティブは他にも多数あり。
詳細はlaravel公式ページにて。

https://laravel.com/docs/8.x/blade

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】ビュー、ブレードディレクティブとは?

個人メモです。

  1. View
    1. viewの事例
    2. viewの拡張子
    3. viewの呼び出し
  2. @ブレードディレクティブ
    1. @jsonディレクティブ
    2. @@ブレードディレクティブのエスケープ
    3. @includeディレクティブ
    4. @includeifディレクティブ


View

別々のファイルに記述されたHTMLを取り出し一つのページとして表示する機能。

Laravel公式 View

viewの事例

greeting.blade.php
<html>
    <body>
        <h1>Hello, {{ $name }}</h1>
    </body>
</html>

viewの拡張子

.blade.php
この拡張子のファイルをブレードテンプレートと呼ぶ。

viewの保存場所

image.png
resources/views

image.png
viewsフォルダの中に、.blade.phpファイルが格納されている。

viewファイルの呼び出し

グローバルに定義されているviewヘルパーで呼び出す。

view('ブレードテンプレート名', ['変数名' => '値'])
 ┗ 第2引数で指定した変数に値を代入して渡す

▼viewヘルパーの使用例

Route::get('/', function () {
    return view('greeting', ['name' => 'James']);
});

Routeファサードのgetメソッドで/のパスにアクセスした場合に、greeting.blade.phpを返す。

その際、値Jamesを格納した変数nameを渡す。この文法をブレードシンタックスと呼ぶ。



▼対象のブレード例

greeting.blade.php
Hello, {{ $name }}.

「Hello, James.」が表示される。

・{{ }}の意味

すべて文字列として出力する特殊なecho文。
XSS attack防止仕様(スクリプトを実行しない。)

・{!! !!}の意味

{{ }}と異なりエスケープせずそのまま出力する。
タグを出力したい場合など、こちらを使う。

XSS attack防止のため、ユーザーが入力した内容を出力する場合は{{ }}を使う。

・{{-- --}}の意味

コメントアウト。


@ブレードディレクティブ

ブレードテンプレート内で@をつけることで、phpの処理を実行することができる。(コードの省略表記)

@if, @for, @jsonなど多数ある。

この@をブレードディレクティブと呼ぶ。


@jsonディレクティブ

ブレードテンプレートで簡単にjson形式のデータが入ったデータの呼び出しができる。

@jsonディレクティブ
<script>
    var app = @json($array);
</script>

ディレクティブを使わない通常表記は下記。

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

@jsonディレクティブの呼び出しデータを整形する

第2引数で指定の指示(定義済み定数)を与えると、呼び出したデータを整形できる。

@json($変数名, 定義済み定数)

▼主な定義済み定数

定義済み定数 内容
JSON_PRETTY_PRINT 返される結果の書式を、スペースを使って整形
JSON_HEX_TAG すべての < および > をそれぞれ \u003C および \u003E に変換
JSON_NUMERIC_CHECK 数値形式の文字列を数値としてエンコード

定義済み定数一覧


・@@ブレードディレクティブのエスケープ

@を2つつけるとブレードディレクティブのエスケープとなる。

.blade.php
@@json

HTMLページの出力
@json


@includeディレクティブ

ブレードビュー内で別のビューを呼び出す。

<div>
    @include('shared.errors')

    <form>
        <!-- Form Contents -->
    </form>
</div>

@include('shared.errors')の部分に、shared.errors.blade.phpが表示される。

viewヘルパーと同じく、第二引数でデータを渡すことができる。

@include('view.name', ['status' => 'complete'])
 view.name.blade.phpを読み込む。その際、completeというデータを変数$statusで渡す。

※注意
存在しないビューファイルを指定した場合はエラーになる。


@includeif

存在しない可能性のあるファイルを指定する場合は、@includeifを使う。

@includeIf('view.name', ['status' => 'complete'])



ディレクティブは他にも多数あり。
詳細はlaravel公式ページにて。

https://laravel.com/docs/8.x/views

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】@sectionとは?テンプレートの継承を実例で解説。

@section@yield@extendsと一緒に使用するディレクティブ。

子ビューで定義したデータを、親ファイルで呼び出すことができる。

目次

  1. @sectionの用途
  2. @sectionの使用手順
  3. 子ビューに@sectionでデータを定義する
  4. 親ビューにデータを受け取る場所を定義する @yield(セクション名)
  5. @extendsで親ビューを読み込む
  6. 実例


@sectionの用途

レイアウトを定義したビュー(親)に、別のビュー(子)を表示させる際に、子のビュー毎にレイアウトの一部の表示内容を変更する場合などに使用。

タイトルの出し分けもできる。


@sectionの使用手順

1. 子ビューに@sectionでデータを定義する
2. 親ビューにデータを受け取る場所を定義する @yield(セクション名)
3. @extendsで親ビューを読み込む

以上手順の処理後にページを表示する。

@yield(セクション名)以外に、@section(セクション名) ~ @showでも呼び出せる。が、コードが長い上にsectionだらけになるので基本使わない。


子ビューに@sectionでデータを定義する

データの定義方法は大きく3種類。

1. @section('セクション名', 'データ')
2. @section('セクション名') ~ @endsection
3. @section('セクション名') ~ @stop


1. @section('セクション名', 'データ')

データ量が少ない場合は、第2引数にデータを定義する。

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

titleというセクション名を呼び出すと、「Page Title」が表示される。


2. @section('セクション名')@endsection

データ量が多い場合は、@section@endsectionで囲む。

@section('content')
    <p>親ビューに渡す内容</p>
@endsection


3. @section('セクション名') ~ @stop

No.2と同じ。@endsection@stopでも機能する。

@section('content')
    <p>親ビューに渡す内容</p>
@stop


親ビューにデータを受け取る場所を定義する @yield(セクション名)

子ビューで定義したデータを表示する
@yield(セクション名)



@section~@showも同じ

別の記述
@section('sidebar')
   好きなコメントを記述できる
@show

@yieldと異なり好きなコメントを記述できる。


@extendsで親ビューを読み込む

子ビューと親ビューを連携させるために、@extends('親ビュー名')で親ビューを読み込む

親ビューがviewフォルダ直下にない場合は、フォルダ名を.で繋ぐ。

▼例
以下のようにlayouts/app.blade.phpというレイアウトを呼び出したい場合は、@extends('layouts.app')とする。

image.png

view直下にあるレイアウトを呼び出したい場合は、@extends('app')のようにすればOK。


実例

▼親ビュー

レイアウトとなる親ビューを以下のようにする。

app.blade.php
<html>
    <head>
        <title>@yield('title')</title>
    </head>
    <body>
        <div class="container">
            @yield('content')
        </div>
    </body>
</html>

titleタグと、divタグの2箇所に@yieldを設置。



▼子ビュー

child.blade.php
@extends('layouts.app')

@section('title', 'sectionによるデータ受け渡しテスト')

@section('content')
    <p>親ビューに渡すデータ</p>
@stop



▼ルーティングの追加
URL「/blade」にアクセスした時に、childビューを表示するようにする。

routes/web.php
Route::get('blade', function()
{
    return view('child');
});


▼画面表示

image.png
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む