20200720のlaravelに関する記事は6件です。

Laravel のHash::make をbcrypt の場合でCLI で再現したい場合

対処法

以下のように実行する。

htpasswd -bnBC 10 "" <パスワード本体> | tr -d ':\n' | sed 's/$2y/$2a/'

これをパスワードレコードに直接updateすれば、ログインすることも可能。

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

【Laravel】データベース

書籍のアウトプットとして

データベースの準備

Laravelのアプローチ

DBクラス(クエリビルダ)

一番シンプルなDBクラスを使用する
直接SQLを直接実行するようなもの。

クエリビルダ機能がついている。

用語 説明
DBクラス DB利用のための基本的な機能を備えている。
クエリビルダ メソッドを使ってDBにアクセスできるようになり、SQLではなく、PHPらしい処理ができるようになる

Eloquent(ORM)

EloquentというORMを使用することで、DBクラスよりも遥かにPHPらしい処理をできる。

用語 説明
ORM DBのデータとプログラミング言語のオブジェクトの間を取り持つ

SQLiteデータベースを用意する

Laravelはどのデータベースを使っても同じ扱いができるため、どのデータベースを使おうと基本的に違いはない。
ここではSQLiteを利用していく

SQLiteの特徴

SQLiteはデータベースサーバの起動が必要なく手軽に利用できる。
PHPにはSQLiteファイルにアクセスするための機能があるため,SQLite本体すら不要。

テーブルを利用する

Laravelカレントディレクトリへ移動してdatabaseディレクトリへ移動して下記コマンド

$ sqlite3 database.sqlite

下記コマンドでDBを作成

CREATE TABLE `people` (
   `id`   INTEGER PRIMARY KEY AUTOINCREMENT,
   `name`   TEXT NOT NULL,
   `mail`   TEXT,
   `age`   INTEGER
);

ダミーレコードを追加

INSERT INTO `people` VALUES (1,'taro','taro@yamada.jp',35);
INSERT INTO `people` VALUES (2,'hanako','hanako@flower.com',24);
INSERT INTO `people` VALUES (3,'sachiko','sachi@happy.org',47);

DB利用のための手続き

php:config/database.php
'default' => env('DB_CONNECTION', 'mysql'),

これを以下に修正

php:config/database.php
'default' => env('DB_CONNECTION', 'sqlite'),

これでLaravelで利用するDBがSQLiteになった

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

Elastic Beanstalkでデプロイする際に、No such file or directory: '/var/app/ondeck/' と表示される

はじめに

Elastic Beanstalkに構築したLaravelアプリケーションのデプロイの際に「No such file or directory: '/var/app/ondeck/'」と表示され、デプロイに失敗しました

環境

$ php artisan -V
Laravel Framework 6.18.25

Elastic Beanstalkプラットフォームバージョン : PHP 7.3 running on 64bit Amazon Linux2

エラー内容

$ eb logs
----------------------------------------
/var/log/eb-engine.log
----------------------------------------
・
・
・
2020/07/20 14:17:25.467640 [ERROR] Error occurred during build: [Errno 2] No such file or directory: '/var/app/ondeck/storage'
2020/07/20 14:17:25.467671 [ERROR] An error occurred during execution of command [app-deploy] - [PostBuildEbExtension]. Stop running the command. Error: Container commands build failed. Please refer to /var/log/cfn-init.log for more details. 

対応方法

プラットフォームのバージョンを「PHP 7.3 running on 64bit Amazon Linux2」から「PHP 7.3 running on 64bit Amazon Linux」に変更して、対処しました
(Amazon Linux2系を使用するのをやめました)

まとめ

Amazon Linux2では、「/var/app/ondeck」のフォルダがなくなったようです
抜本的な解決になっていませんが、お困りの方は参考にしてみてください

参考

AWS Developer Forums: Server stuck in a loop (eb-engine.log)

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

【Laravel7】ユーザーをキーワード検索する

はじめに

Laravel7の認証機能で登録したユーザーについて、キーワード検索できるページを作成します。

環境

XAMPP環境でLaravelが使えるように設定してあります。

  • Windows10 Pro 64bit
  • PHP 7.3.18
  • Laravel 7.12.0
  • MariaDB 10.1.32

※認証機能でユーザーを登録したり、管理者を追加したりの一連の流れは過去記事をご覧ください。
- 【Laravel7でユーザー認証_1】基本のき
- 【Laravel7でユーザー認証_2】ユーザー認証を日本語化
- 【Laravel7でユーザー認証_3】ユーザー認証をメールアドレスからユーザー名に変更する
- 【Laravel7でユーザー認証_4】パスワード変更フォームを作成する
- 【Laravel7でユーザー認証_5】ユーザーを倫理削除(SoftDelete)する
- 【Laravel7でユーザー認証_6】ユーザーの情報を表示・変更する設定画面を作成する
- 【Laravel7でユーザー認証_7】会員登録時にメール認証を行う
- 【Laravel7でユーザー認証_8】メールアドレス変更時にメール認証を行う
- 【Laravel7でユーザー認証_9】マルチ認証機能を使って管理者を作成する
- 【Laravel7でユーザー認証_10】マルチ認証機能で作成した管理者のパスワード変更・リセット機能を追加する

要件

  • 管理者のhomeに検索フォームを設置する。
  • デフォルトの状態(アクセス直後)は全てのユーザーを表示する。
  • 検索フォームに何も入っていないで検索した場合、全てのユーザーを表示する。
  • キーワードは名前またはメールアドレスの部分一致で検索する。
  • キーワードを半角または全角のスペースで区切った場合、AND検索とする。
  • 検索結果は10件毎にページネーションする。

Account_Manager.png

実装

コントローラ

app/Http/Controllers/Admin/HomeController.php
<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\User; 
use Illuminate\Http\Request;

class HomeController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth:admin');
    }

    public function redirectIndex()
    {
        return redirect(route('admin.home'));
    }

    public function index(Request $request)
    {
        $q = $request->input('q'); //フォームの入力値を取得

        //検索キーワードが空の場合
        if (empty($q)) {
            $users = User::paginate(10);  //全ユーザーを10件/ページで表示

        //検索キーワードが入っている場合
        } else {
            $_q = str_replace(' ', ' ', $q);  //全角スペースを半角に変換
            $_q = preg_replace('/\s(?=\s)/', '', $_q); //連続する半角スペースは削除
            $_q = trim($_q); //文字列の先頭と末尾にあるホワイトスペースを削除
            $_q = str_replace(['\\', '%', '_'], ['\\\\', '\%', '\_'], $_q); //円マーク、パーセント、アンダーバーはエスケープ処理
            $keywords = array_unique(explode(' ', $_q)); //キーワードを半角スペースで配列に変換し、重複する値を削除

            $query = User::query();
            foreach($keywords as $keyword) {
                //1つのキーワードに対し、名前かメールアドレスのいずれかが一致しているユーザを抽出
                //キーワードが複数ある場合はAND検索
                $query->where(function($_query) use($keyword){
                    $_query->where('name', 'LIKE', '%'.$keyword.'%')
                           ->orwhere('email', 'LIKE', '%'.$keyword.'%');
                });
            }
            $users = $query->paginate(10); //検索結果のユーザーを10件/ページで表示
        }
        return view('admin.home', compact('users', 'q'));
    }
}

検索文字列に「yamada taro」と入力した場合、名前かメールアドレスに「yamada」という文字列が含まれているユーザーを抽出し、さらにその中で、名前かメールアドレスに「taro」という文字列が含まれているユーザーを抽出するという仕様になります。
この、(A or B) and (C or D) の条件での検索は、useを使ってクロージャへ変数を渡してやることで実現します。(参考:Eloquent/QueryBuilderによるAnd検索とOr検索の複合

view

resources/views/admin/home.blade.php
@extends('layouts.admin.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <form method="GET" action="{{ route('admin.home') }}">
              <div class="form-row">
                <div class="col">
                  <input id="q" type="text" class="form-control" name="q" value="{{ $q }}" autocomplete="q" autofocus placeholder="{{ __('Name or Email') }}">
                </div>
                <div class="col-auto">
                  <button type="submit" class="btn btn-primary">
                      {{ __('Search') }}
                  </button>
                </div>
              </div>
            </form>
        </div>

        <div class="col-md-12">
            @if (session('status'))
                <div class="alert alert-success" role="alert">
                    {{ session('status') }}
                </div>
            @endif

            @if(!empty($users))
            {{ __('SearchResult') }} : {{ __('SearchCount', ['num' => $users->total()]) }}
            <div class="card" style="margin-bottom: 20px;">
                <div class="card-header">{{ __('UserList') }}</div>

                <div class="card-body">

                    <table class="table table-hover">
                      <thead>
                        <tr>
                          <th>{{ __('ID') }}</th>
                          <th>{{ __('Name') }}</th>
                          <th>{{ __('E-Mail Address') }}</th>
                          <th>{{ __('CreateDate') }}</th>
                          <th>{{ __('UpdateDate') }}</th>
                        </tr>
                      </thead>
                      <tbody>
                      @foreach($users as $user)
                      <tr>
                        <td>{{ $user->id }}</td>
                        <td>{{ $user->name }}</td>
                        <td>{{ $user->email }}</td>
                        <td>{{ $user->created_at->format('Y/m/d') }}</td>
                        <td>{{ $user->updated_at->format('Y/m/d') }}</td>
                      </tr>
                      @endforeach
                      </tbody>
                    </table>
                </div>
            </div>

            <div class="paginate">
                {{ $users->appends(Request::only('q'))->links() }}
            </div>

            @endif

        </div>
    </div>
</div>
@endsection

$users に渡された値を、foreach で展開します。
$users->total() で結果の合計件数が表示できます。
ページネーションで2ページ目以降のページにもキーワードを引き継ぎさせたいので、 ページネーション部分は appends メソッドでクエリ文字列(q)を指定し $users->appends(Request::only('q'))->links() とします。

参考サイト

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

Laravel CRUD処理を使った投稿アプリを作成する その5 投稿削除機能

目的

  • アプリを作成する上で基本となるCRUD処理を有したLaravelアプリをチュートリアル的に作成する方法をまとめる

実施環境

  • ハードウェア環境
項目 情報
OS macOS Catalina(10.15.5)
ハードウェア MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports)
プロセッサ 2 GHz クアッドコア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をインストールする

前提条件

前提情報

  • DockerやAWSなどは使用せずにMacのローカルに実施環境と同じLaravel開発環境を構築して実施する。
  • チュートリアルで実際に筆者が作成したソースコードをGitHubにて公開予定である。
  • CRUD処理の作成完了を最短目標にしてバリデーションなどは後々設定することとする。
  • 実施環境と同じ環境がDockerやAWSで用意できるなら都度読み替えていただければ実施が可能だと思う。
  • 公式ドキュメントと一冊の技術書を元に本記事を記載する。

この記事の読後感

  • 投稿内容の削除機能が実装できる。

全ての記事(miriwo_laravelチュートリアル)を通した読後感

  • Laravelアプリでログインなどのユーザ認証付き投稿アプリの作成ができる。

概要

  1. ルーティングの記載
  2. コントローラの記載
  3. ビューファイルの修正
  4. 確認

詳細

  1. ルーティングの記載

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

      $ vi routes/web.php 
      
    2. 開いたファイルに下記の行を追記する。

      laravel_crud/routes/web.php
      Route::post('/delete', 'ContentController@delete')->name('delete');
      
  2. コントローラの記載

    1. laravel_crudディレクトリで下記コマンドを実行して作成したコントローラファイルを開く。

      $ vi app/Http/Controllers/ContentController.php
      
    2. 下記の内容をクラス内に追記する。

      laravel_crud/app/Http/Controllers/ContentController.php
      public function delete(Request $request)
      {
          $contents_delete_query = Content::select('*');
          $contents_delete_query->where('id', $request['content_id']);
          $contents_delete_query->delete();
      
          return redirect('/output');
      }
      
    3. 記載後のコントローラファイルの内容を下記に記載する。

      laravel_crud/app/Http/Controllers/ContentController.php
      <?php
      
      namespace App\Http\Controllers;
      
      use Illuminate\Http\Request;
      use App\Models\Content;
      
      class ContentController extends Controller
      {
          public function input()
          {
              return view('contents.input');
          }
      
          public function save(Request $request)
          {
              $input_content = new Content();
              $input_content->content = $request['content'];
              $input_content->save();
      
              return redirect('/output');
          }
      
          public function output()
          {
              $contents_get_query = Content::select('*');
              $all_contents = $contents_get_query->get();
      
              return view('contents.output', [
                  'all_contents' => $all_contents,
              ]);
          }
      
          public function delete(Request $request)
          {
              $contents_delete_query = Content::select('*');
              $contents_delete_query->where('id', $request['content_id']);
              $contents_delete_query->delete();
      
              return redirect('/output');
          }
      }
      
  3. ビューファイルの修正

    1. laravel_crudディレクトリで下記コマンドを実行してビューファイルを開く。

      vi resources/views/contents/output.blade.php
      
    2. 開いたビューファイルに下記の内容を追記する。

      laravel_crud/resources/views/contents/output.blade.php
      <h1>output</h1>
      
      @foreach ($all_contents as $item)
          <hr>
          <p>{{$item['content']}}</p>
          <!-- 下記を追記 -->
          <form action="{{route('delete')}}" method="post">
              @csrf
              <input type="hidden" name="content_id" value="{{$item['id']}}">
              <input type="submit" value="削除">
          </form>
      @endforeach
      
  4. 確認

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

      $ php artisan serve
      
    2. ブラウザで下記にアクセスする。

    3. 「削除」ボタンをクリックして投稿内容が削除されることを確認する。

      127_0_0_1_8000_output.png

    4. 下記の様に投稿内容が削除されれば本記事の内容は完了である。

      127_0_0_1_8000_output.png

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

Laravel学習用備忘録 その2

雑多にLaravelの作成に関し、綴る。

CSSの適用

  • プロジェクト直下のpublicにCSSフォルダを作成し、style.cssファイルを作成
  • viewファイルのhead内に<link rel="stylesheet" href="{{ asset('css/style.css') }}">を記述し、読み込ませる。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む