20201125のlaravelに関する記事は7件です。

Laravel × nginx でログやキャッシュ書き込み時のPermission Deniedを回避

ディレクトリとファイル権限を以下に変更

find ./ -type d -exec chmod 755 {} \;
find ./ -type f -exec chmod 644 {} \;

所有者をnginxへ変更

chown -R nginx. ${laravelディレクトリ}

参考URL
https://www.geekfeed.co.jp/geekblog/laravel6_docker

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

Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ~事前準備編~

制作環境

Windows 10
Laravel : 6.18.35
Laravel/ui : 1.0
Laravel-mix : 5.0.1
Bootstrap : 4.0.0
axios : 0.19
Vue : 2.5.17
XAMPP
PHP : 7.4.3
Visual Studio Code

はじめに

この記事はプログラミングをはじめたばかりの素人が、できたことをメモするのに利用しています。
内容には誤りがあるかもしれません。

関連記事

Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ~JavaScript編~
Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ~jQuery編~

作成するもの

商品の登録ができるだけの簡単なページを作成します。
その際業者コードを入力すると、非同期通信(Ajax)で仕入れ先の名前が自動で入力できるようにします。
ただし商品の登録時に業者コードが入力されていなくても、仕入れ先が手動で入力されていれば問題なく登録できるものとします。

非同期通信の記述を学ぶのが主な目的の為、最低限必要だと思う記述しかしていません。

完成イメージ

image.jpg

登録した商品は下に一覧で表示される。
やりたい事は、業者コード(4桁)を入力すると仕入れ先が自動で反映されるようにする。

image2.jpg

はじめる前に

当方の環境ではBootstrapVue.jsを事前にlaravel/uiでインストールし、Laravel-mixで読み込むようにしてあります。
インストールは事前に行っておいて下さい。
CDNを利用される場合は、<script src="{{ mix('js/app.js') }}"></script>の部分をCDNで置き換えてください。

事前準備

非同期通信の処理の前に、必要なデータベースのテーブルやフォームを作成します。
※仕入れ先を新規登録するフォームの作成はしません。
また、事前準備の内容についてはあまり詳しく触れません。

データベース

データベースには以下の3つのテーブルを作成します。

items テーブル
商品用のテーブルです。

id name supplier created_at updated_at
1 りんご (株)くだもの 2020-11-06 18:21:21 2020-11-06 18:21:21
2 きゅうり (株)やさい 2020-11-06 18:21:21 2020-11-06 18:21:21
3 牛肉 (株)肉 2020-11-06 18:21:21 2020-11-06 18:21:21
4 サンマ 魚組合 2020-11-06 18:21:21 2020-11-06 18:21:21
5 グレープフルーツ (株)くだもの 2020-11-06 18:21:21 2020-11-06 18:21:21
6 ヒラメ 魚組合 2020-11-06 18:21:21 2020-11-06 18:21:21
7 豚肉 (株)肉 2020-11-06 18:21:21 2020-11-06 18:21:21
8 ラム肉 (株)肉 2020-11-06 18:21:21 2020-11-06 18:21:21
9 白菜 (株)やさい 2020-11-06 18:21:21 2020-11-06 18:21:21

prices テーブル
価格のテーブル

id item_id price created_at updated_at
1 1 180 2020-11-06 18:21:21 2020-11-06 18:21:21
2 2 98 2020-11-06 18:21:21 2020-11-06 18:21:21
3 3 580 2020-11-06 18:21:21 2020-11-06 18:21:21
4 4 240 2020-11-06 18:21:21 2020-11-06 18:21:21
5 5 145 2020-11-06 18:21:21 2020-11-06 18:21:21
6 6 280 2020-11-06 18:21:21 2020-11-06 18:21:21
7 7 480 2020-11-06 18:21:21 2020-11-06 18:21:21
8 8 780 2020-11-06 18:21:21 2020-11-06 18:21:21
9 9 280 2020-11-06 18:21:21 2020-11-06 18:21:21

traders テーブル
仕入れ先業者のテーブルです。

id trader_code trader_name created_at updated_at
1 1001 (株)くだもの 2020-11-06 18:21:21 2020-11-06 18:21:21
2 1002 (株)やさい 2020-11-06 18:21:21 2020-11-06 18:21:21
3 1003 (株)肉 2020-11-06 18:21:21 2020-11-06 18:21:21
4 1004 魚組合 2020-11-06 18:21:21 2020-11-06 18:21:21

itemsとpricesは1対1の関係なので、本来1つにまとめればいいと思いますが、練習の為に1対1のままにしてあります。

マイグレーションファイルの作成

プロジェクトのディレクトリでターミナルを起動し、以下を実行してください。

php artisan make:migration create_items_table

続けて、

php artisan make:migration create_prices_table

続けて、

php artisan make:migration create_traders_table

完了後、database>migrations内のxxxx_xx_xxx_xxxxxx_create_items_table.phpを開き、以下のように編集します。

create_items_table.php
    public function up()
    {
        Schema::create('items', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name')->comment('商品名');
            $table->string('supplier')->comment('仕入れ先');
            $table->timestamps();
        });
    }

次に同じディレクトリ内のxxxx_xx_xxx_xxxxxx_create_prices_table.phpを開き、以下のように編集します。

create_prices_table.php
    public function up()
    {
        Schema::create('prices', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('item_id')->comment('商品ID');
            $table->foreign('item_id')->references('id')->on('items')->onDelete('cascade');
            $table->unsignedBigInteger('price')->comment('価格');
            $table->timestamps();
        });
    }

次に同じディレクトリ内のxxxx_xx_xxx_xxxxxx_create_traders_table.phpを開き、以下のように編集します。

create_traders_table.php
    public function up()
    {
        Schema::create('traders', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('trader_code')->unique()->index()->comment('業者コード');
            $table->string('trader_name')->comment('業者名');
            $table->timestamps();
        });
    }

モデルの作成

ターミナルを起動し、以下を実行してください。

php artisan make:model Models/Item

※モデルはModelsフォルダの中に作成するようにしています。

続けて、

php artisan make:model Models/Price

続けて、

php artisan make:model Models/Trader

完了後、app>Models内のItem.phpを開き以下のように編集します。

Item.php
use Illuminate\Database\Eloquent\Relations\HasOne;

class Item extends Model
{
    protected $fillable = ['name', 'supplier'];

    public function price(): HasOne
    {
        return $this->hasOne('App\Models\price');
    }
}

次にPrice.phpを開き以下のように編集します。

Price.php
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class Price extends Model
{
    protected $fillable = ['price'];


    public function item(): BelongsTo
    {
        return $this->belongsTo('App\Models\item')->withTimestamps();
    }
}

次にTrader.phpを開き以下のように編集します。

Trader.php
class Trader extends Model
{
    protected $fillable = ['trader_name', 'trader_code'];

    public function scopeWhereSearch($query, $trader_code)
    {
        $query->where('trader_code', int($trader_code));
    }
}

ビューの作成

resources>views内に新しくindex.blade.phpを作成し、内容を以下のように編集します。

index.blade.php
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <meta name="csrf-token" content="{{ csrf_token() }}">
    <link rel="stylesheet" href="{{ mix('css/app.css') }}">
    <title>テスト</title>
</head>
<body>

    <div id="app">
        <div class="container">

            <h1 class="mt-5 mb-3">商品登録</h1>

            @if (session('success'))
                <p class="text-primary">{{ session('success') }}</p>
            @endif

            @if (count($errors) > 0)
                <div>
                    <ul>
                        @foreach ($errors->all() as $error)
                            <li class="text-danger">{{ $error }}</li>
                        @endforeach
                    </ul>
                </div>
            @endif

            <form action="/form" method="post">
                @csrf
                <div>
                    <label>商品名: <input type="text" name="name"></label>
                </div>

                <div>
                    <label>価格: <input type="text" name="price"></label>
                </div>

                <div>
                    <label>業者コード: <input type="text" id="code"></label>
                    <label>仕入れ先: <input type="text" id="supplier" name="supplier"></label>
                </div>

                <button class="btn btn-primary" type="submit">登録</button>

            </form>

            <h1 class="mt-5">商品一覧</h1>

            <table class="table">

                <thead class="thead-dark">
                    <tr>
                        <th scope="col">商品名</th>
                        <th scope="col">価格</th>
                        <th scope="col">仕入れ先</th>
                    </tr>
                </thead>

                <tbody>
                    @foreach ($itemTable as $item)
                    <tr>
                        <td>{{ $item->name }}</td>
                        <td>{{ $item->price->price }}</td>
                        <td>{{ $item->supplier }}</td>
                    </tr>
                    @endforeach
                </tbody>

            </table>

        </div>
    </div>
    <script src="{{ mix('js/app.js') }}"></script>

</body>
</html>

コントローラの作成

ターミナルで以下を実行してください。

php artisan make:cotroller FormController

完了後、app>Http>Controllers内のFormController.phpを開き、以下のように編集します。

FormController.php
use App\Models\Item;
use App\Models\Trader;
use App\Http\Requests\TestFormRequest;
use DB;

class FormController extends Controller
{
    public function index()
    {
        $itemTable = Item::with('price')->get();
        return view('index', compact('itemTable'));
    }

    public function post(TestFormRequest $request)
    {
        DB::transaction(function () use ($request) {

            $form = $request->all();
            unset($form['_token']);

            $itemTable = new Item;
            $itemTable->fill($form)->save();

            $priceData = ['price' => $form['price']];

            $itemTable->price()->create($priceData);
        });

        return redirect('/form')->with('success', '★★商品を登録しました★★');
    }
}

フォームリクエストの作成

バリデーションの為にフォームリクエストを作成します。

ターミナルで以下を実行してください。

php artisan make:request TestFormRequest

完了後、app>Http>Requests内のTestFormRequest.phpを開き、以下のように記述します。

TestFormRequest.php
class TestFormRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'name'     => 'required',
            'price'    => 'required|integer|regex:/^[\d]+$/',
            'supplier' => 'required',
        ];
    }

    public function messages()
    {
        return [
            'name.required'  => ':attributeは必ず入力してください。',
            'price.required' => ':attributeは必ず入力してください。',
            'price.integer'  => ':attributeは整数を入力してください。',
            'price.regex'    => ':attributeは整数を入力してください。',
            'supplier'       => ':attributeは必ず入力してください。',
        ];
    }

    public function attributes()
    {
        return [
            'name'     => '商品名',
            'price'    => '価格',
            'supplier' => '仕入れ先',
        ];
    }
}

ルーティングの作成

routes内のweb.phpを開き、以下のように記述します。

web.php
Route::get('/form', 'FormController@index')->name('index');
Route::post('/form', 'FormController@post')->name('post');

確認

/formにアクセスし、商品が登録できるかやってみてください。
商品が登録され、下の一覧に表示されればOKです。
まだ仕入れ先の自動入力は実装していないので、仕入れ先は手動で入力してください。
また、仕入れ先を4桁(1001)で直接登録しておいてください。

次回につづく・・・

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

Laravel ローカルアプリからAWS S3に画像をアップロードする

ode# 目次

  • Macのローカルで作成したLaravelアプリから画像ファイルをS3にアップロードする方法をまとめる

実施環境

  • ハードウェア環境
項目 情報
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.8 Homebrewを用いてこちらの方法で導入→Mac HomebrewでPHPをインストールする
Laravel バージョン 6.X commposerを用いてこちらの方法で導入→Mac Laravelの環境構築を行う
MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いてこちらの方法で導入→Mac HomebrewでMySQLをインストールする

前提条件

  • MacのローカルでLaravelのアプリが作成できる状態になっていること。
  • コマンド$ composerが実行できる状態になっていること。

前提情報

  • 本記事はMacのローカルで作成されたLaravelアプリからAWSのS3に画像をアップロードする方法をまとめている。
  • AWSならS3にバケットを作成する部分から、ローカルならLaravelアプリを作成する部分から説明する。
  • 本記事の作業完了したソースは下記にアップしてある。

概要

  1. S3にてバケットを作成
  2. アクセスキーの取得
  3. Laravelアプリ作成
  4. Laravelアプリ側の設定
  5. 設定

詳細

  • 下記の説明で使用するコマンドはsshでインスタンスに接続して実行する物とする。
  1. S3にてバケットを作成
    1. 下記のリンクの手順を実施してS3にバケットを作成する。(testフォルダの作成まで実施する。)
  2. アクセスキーの取得
    1. 下記のリンクの手順を実施してアクセスキーとシークレットアクセスキーの取得を行う。
  3. Laravelアプリ作成

    1. 任意のディレクトリで下記コマンドを実行してLaravelアプリを作成する。作成するアプリ名は「laravel6_s3」とする。

      $ composer create-project "laravel/laravel=6.*" laravel6_s3
      
    2. 下記コマンドを実行して作成したLaravelアプリのディレクトリに移動する。

      $ cd laravel6_s3
      
  4. Laravelアプリ側の設定

    1. laravel6_s3ディレクトリで下記コマンドを実行して必要なライブラリをインストールする。

      $ composer require league/flysystem-aws-s3-v3 ~1.0
      
    2. 下記コマンドを実行してLaravelの設定ファイルを開く。

      $ vi .env
      
    3. 下記の様に設定ファイルを修正する。AWSのアカウント登録時にCSVファイルで得た情報を記載する。※シークレットアクセスキーはCSVファイルでのみ確認する事ができるため紛失した場合は別アカウントをAWSに登録したほうが早いかもしれない。

      • 修正前

        /var/www/html/test/.env
        AWS_ACCESS_KEY_ID=
        AWS_SECRET_ACCESS_KEY=
        AWS_DEFAULT_REGION=us-east-1
        AWS_BUCKET=
        
      • 修正後

        /var/www/html/test/.env
        AWS_ACCESS_KEY_ID=AWSのアクセスキーを記載する
        AWS_SECRET_ACCESS_KEY=AWSのシークレットアクセスキーを記載する
        AWS_DEFAULT_REGION=ap-northeast-1
        AWS_BUCKET=先に作成したバケット名
        
      • 修正後の.envファイルの全体を下記に記載する。

        /var/www/html/test/.env
        APP_NAME=test
        APP_ENV=local
        APP_KEY=base64:ZJYPq8Ij/UIWowQG+H4Gwz+zXjs/vEn85Yfv45qQa88=
        APP_DEBUG=true
        APP_URL=http://localhost
        
        LOG_CHANNEL=stack
        
        DB_CONNECTION=mysql
        DB_HOST=127.0.0.1
        DB_PORT=3306
        DB_DATABASE=test
        DB_USERNAME=root
        DB_PASSWORD=**************
        
        BROADCAST_DRIVER=log
        CACHE_DRIVER=file
        QUEUE_CONNECTION=sync
        SESSION_DRIVER=file
        SESSION_LIFETIME=120
        
        REDIS_HOST=127.0.0.1
        REDIS_PASSWORD=null
        REDIS_PORT=6379
        
        MAIL_MAILER=smtp
        MAIL_HOST=smtp.mailtrap.io
        MAIL_PORT=2525
        MAIL_USERNAME=null
        MAIL_PASSWORD=null
        MAIL_ENCRYPTION=null
        MAIL_FROM_ADDRESS=null
        MAIL_FROM_NAME="${APP_NAME}"
        
        AWS_ACCESS_KEY_ID=AWSのアクセスキーを記載する
        AWS_SECRET_ACCESS_KEY=AWSのシークレットアクセスキーを記載する
        AWS_DEFAULT_REGION=ap-northeast-1
        AWS_BUCKET=先に作成したバケット名
        
        PUSHER_APP_ID=
        PUSHER_APP_KEY=
        PUSHER_APP_SECRET=
        PUSHER_APP_CLUSTER=mt1
        
        MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
        MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
        
  5. ファイル設置処理の付与

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

      $ vi routes/web.php
      
    2. 開いたルーティングファイルを下記の様に修正する。(そのほかのルーティング情報が下記記載と一致していなくても追記部分だけ追記する。)

      アプリ名ディレクトリ/routes/web.php
      <?php
      
      use Illuminate\Support\Facades\Route;
      
      /*
      |--------------------------------------------------------------------------
      | Web Routes
      |--------------------------------------------------------------------------
      |
      | Here is where you can register web routes for your application. These
      | routes are loaded by the RouteServiceProvider within a group which
      | contains the "web" middleware group. Now create something great!
      |
      */
      
      Route::get('/', function () {
          return view('welcome');
      });
      
      Auth::routes();
      
      Route::get('/home', 'HomeController@index')->name('home');
      
      //下記を追記
      //画像ファイルをアップロードするボタンを設置するページへのルーティング
      Route::get('/upload/image', 'ImageController@input');
      //画像ファイルをアップロードする処理のルーティング
      Route::post('/upload/image', 'ImageController@upload');
      //上記までを追記
      
    3. アプリ名ディレクトリで下記コマンドを実行してコントローラファイルを作成する。

      $ php artisan make:controller ImageController
      
    4. 下記のコントローラファイルが作成される。

      • アプリ名ディレクトリ/app/Http/Controllers/ImageController.php
    5. アプリ名ディレクトリで下記コマンドを実行してコントローラファイルを開く。

      $ vi app/Http/Controllers/ImageController.php
      
    6. 開いたコントローラファイルを下記の様に修正する。

      アプリ名ディレクトリ/app/Http/Controllers/ImageCotroller.php
      <?php
      
      namespace App\Http\Controllers;
      
      use Illuminate\Http\Request;
      //下記を追加する
      use Illuminate\Support\Facades\Storage;
      
      class ImageUploadController extends Controller
      {
          //下記を追加
          public function input()
          {
              return view('images.input');
          }
      
          public function upload(Request $request)
          {        
              $this->validate($request, [
                  'file' => [
                      // 必須
                      'required',
                      // アップロードされたファイルであること
                      'file',
                      // 画像ファイルであること
                      'image',
                      // MIMEタイプを指定
                      'mimes:jpeg,png',
                  ]
              ]);
      
              if ($request->file('file')->isValid([])) {
      
                  Storage::disk('s3')->putFile('/test', $request->file('file'), 'public');
                  return redirect('/');
              }else{
                  return redirect('/upload/image');
              }
          }
          //上記までを追記
      }
      
    7. アプリ名ディレクトリで下記コマンドを実行してビューファイルを格納するディレクトリを作成する。

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

      $ touch resources/views/images/input.blade.php
      
    9. アプリ名ディレクトリで下記コマンドを実行して画像をアップロードするビューファイルを開く。

      $ vi resources/views/images/input.blade.php
      
    10. 開いたビューファイルを下記の様に記載する。

      アプリ名ディレクトリ/resources/views/images/input.blade.php
      @extends('layouts.app')
      
      @section('content')
      
      <!-- トリガー -->
      <form action="/upload/image" method="POST" enctype="multipart/form-data">
          @csrf
      
          <label for="photo">画像ファイル:</label>
          <input type="file" class="form-control" name="file">
          <br>
          <input type="submit">
      </form>
      @endsection
      
  6. 確認

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

      $ php artisan serve
      
    2. 下記にアクセスする。

    3. 下記のページが表示されることを確認する。

      Laravel.png

    4. 任意の画像ファイルを選択し「送信」ボタンを押下する。(送信ボタン押下後にエラーが403エラーが発生する場合は.envファイルの記載に誤りがあることが多い。その他のエラー原因はこちら→AWS S3 Laravel 画像ファイルアップロード時にエラーが発生する)

      Laravel.png

    5. S3のバケットのテストファイル直下に下記の様にファイルが格納されていることを確認する。(ファイル名はランダムになる。)

      S3_Management_Console_と_ec2-user_ip-172-31-12-2__var_www_html_test_と_下書き一覧_-_Qiita_と_credentials__1_.png

参考文献

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

【Laravel】指定の文字数以上の時、...としたい場合

はじめに

現在、社内向け質問アプリケーションを制作中です。
日々こつこつと機能を追加したり、改善したりしています。
こちらに開発からデプロイまでについてまとめているので、よろしければ是非見てみてください。
【未経験・独学】Laravelでアプリケーションの開発からAWSを用いたデプロイまで

今回は、長い文章に対して指定の文字数を超えた場合は、「...」と表示させたいと思い調べたことをここに記録します。

現状

現状はこのように、コメント文が全部表示されています。そのため、コメント欄の箇所のみバランスが悪くなっている。

コメント欄.PNG

そこで、100文字以上は...と表示させてコメント欄のサイズをある程度一定にしたいと思う。
調べてみたところ、ヘルパ関数のStr::limit()を使用することで解決ができると分かった。

Str::limit()とは?

Str::limit()とは、Laravelで用意されているグローバルヘルパ関数の一つである。
こちらの関数を使うことで指定した長さへ文字列を切り詰めることが出来る。

使い方としては、第一引数に対象の文字列、第二引数に指定の文字数、第三引数に最長文字数を超えた場合に末尾へ追加する文字列を指定する。
参考:Laravel 7.x ヘルパ

Str::limit()を使う前は、{{$reply->body}}と記載している。
Str::limit()を用いると、このようになる。

{{\Illuminate\Support\Str::limit($reply->body, 100, '...')}}

このようにStr::limit()を用いることで、コメントの文字数を一定にすることが出来ました。
コメント欄2.PNG

※注意点としては、指定する数字はマルチバイトを考慮しなければいけないということ。
日本語は、マルチバイト文字(2バイト以上のデータ量で表すもの)なため以下のようになってしまう。

Str::limit('確認用', '3', '...') //確...となる

参考
マルチバイト文字 【 多バイト文字 】
全142種類!Laravelヘルパー関数実例

まとめ

今回は、Laravelで指定の文字数以上の時、...としたい場合についてまとめました。
公式ドキュメントを見てみると、他にも沢山のヘルパ関数があったので色々見てみようと思います。

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

【Laravel】指定の文字数以上を文字列を表示するとき、「...」としたい場合

はじめに

現在、社内向け質問アプリケーションを制作中です。
日々こつこつと機能を追加したり、改善したりしています。
こちらに開発からデプロイまでについてまとめているので、よろしければ是非見てみてください。
【未経験・独学】Laravelでアプリケーションの開発からAWSを用いたデプロイまで

今回は、長い文章に対して指定の文字数を超えた場合は、「...」と表示させたいと思い調べたことをここに記録します。

現状

現状はこのように、コメント文が全部表示されています。そのため、コメント欄の箇所のみバランスが悪くなっている。

コメント欄.PNG

そこで、100文字以上は...と表示させてコメント欄のサイズをある程度一定にしたいと思う。
調べてみたところ、ヘルパ関数のStr::limit()を使用することで解決ができると分かった。

Str::limit()とは?

Str::limit()とは、Laravelで用意されているグローバルヘルパ関数の一つである。
こちらの関数を使うことで指定した長さへ文字列を切り詰めることが出来る。

使い方としては、第一引数に対象の文字列、第二引数に指定の文字数、第三引数に最長文字数を超えた場合に末尾へ追加する文字列を指定する。
参考:Laravel 7.x ヘルパ

Str::limit()を使う前は、{{$reply->body}}と記載している。
Str::limit()を用いると、このようになる。

{{\Illuminate\Support\Str::limit($reply->body, 100, '...')}}

このようにStr::limit()を用いることで、コメントの文字数を一定にすることが出来ました。
コメント欄2.PNG

※注意点としては、指定する数字はマルチバイトを考慮しなければいけないということ。
日本語は、マルチバイト文字(2バイト以上のデータ量で表すもの)なため以下のようになってしまう。

Str::limit('確認用', '3', '...') //確...となる

参考
マルチバイト文字 【 多バイト文字 】
全142種類!Laravelヘルパー関数実例

まとめ

今回は、Laravelで指定の文字数以上の時、...としたい場合についてまとめました。
公式ドキュメントを見てみると、他にも沢山のヘルパ関数があったので色々見てみようと思います。

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

Ruby on railsとLalavelどっちが良い?

技術選定の仕方

・自分のやりたい事が実現しやすい
・情報量が多い

プログラミングはあくまでも手段でしかなく、プロダクトの価値を最大化させることこそが目的である。またプログラミング言語は、基礎文法は少し変わるぐらいで大した差はない。言語に縛られるよりも、自分が言語に合わせて勉強していくほうが、プロダクトの価値も開発効率も上がる。

Ruby on railsを選びました

①scaffoldが便利
MVCの作成はrouteの設定までいい感じに自動で生成してくれる。

②情報量が多い!
ruby自体が日本発の言語ということもあり、qiitaの記事の数をはじめ日本語の説明の記事がlalavelよりも多い。

③コミュニティー内に参考にできるソースコードがある
身近にコードについて質問でき参考にできるコードがあるのは、めっちゃ楽。

Rails: ある程度の規模まではレールに乗ってサクサク作れるが、アプリケーションが成熟してきて「規約」にはないことをやりたくなってくると、途端に求められる技術力や難易度が跳ね上がる。
Laravel: アプリケーションの雛形はあるものの、どのクラスに何を担わせるかなど、設計については Rails 以上に早い段階で意識する必要がある。その設計さえイケていれば、だいたいのことはしっかり書ける。
Rails 歴5年の僕が Laravel で開発するようになって思ったこと。
https://note.com/kurashicom_tech/n/n32ab25910783

結論

僕のような初学者には、railsをおすすめします。railsのレールに乗りながら、まずはMVCの基礎を自分にインプットしていく。その後、lalalvelに挑戦!で良いかなと思う。
どちらの言語も実行コマンドは似ているし、Railsはgem、Laravelはcomposerを使えば各種プラグインも簡単に導入できるので、あまり差はないと感じます。
最後まで読んでいただきありがとうございます。

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

【Laravel】url生成(idなど使用)したページで、現在のページをリロードする方法

はじめに

フォロー・フォロー解除の機能を実装するときにはまった。
フォローボタンクリック → 同ページをそのままリロード
という動きを実現させたい。
方法が思いつかなくて手間取ったので記事にします。

通常のリロード方法

通常のページであればそのままurlを指定してリロードすればOK。

return redirect('/home');

ただし、今回リロードしたかったページが以下のようにidを使用したurlだったため、
urlに何をいればば良いかわからなくて困った。
/users/[id]

解決方法

以下のようにurl([url])を使用して変数を入れることで解決した
(そんなに難しいことでもなかった。。)

return redirect(url('/users',$request->follow_id));

まとめ

ページを普通にリロードする関数などあると思っていたが、どうやらないっぽい。
なんだか同じurlを打ち込んでリダイレクト、というのは力技感があって好きではないので、もしスマートなやり方があったらコメントで教えてください。

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