20200918のlaravelに関する記事は10件です。

[PHP]比較演算子を甘く設定して発生したエラー

現象

\$valueというレコードからschool_rankというカラム(int)を抽出して有無を判定していたところschoolランクが0の時はfalseと認識してしまうので|| $value->school_rank == 0を追加した。

 if ( $value->school_rank || $value->school_rank == 0) {
  処理
}

が、この時甘く==をつけてしまったため、今度は\$value->school_rankがnullのときは0を扱われてしまった。

 if ( $value->school_rank || $value->school_rank === 0) {
  処理
}

教科書でも書いてるように===で厳しく判定しないと思わぬバグを生むなと実感した話

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

Laravelでクエリ文字列(URLの末尾に?id=1とか付け足すやつ)を生成するには?

やりたいこと

口コミサイトを制作しています。今回は、
1. ユーザーが自分が投稿した口コミをポチッと選択すると、
2. 口コミ編集ページに飛んで、
3. その口コミのレコードをDBから呼び込んで表示し、
4. それを編集できる

という機能を実装したいです。
Laravelの某教科書を参照したところ、3,4は説明があってありがたいのですが、1,2のプロセスに関しては「/person/edit/id=番号というように、idパラメータを付けてアクセスをして下さい」と、要は「君の手でレコードのidをURLで打ってみ?表示されるべ?」で終わっていて、まさか自分のサービスを使ってくれるユーザーに直接手で/edit/id=XXとか打たせるわけにはいかないので、自分で考えて作ってみました。

私たち教わる側も、「教科書は絶対的であり、A->Zまで全てを教えてくれる!」という姿勢を改めないといけませんね。教科書も私たちに考える余白を与えてくれていると前向きに考えた方が良さそうです。

環境:Laravel 7.26.1、Eloquent ORM(DBクラスで実装している方も参考になると思います!)

やってみた

最初から解決方法を書きますが、超シンプルです。しかもこのステージまで来れた方なら既にDBのレコード(投稿内容でもユーザー名でも何かしら)をブラウザに表示することには成功していると思うので、もしそうなら本当に一瞬です。

今回は投稿を例にとって説明を続けていきます。

要は、ユーザーがある特定の投稿の編集ボタンを押したら、?id=番号のURLを生成すればいいわけです。URLにパスを渡すのはHTMLのaタグさんちのhref属性くんの仕事です。

なので、だいぶ簡易的にコードを書きますがbladeでこんな感じ↓にすればOKです。($items、`$itemは後で説明します)

index.blade.php
@foreach ($items as $item)
<div>{{$item->title}}</div>
<div>{{$item->text}}</div>
<a href="edit?id={{$item->id}}">編集する</a>
@endforeach

こんな風に、href="edit"に?id={{$item->id}}を加えるだけです。
titleとtextは投稿のタイトルと本文で、この記事にたどり着くような方だったらもう既にこのようなプログラムは書けていると想像します。
$itemは今回下記のようにコントローラ内で定義したDBのレコードが代入されています。

class ReviewController extends Controller
{
    public function index(Request $request)
    {
        $items = Review::all(); //投稿の格納されたreviewsテーブルにアクセスするReviewモデルからレコードを取得
        return view('index', ['items' => $items]); //views直下のindexファイルにitemsという名前で$itemsを渡して返す
    }

この状態でindex.blade.phpで「編集する」リンクをクリックすれば、当該レコードのidの番号を持ったクエリ文字列(edit?id=1)が生成されるはずです!

ちなみに、ルートのアドレスが気になるところですが、下記のように?id=番号的なものをつけずに'edit'のままでも、うまくページ遷移しました。

Route::get('edit', 'ReviewController@edit');

以上になります。
もしわかりづらい点、誤りなどなど、何かご指摘あれば、ぜひコメント下さい!

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

Laravelで半角英数字のみのバリデーション(簡単な方法)

Laravel6系で動作した方法

前提

  • alpha
  • alpha_num
  • alpha_dash

↑ があるが、2バイト文字が考慮されていないので、全角が通ってしまう

ざっくり理解

初期のvalidatorロジックを上書きすればOK。

STEP1. App/Validators/CustomValidatorを作成する

App/Validators/CustomValidator.php

<?php

namespace App\Validators;

use Illuminate\Validation\Validator;

class CustomValidator extends Validator
{
    /**
     * alpah
     *
     * @param string $attribute
     * @param string $value
     * @return true
     */
    public function validateAlpha($attribute, $value)
    {
        return (preg_match("/^[a-z]+$/i", $value));
    }

    /**
     * alpah_dash
     *
     * @param string $attribute
     * @param string $value
     * @return true
     */
    public function validateAlphaDash($attribute, $value)
    {
        return (preg_match("/^[a-z0-9_-]+$/i", $value));
    }

    /**
     * alpah_num
     *
     * @param string $attribute
     * @param string $value
     * @return true
     */
    public function validateAlphaNum($attribute, $value)
    {
        return (preg_match("/^[a-z0-9]+$/i", $value));
    }
}

STEP.2 どこでも使えるようにする

どこでも使えるようにAppServiceProviderで、さきほど作ったValidatorを読み込む(初期のValidatorを上書き)。

app/Providers/AppServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Validator;
use App\Validators\CustomValidator;

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

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Validator::resolver(function ($translator, $data, $rules, $messages, $attributes) {
            return new CustomValidator($translator, $data, $rules, $messages, $attributes);
        });
    }
}

STEP3.FormRequestなどで普通に使う

他のstring,integerなどと同じように

  • alpha
  • alpha_dash
  • alpha_num

が使える。
今度は全角文字でエラーがでるようになる!

public function rules()
{
    return [
        ...
       // 全角文字でエラーがでるようになる!
       'password' => 'required|alpha_dash|min:8'
    ];
}

参考

[Laravel]バリデーションalpha_num指定しても全角文字が通ってしまう問題 - Qiita

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

Laravel-AdminLTEのビューをカスタマイズする

環境

やりたいこと

app/config/adminlte.php(以降「設定ファイル」と記載)で制御できる範囲を超えてカスタマイズすることです。

たとえば、ログイン画面における「ログイン状態を保持する」チェックボックスを消したい場合です。このケースでは設定ファイルで制御することができません。

方法

以下コマンドを実行しましょう。

$ php artisan adminlte:install --only=main_views

このコマンドを実行するとresources/views/vendor/adminlte内にビューファイルが作成されます。あとはこれらを編集して各ビューで読み込ませればOKです。

補足

本パッケージREADME.mdにもこのやり方は書いてあります。ただ、Google検索経由だとphp artisan vendor:publish 〜コマンドを用いる旨のWebページがけっこうヒットして紛らわしかったのでここに書き留めておきます。まあ最初から一次ソースを見ればよかったのですが。笑

以上です。

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

Laravel id管理 パラメーターの{id}なんとなく振り当ててない?

パラメータ系の記事でよく見るこんなルーティング

Route::get('/post/{id}', 'TopController@detail');

初心者のワイ:はぁ(0_0)/
脳死状態で記述していたので意味調べました!!!!


指定されたコントローラの関数(TopController@detail)で'Request $request'でリクエスト受け取ります。

このリクエストの中に$request->idというものが生成されています。それが{id}の正体だ!!!!


仮に{id}を{sushi}に変更します

Route::get('/post/{sushi}', 'TopController@detail');

それでコントローラーでdd($request->id)で受け取れてるか確認
結果:null

dd($request->sushi)
結果:id表示

これで{id}が$request->idであるということの裏付けができましたね!!!!

これが初投稿です!
何かお役に立てれば幸いです!

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

Laravel HTMLメールで画像を埋め込む (オフライン時やセキュア対応で使う)

この時代にオンラインでない事はあまりないので、普段htmlメールは、画像はURLリンクで済ませます。
Laravel HTMLメールで画像を埋め込む必要がある時のケースでは、例えば

【想定ケース】
・オフラインでも画像を表示できるようにする。
・非公開領域に画像を入れている(完全会員サイトで画像さえも公開しない場合)

こんなケースがあります。
この場合、メールのインライン画像は、URLではNGなのです。

Laravelにはhtmlメール本文に画像を埋め込む便利な機能があります。

<body>
    ここに画像:

    <img src="{{ $message->embed($pathToImage) }}">
</body>

あらかじめ用意されている、$message->embedにファイルパスを入れればOK!
超簡単です。

参考ページ 【インライン添付】
https://readouble.com/laravel/6.x/ja/mail.html

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

【Laravel】クエリ実行前にMySQLのDBコネクションのPDOにsetAttributeする。

メモとして残します。

■やり方

下記の例では現在のDBコネクションにPDO::ATTR_EMULATE_PREPARESをtrueでセットしています。

(\DB::connection()->getPdo())->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);

■余談

laravelではPDO::ATTR_EMULATE_PREPARESはデフォルトFalseですが、
LOAD DATA LOCAL INFILEステートメントを実行するときにエラーになってしまうため、PDO::ATTR_EMULATE_PREPARESをTrueにしてやる必要があります。
しかし、configのdatabase.phpで常にtrueにするのはさすがにちょっと、、、
と、なったなっため、瞬間的にTrueにすることで解決しました。

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

Laravel8 (laravel/ui)でのLogin機能の実装方法〜MyMemo

Laravle6.x/7.x/8.xのログイン実装コマンドの違いを見る

みなさんこんにちは
ジーズアカデミー 主席講師 山崎ですm(_ _)m
今回はLaravel8にアップデートされLogin画面作成(laravel/ui)を前バージョン同様で使用したい場合
の方法をMemoしておきます(初めてLaravel触る人はこっちが良いかも、、敷居が低い)。

「jetstreamの人はこちらのリンク」
https://qiita.com/daisu_yamazaki/items/607ea579a374c4187562

前提条件/検証環境

  • LaravelでCRUDを作成した経験がある人
  • Laravelの基本を理解している人
  • 記事内容的には、Laravel6のAuthを使う場合の自分メモです。
  • Laravel6/7=PHP 7.2.x(確認した環境)
  • Laravel8 =PHP 7.3.x(確認した環境)
  • EC2の場合:t2.small (メモリ2G以上必要 "laravel/ui"に必要なため,t2.microだとコケます)
  • Node.js インストール済みであること

【 Laravel6/7/8でのログイン(laravel/ui)画面作成】

Laravel5.xでは「php artisan make:auth」コマンドで簡単にLOGIN機能を作成できていました。
※Laravel6.x以降 php artisann make:auth コマンドは無くなりました。


Laravel6 / Laravel7 / Laravel8 ログイン画面作成

1. laravel/uiをインストール

【要注意】Laravel7 が出たタイミング・・・だと思いますが、
laravel/ui コマンドにバージョンを付けないとエラーがでるようになりました!!!
6 or 7 or 8 に合わせて使い分けてください!!

ターミナル
#Laravel6.x 公式ではこちらに変わってました。
composer require laravel/ui:^1.0 --dev

#laravel7の場合
composer require laravel/ui:^2.4

#laravel8の場合
composer require laravel/ui

※Laravel6.x 公式
https://laravel.com/docs/6.x/frontend#introduction
※Laravel7.x 公式
https://laravel.com/docs/7.x/frontend#introduction
※Laravel8.x 公式(解説が無いようですが、Updating Dependenciesを参照)
https://laravel.com/docs/8.x/upgrade#updating-dependencies

2. LOGIN機能&テーブル作成

ターミナル
php artisan ui vue --auth

php artisan migrate

3. FrontEndに必要なPackageをインストール
(Node/npmの使用が必要)

ターミナル
npm install

4. CSS/JSを作成ビルド

ターミナル
npm run dev
welcome R egister Login

これでLaravel5/6/7どうようのLOGIN機能が実装できました!

「Laravel DB.com」 をやってます

Laravelをテーブル設計するだけでMigrationが作成できるツール
https://qiita.com/daisu_yamazaki/items/4e13ac43c20bcdedeb40
※是非こちらも見てください~。

今回のLogin機能:参考「Laravel ドキュメント」

【ver6.x】https://laravel.com/docs/7.x/frontend#introduction
【ver7.x】https://laravel.com/docs/6.x/frontend#introduction
【ver8.x】https://laravel.com/docs/8.x/upgrade#updating-dependencies
※Laravel8.x 公式(2020/09/17段階では解説が無いようです...Updating Dependenciesを参照)

以上

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

Laravel8で「laravel6/7」と一緒のlaravel/ui ログインを使う場合

Laravle6.x/7.x/8.xのログイン実装コマンドの違いを見る

みなさんこんにちは
ジーズアカデミー 主席講師 山崎ですm(_ _)m
今回はLaravel6(LTS)/7/8にアップデートされLogin画面作成に困った解決策をMemoしておきます。

前提条件/検証環境

  • LaravelでCRUDを作成した経験がある人
  • Laravelの基本を理解している人
  • 記事内容的には、Laravel6のAuthを使う場合の自分メモです。
  • Laravel6/7=PHP 7.2.x(確認した環境)
  • Laravel8 =PHP 7.3.x(確認した環境)
  • EC2の場合:t2.small (メモリ2G以上必要 "laravel/ui"に必要なため,t2.microだとコケます)
  • Node.js インストール済みであること

【 Laravel6/7/8でのログイン(laravel/ui)画面作成】

Laravel5.xでは「php artisan make:auth」コマンドで簡単にLOGIN機能を作成できていました。
Laravel6.x以降 php artisann make:auth は無くなりました。


Laravel6 / Laravel7 / Laravel8 ログイン画面作成

1. laravel/uiをインストール

【要注意】Laravel7 が出たタイミング・・・だと思いますが、
laravel/ui コマンドにバージョンを付けないとエラーがでるようになりました!!!
6 or 7 or 8 に合わせて使い分けてください!!

ターミナル
#Laravel6.x 公式ではこちらに変わってました。
composer require laravel/ui:^1.0 --dev

#laravel7の場合
composer require laravel/ui:^2.4

#laravel8の場合
composer require laravel/ui

※Laravel6.x 公式
https://laravel.com/docs/6.x/frontend#introduction
※Laravel7.x 公式
https://laravel.com/docs/7.x/frontend#introduction
※Laravel8.x 公式(解説が無いようですが、Updating Dependenciesを参照)
https://laravel.com/docs/8.x/upgrade#updating-dependencies

2. LOGIN機能&テーブル作成

ターミナル
php artisan ui vue --auth

php artisan migrate

3. FrontEndに必要なPackageをインストール
(Node/npmの使用が必要)

ターミナル
npm install

4. CSS/JSを作成ビルド

ターミナル
npm run dev

これでLaravel5バージョンからのLOGIN機能が実装できました!

Login機能:参考「Laravel ドキュメント」

【ver6.x】https://laravel.com/docs/7.x/frontend#introduction
【ver7.x】https://laravel.com/docs/6.x/frontend#introduction
【ver8.x】https://laravel.com/docs/8.x/upgrade#updating-dependencies
※Laravel8.x 公式(2020/09/17段階では解説が無いようです...Updating Dependenciesを参照)

★研究開発「Laravel DB.com」 を運用中

Laravelをテーブル設計するだけでCRUDが作成できるツール
https://qiita.com/daisu_yamazaki/items/4e13ac43c20bcdedeb40
※是非応援しください。

以上

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

Laravel 設定ファイルの内容を呼び出す

目的

  • Laravelの設定ファイルへの追記方法と設定ファイルの読み込み方法をまとめる
  • ※本説明でいう設定ファイルとは.envファイルではなく、アプリ名ディレクトリ/config直下にあるファイルを指す

実施環境

  • ハードウェア環境
項目 情報
OS macOS Catalina(10.15.5)
ハードウェア MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports)
プロセッサ 2GHzクアッドコアIntel Core i5
メモリ 32 GB 3733 MHz LPDDR4
グラフィックス Intel Iris Plus Graphics 1536 MB
  • ソフトウェア環境
項目 情報 備考
PHPバージョン 7.4.3 Homwbrewを用いて導入
Laravelバージョン 7.0.8 commposerを用いてこちらの方法で導入→Mac Laravelの環境構築を行う
MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いてこちらの方法で導入→Mac HomebrewでMySQLをインストールする

前提条件

  • 実施環境に記載した環境、またはそれに準ずる環境が用意されておりLaravelアプリが作成されていること。

前提情報

読後感

  • アプリ名ディレクトリ/config直下の設定ファイルに独自の設定を追記することができる。
  • アプリ名ディレクトリ/config直下の設定ファイルに記載されている値を読み込み表示することができる。

概要

  1. 設定ファイルの作成と記載
  2. ルーティング情報の追記
  3. コントローラファイルの作成と記載
  4. ビューファイルの作成と記載
  5. 確認

詳細

  1. 設定ファイルの作成と記載

    1. アプリ名ディレクトリで下記コマンドを実行して設定ファイルを作成する。

      $ vi config_test.php
      
    2. 開いたファイルに下記の内容を追記し保存して閉じる。

      アプリ名ディレクトリ/config/config_test.php
      <?php
      
      return [
          # 文字列の設定
          'config_str' => 'これは設定ファイルで設定された文字列です。',
      ]
      
      ?>
      
  2. ルーティング情報の追記

    1. アプリ名ディレクトリで下記コマンドを実行してルーティングファイルを開く。

      $ vi routes/web.php
      
    2. 下記の内容を追記する。

      アプリ名ディレクトリ/routes/web.php
      Route::get('/config_check', 'ConfigCheckController@config_check')->name('config_check');
      
  3. コントローラファイルの作成と記載

    1. アプリ名ディレクトリで下記コマンドを実行してコントローラファイルを作成する。

      $ php artisan make:controller ConfigCheckController
      
    2. アプリ名ディレクトリで下記コマンドを実行してただいま作成したコントローラファイルを開く。

      $ vi app/Http/Controllers/ConfigCheckController.php 
      

      下記の様に記載を行う。

      アプリ名ディレクトリ/app/Http/Controllers/ConfigCheckController.php
      <?php
      
      namespace App\Http\Controllers;
      
      use Illuminate\Http\Request;
      // 下記を追記する
      use Illuminate\Support\Facades\Config;
      
      class ConfigCheckController extends Controller
      {
          // 下記を追記する
          public function config_check()
          {
              // アプリ名ディレクトリ/config直下に存在するconfig_test.phpファイルで定義されているconfig_strの文字列を$strに格納する処理
              $str = Config::get('config_test.config_str');
              return view('checks.config_check', [
                  'str' => $str,
              ]);
          }
          // 上記までを追記する
      }
      
  4. ビューファイルの作成と記載

    1. アプリ名ディレクトリで下記コマンドを実行してビューファイルを格納するディレクトリを作成する。

      $ mkdir resources/views/checks
      
    2. アプリ名ディレクトリで下記コマンドを実行してビューファイルを作成する。

      $ vi resources/views/checks/config_check.blade.php
      
    3. 開いたビューファイルに下記の内容を記載する。

      アプリ名ディレクトリ/resources/views/checks/config_check.blade.php
      {{ $str }}
      
  5. 確認

    1. アプリ名ディレクトリで下記コマンドを実行してローカルサーバを起動する。

      $ php artisan serve
      
    2. ブラウザで下記にアクセスする。(Authの認証機能が付与されているLaravelアプリで下記にアクセスする場合、ログインが必要になる場合がある。)

    3. 下記の様に、設定ファイルに記載した内容がブラウザ上で表示されていれば作業完了である。

      *画像

参考文献

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