20200114のlaravelに関する記事は9件です。

Laravel5.5 にmdbootstrapをインストールする方法【How to install mdbootstrap on Laravel 5.5】

Laravel mixを使ってmdbootstrapをインストールします

install mdb

npm i mdbootstrap
npm i @fortawesome/fontawesome-free

無駄なのはいってますが、package.json

package.json
{
  "private": true,
  "scripts": {
    "dev": "npm run development",
    "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
    "watch": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
    "watch-poll": "npm run watch -- --watch-poll",
    "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
    "prod": "npm run production",
    "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
  },
  "devDependencies": {
    "cross-env": "^5.0.1",
    "jquery": "^3.2",
    "laravel-mix": "^4.0.7",
    "lodash": "^4.17.4",
    "resolve-url-loader": "^2.3.1",
    "sass": "^1.15.2",
    "sass-loader": "^7.1.0",
    "vue-template-compiler": "^2.6.11"
  },
  "dependencies": {
    "@fortawesome/fontawesome-free": "^5.12.0",
    "axios": "^0.19.1",
    "bootstrap": "^4.4.1",
    "chart.js": "^2.9.3",
    "mdbootstrap": "^4.11.0",
    "popper.js": "^1.14.3"
  }
}

setting bootstrap.js

resourece/asset/js/bootstrap.js
try {
    window.Popper = require('mdbootstrap/js/popper').default;
    window.$ = window.jQuery = require('mdbootstrap/js/jquery');
    require('mdbootstrap/js/bootstrap');
    require('mdbootstrap');
} catch (e) { }

import app.scss

app.scss
@import "~@fortawesome/fontawesome-free/css/all";

// Bootstrap
@import "../../../node_modules/mdbootstrap/css/style.css";
@import "~mdbootstrap/scss/mdb-free";
@import "../../../node_modules/mdbootstrap/css/bootstrap.min.css";

fin

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

laravelでカバー画像も表示できるブックレビューアプリを作った。※自分の学習用です

何を作った?

PHP、laravelの勉強として、カバー画像も表示できるブックレビューアプリを作りました。
まずpaizaラーニングを参考に掲示板アプリを作り、そこにGoogleBooksAPIsでマンガのカバー画像を引っ張ってきます。デプロイはまだです(挑戦したがうまくいきませんでした)。

基本的な機能はよくある掲示板アプリと同様です。なのでAPIを利用した画像の取得・利用について書きます。

レビューを投稿するまでの流れ(ログイン済みと想定)

①まず検索窓にマンガのタイトルを書きます。
②候補のカバー画像がいくつか出てきます。この画像はボタンになっていて、クリックして選択できます。
③画像を選択したらタイトルと本文を記入し、投稿して完成です。いいね!ボタンもあります。
僕は左側に画像、右にタイトルと本文を配置しました。

検索フォームを作る

getCover.blade.php
  {{ Form::model(['route' => ['article.getCover']]) }}
        <div class='form-group'>
            {{ Form::label('bookName', 'Book name:') }}
            {{ Form::text('bookName', null) }}
            {{ Form::submit('検索する', ['class' =>'btn btn-primary'])}}
        </div>
  {{ Form::close() }}

  <div class = 'form-group'>
          <a href={{ route('article.new') }}>戻る</a>
   </div>

bookNameはマンガのタイトル。下記のgetCoverメソッドに送る。

GoogleBooksAPIsの導入

下記を参考にしました。
書籍検索APIはGoogleBooksAPIsがオススメ【導入も楽ちんです】

書籍検索APIであるGoogle Books APIsの使い方(PHPでのサンプルコードあり)

PostController.php
<?php

namespace App\Http\Controllers;

use GuzzleHttp\Client;
use Illuminate\Http\Request;


class PostController extends Controller
{
  public function getCover(Request $request)
  {
    if($request->bookName){
      $content = $request->bookName;
      $data = "https://www.googleapis.com/books/v1/volumes?q=" . urlencode($content) . "&maxResults=5";
      $method = "GET";

      $client = new \GuzzleHttp\Client();

      $response = $client->request($method,$data,['http_errors' => false]);

      $posts = $response->getBody();
      $json_decode = json_decode($posts,true);

      return view('getCover', ['json_decode' =>$json_decode]);
    }else{
      $json_decode = "";
      return view('getCover', ['json_decode' =>$json_decode]);
    }

  }
}

受け取ったbookNameは\$contentに代入されます。
\$dataはGoogleBooksAPIs。タイトル名をそのまま埋め込むと正しくエンコードされないので、urlencode()に入れます。
APIを利用するために、下記を参考にhttpclientを使います。
【Laravel & Guzzle】APIの呼び出し方法をわかりやすく解説

画像をボタンとして表示する

getCover.blade.php
   @if ($json_decode)
      @foreach ($json_decode['items'] as $item)
          <form style="height:200px;width:200px;float:left" action="{{action('ArticleController@create')}}" method="get">
              <input type="hidden" value="{{ $item['volumeInfo']['imageLinks']['thumbnail'] }}" name="url">
              <button type="submit"><img src = "{{ $item['volumeInfo']['imageLinks']['thumbnail'] }}" ></button>
          </form>
      @endforeach
   @endif

ボタンを表示します。Formファザード は使っていません。foreachで複数件表示して、それぞれをボタンにします。
配列は入れ子になっていて、画像を表示するURLは\$json_decode['items']の中の['volumeInfo']の中の['imageLinks']の中にある['thumbnail']に格納されています。複数件取得することができるのでforeachを使用しています(['items']以下が複数件取得できます)。

課題この方法だと、配列が変化するとエラーになってしまいます。例えば、GoogleBooksAPIsを利用してJSONのデータを10件取得した場合、その中に配列['thumbnail']を含んでいないデータが一つでもある場合はエラーになってしまいます。いくつか方法は試したのですが、まだ解決できていません。

ArticleController.php
public function create(Request $request)
    { 
        $posts = $request->url;
        $message = 'New article';

        return view('new',['message' =>$message, 'posts' =>$posts]);
    }

送られた画像URLを\$postsに格納し、投稿編集画面に送ります。

タイトルと本文を書く

ArticleController.php
   <h1>edit review</h1>
   <p>{{$message}}</p>

   //下記に画像URL渡します。表示用。
   <img src={{$posts}}>

   //投稿フォーム
   {{ Form::open(['route' =>'article.store'])}}

//下記にも画像URL渡します。まだ保存はされていないので、このフォームでPOSTしてデータベースに保存します。
      <div class = 'form-group'>       
          {{ Form::hidden('url',$posts)}}
      </div>

       //レビューのタイトル。
      <div class = 'form-group'>
          {{ Form::label('title','Title:')}}
          {{ Form::text('title', null)}}
      </div>

      //レビュー本文。
      <div class = 'form-group'>
          {{ Form::label('content','Content:')}}
          {{ Form::text('content',null)}}
      </div>

      //このレビューを投稿するユーザー。このアプリではログインしたユーザーだけが投稿できます。
      //投稿画面にアクセスできるということは、このユーザーは既にログインしていると言えます。
      //なのでAuth::user()->nameを投稿者として、この記事のユーザー名にします。
      <div class='form-group'>
            {{ Form::label('user_name', Auth::user()->name) }}
            {{ Form::hidden('user_name',Auth::user()->name ) }}
        </div>

      <div class = 'form-group'>
          <a href={{ route('article.getCover') }}>画像検索</a>
      </div>

      <div class = 'form-group'>
          {{ Form::submit('作成する', ['class' =>'btn btn-primary'])}}
          <a href={{ route('article.list') }}>一覧に戻る</a>
      </div>
      {{ Form::close() }}

      //フォームが空欄の場合はフラッシュメッセージを表示します。
      @if (session('flash_message'))
            <div class="flash_message">
                {{ session('flash_message') }}
            </div>

ストアメソッドで保存する

ArticleController.php
public function store(Request $request, Article $article)
    {
        if($request->content != ""  && $request->title !=""){
          $article = new Article();
          $user = \Auth::user();

          $article->image_url = $request->url;
          $article->title = $request->title;
          $article->content = $request->content;
          $article->user_name = $request->user_name;
          $article->user_id = $user->id;
          $article->save();
          return redirect()->route('article.show',['id'=>$article->id]);
        }else{
          session()->flash('flash_message', '空欄を埋めてください');
          return redirect()->back();
      }
    }

上記のstoreメソッドで保存し、\$article->image_urlを表示するviewを作成します。
下記がルートになります。

web.php
//書籍名を検索する
Route::post('/article/getCover','PostController@getCover')->name('article.getCover');
//選択した画像を編集画面にgetで送る。
Route::get('/article/new','ArticleController@create')->name('article.new');
//新規投稿のレビューをデータベースに保存する。
Route::post('/article', 'ArticleController@store')->name('article.store');
//投稿したレビューを表示する。
Route::get('/article/{id}','ArticleController@show')->name('article.show');
//レビューを削除する
Route::delete('/article/{id}','ArticleController@destroy')->name('article.delete');
//投稿したレビューを再び編集する
Route::get('/article/edit/{id}', 'ArticleController@edit')->name('article.edit');
//必要無さそうだが、消すと何故かshowの方でエラーが出る。放置しても機能に影響無いが、気になる。
Route::get('/article/getCover','PostController@getCover');

課題 / 問題点

  • マイグレーションでエラーが発生したため、下記URLを参考にCSRFの仕組みを無効化することで対処しています。なので参考にされる際は注意してもられると。CSRFの仕組みを理解するため、今は生のPHPで掲示板を制作しています。順番おかしいですね。

 【Laravel】419のHTTPエラーが出た場合の対処法!

もっとわかりやすく書いた方がいいし、用語の使い方も修正した方がいいですよね。
もっと勉強して随時アップデートしたいです。

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

PHP-【Laravel】 Target class [App\Http\Controllers\Auth\ConfirmPasswordController] does not exist.エラー対策

Laravelのプロジェクトは6.0 から6.2にアップグレードした後、php artisan route:listを実行した時に起きた問題です。

現象

Laravel6.0 から6.2にアップグレードしてからphp artisan route:listをすると、下図のようにTarget class [App\Http\Controllers\Auth\ConfirmPasswordController] does not exist.エラーが出ました。
image.png

原因

laravelプロジェクトのApp\Http\Controllers\AuthフォルダーにConfirmPasswordController.phpがないのは直接原因です。6.0->6.2の差分で分かったのは、laravel6.0のコアアプリケーションにこのファイルがなかったようです。composer updateはlaravel frameworkをバージョンアップしただけで、コアの部分はアップグレードしなかったため、エラーが起きたのです。

解決方法

laravelプロジェクトからConfirmPasswordController.phpをダウンロードして、自分のApp\Http\Controllers\Authに入れます。

以上です。

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

Laravel classが見つからない autoloaderに変更を反映させる

自分用コピペ

参照元

これは、クラス名を急に変えたときなどにおこります。
特に、tableをartisanで作って後からスペルミスなどでクラス名を変えたときとかによくでてしまいます。

LaravelはAutoLoaderがあり、composerがクラス管理をしています。
そのため、composerの管轄外でクラス名等を変更するとおこるエラーです。
なので、解決策としてはcomposerにクラス名を変更したよと教えてあげればいいのですね。

以下が、そのコマンドです。

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

Laravel Migration 基礎

はじめに

  • Laravel Migration の基礎的な使い方のメモ

環境

Laravel

$ php artisan --version
Laravel Framework 5.8.16

Mysql

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.28    |
+-----------+
1 row in set (0.00 sec)

テーブルを追加して、Laravelで使う

① Table の作成

  • コマンドを実行し、 Created Migartion が返答で帰ってくれば、作成できている。
$ php artisan make:migration create_tests_table
> Created Migration: yyyy_MM_dd_HHmms_create_tests_table
  • 作成したファイルは、プロジェクト/database/migrations/ の直下に作成したファイルができている。
  • 上記のサンプルだと、『yyyy_MM_dd_HHmms_create_tests_table.php』というファイルができている。

② Migration ファイルの編集

  • ファイルができているので、追加したいカラムなどを設定していく
  • varchar(128)の name カラムを追加
  • unsigned int の number を追加
yyyy_MM_ddHHmmss_create_tests_table.php
class CreateTestsTable extends Migration
{
    public function up()
    {
        Schema::create('tests', function (Blueprint $table) {
            $table->bigIncrements('id');

            $table->string('name', 128)->nullable()
                ->comment('名前');          // varchar 文字長 128 
            $table->integer('number')->nedned()
                ->comment('番号');          // int 符号なし

            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('tests');
    }
}

③ Migration ファイルの実行

  • 実行すると、データベースに作成したテーブルができる
$ php artisan migrate
> Migrating: YYYY_MM_DD_ddHHmmss_tests_table
> Migrated:  YYYY_MM_DD_ddHHmmss_tests_table
  • テーブルができているか、Mysql 側で確認してみる
mysql> DESCRIBE tests;
+------------+---------------------+------+-----+---------+----------------+
| Field      | Type                | Null | Key | Default | Extra          |
+------------+---------------------+------+-----+---------+----------------+
| id         | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| name       | varchar(128)        | YES  |     | NULL    |                |
| number     | int(10) unsigned    | NO   |     | NULL    |                |
| created_at | timestamp           | YES  |     | NULL    |                |
| updated_at | timestamp           | YES  |     | NULL    |                |
+------------+---------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

④ Model を作成し、Laravelで使う

  • コマンドラインから Model の作成を行う
  • DB のテーブルを作成するときは複数形だったけど、クラスは単数に変更して作成する
$ php artisan make:model Models/Test
>Model created successfully.
  • 正常に実行できると プロジェクト/app/Models/ の下に Test.php が作成される

ロールバック

実行した migration ファイルをロールバックできる

  • 現状の migrations の実行状態に対して、batch 1まで戻りたい。
mysql> select * from migrations;
+----+-----------------------------------------------------+-------+
| id | migration                                           | batch |
+----+-----------------------------------------------------+-------+
| 1  | YYYY_MM_DD_HHIISS_create_test_logs                  |     1 |
| 2  | YYYY_MM_DD_HHIISS_create_sync_logs                  |     1 |
| 3  | YYYY_MM_DD_HHIISS_create_tests_table                |     2 |
| 4  | YYYY_MM_DD_HHIISS_add_column_check_type             |     3 |
+----+-----------------------------------------------------+-------+
  • 1 まで戻るには、2つ戻る必要がある。
  • なので migration:rollback コマンドの後ろに 引数を付けて2つ戻る
  • 引数なしで実行すると、一つ前のみしか戻らない
$ php artisan migrate:rollback --step=2
> Rolling back: YYYY_MM_DD_HHIISS_add_column_check_type
> Rolled back:  YYYY_MM_DD_HHIISS_add_column_check_type
> Rolling back: YYYY_MM_DD_HHIISS_create_tests_table
> Rolled back:  YYYY_MM_DD_HHIISS_create_tests_table
  • 正常に戻ったか確認する
mysql> select * from migrations;
+----+-----------------------------------------------------+-------+
| id | migration                                           | batch |
+----+-----------------------------------------------------+-------+
| 1  | YYYY_MM_DD_HHIISS_create_test_logs              |     1 |
| 2  | YYYY_MM_DD_HHIISS_create_sync_logs                  |     1 |
+----+-----------------------------------------------------+-------+
  • 本当に消えたか念のため、テーブルある確認。なければおっけ〜
mysql> DESCRIBE tests;
ERROR 1146 (42S02): Table 'tests' doesn't exist
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Vue.jsを参考に、BladeファイルにJavaScript, CSSをまとめてみる。

Vue.jsの開発者的メリット

  • HTML, JavaScript, CSSを1つのファイルに記述するというのがシンプルで良い
  • scopedが便利
  • コードが複雑化しにくい

そして思ったのです。
これって普通のアプリケーションにある程度応用できそう。

実際に考えてみる

ちょっと考えてみました。方針としては、

  • 仕様に応じてBladeのディレクトリ構成をシンプルに考える
  • JavaScript, CSSはBladeのディレクトリ構成に合わせる。
  • 影響範囲は対応するBladeファイル内にとどまるように気をつける。

Bladeファイルのディレクトリ構成

サンプルです。実際には画面仕様などにより異なるはずです。

  • ルール
    • views/直下は、layouts/および、メニューに対応するディレクトリ(menus/を作ろうと思ったが階層が深くなりすぎるのが嫌なので却下)
    • メニューごとのディレクトリには、ページに対応するbladeファイルがある
    • メニューごとのディレクトリには、parts/があり、ページを構成する部品を格納する。
    • formやbuttonなどの部品はparts/に格納する。
    • ページに対応するファイルからは、parts/配下のファイルをincludeする。
    • parts/配下のファイルからは、parts/配下のファイルををincludeする
    • ページに対応するファイルから、parts/配下の部品をincludeしない
    • 同階層のファイルをincludeしない
resources/
- views/
    - layouts/
        - app
        - parts/
            - header
            - footer
    - home/
        - index
        - parts/
            - eye_catching
            - new_product
    - product/
        - index
        - show
        - edit
        - parts/
            - product
            - details
    - account/
        - show
        - edit
        - parts/
            - table
    - parts/
        - forms/
            - radio
            - checkbox
        - buttons/
            - search
            - submit
            - delete
        - flash_message

JavaScriptとCSS(Sass)は、Bladeファイルと同じディレクトリ構成

JavaScript, CSS(Sass)はBladeファイルと同じディレクトリ構成とします。

resources/
- js
    - modules/
        - confirm
    - layouts/
        - app
        - parts/
            - header
    - ...

- sass
    - layouts/
        - app
        - parts/
            - header
    - ...

Bladeファイルに、JavaScriptとCSSを記述する。

まず、レイアウトファイル

layout/app.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">

  {{-- CSRF Token --}}
  <meta name="csrf-token" content="{{ csrf_token() }}">

  {{-- title --}}
  <title>@yield('title', 'laravel app')</title>

  {{-- 対応するCSSファイル --}}
  <link rel="stylesheet" href="{{ mix('css/layouts/app.css') }}">

  {{-- include先のcssファイルがここに追加される --}}
  @yield('css')
</head>
<body>

  @include('layouts.parts.header')

  <div id="container">
    @yield('content')
  </div>

  @include('layouts.parts.footer')

  {{-- 対応するJSファイル --}}
  <script src="{{ mix('js/layout/app.js') }}"></script>

  {{-- include先のJSファイルがここに追加される --}}
  @yield('js')

</body>
</html>

そして、includeするファイル

layouts/parts/header.blade.php
@section('css')
  <script src={{ mix('/js/layouts/parts/header.css') }}>
@endsection

@section('js')
  <script src={{ mix('/js/layouts/parts/header.js') }}>
@endsection

<header>
  <div>ヘッダー</div>
</header>

これでOKと思ったのですが、これでは、include先に記述されたJavaScript, CSSが反映されません。
そこで@stack - @pushを利用します。

layout/app.blade.php
<head>
  (省略)

  {{-- include先のcssファイルがここに追加される --}}
  @stack('css')
</head>

<body>
  (省略)

  {{-- include先のJSファイルがここに追加される --}}
  @stack('js')
</body>
layouts/parts/header.blade.php
@push('css')
  <script src={{ mix('/js/layouts/parts/header.css') }}>
@endpush

@push('js')
  <script src={{ mix('/js/layouts/parts/header.js') }}>
@endpush

<header>
  <div>ヘッダー</div>
</header>

これで、include先で記述されたJavaScript, CSSファイルが反映されるようになりました。
ただし、同じファイルを複数回includeすると回数分JavaScript, CSSが読み込まれてしまいます。

home/index.blade.php
  // deleteボタンを複数回includeすると回数分JavaScript, CSSが読み込まれる。
  @include('parts.buttons.delete')
  @include('parts.buttons.delete')
  @include('parts.buttons.delete')

ですので、1度だけ読み込むように、カスタムディレクティブを設定します。
参考: bladeのcomponent化による再利用

app/Providers/AppServiceProvider.php
/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    \Blade::directive('pushonce', function ($expression) {
        $var = '$__env->{"__pushonce_" . md5(__FILE__ . ":" . __LINE__)}';

        return "<?php if(!isset({$var})): {$var} = true; \$__env->startPush({$expression}); ?>";
    });

    \Blade::directive('endpushonce', function ($expression) {
        return '<?php $__env->stopPush(); endif; ?>';
    });
}
layouts/parts/header.blade.php
@pushonce('css')
  <script src={{ mix('/js/layouts/parts/header.css') }}>
@endpushonce

@pushonce('js')
  <script src={{ mix('/js/layouts/parts/header.js') }}>
@endpushonce

<header>
  <div>ヘッダー</div>
</header>

レイアウトファイルも少し修正します。
includeする前に@stackを記述するとその時点では、pushされるファイルがないので、
include先のファイルが反映されません。
そのため、bodyの閉じタグの直前に記述します。(ここは少し悩ましいところです。。。)
参考: Blade Stacks in Sub-View

layout/app.blade.php
<head>
  (省略)

  // ここだとinclude先のファイルが反映されない
  {{-- @stack('css') --}}
</head>

<body>
  (省略)

  {{-- include先のcssファイルがここに追加される --}}
  @stack('css')

  {{-- include先のJSファイルがここに追加される --}}
  @stack('js')
</body>

これで、include先のファイルも反映されるようになります。

なお、CSSは原則そのファイルにしかスタイルが適用されないよう、
スコープを限定するように記載します。

home/index.scss
// home/index.blade.php
// <div class="home-index">
//   <div class="test-class">
//     コンテンツ
//  </div>
// </div>

.home-index { // スコープを限定する
  .test-class {

  }
}

以上です。

参考

bladeのcomponent化による再利用
Blade Stacks in Sub-View
Blade Templates

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

【Laravel】セルを連結して検索

Laravel6.0

登録したユーザーの氏名(family_name)と名前(last_name)を連結してLike検索をしたいときなど。

データベース:クエリビルダ 6.x Laravel

時々、クエリの中でSQLを直接使用したいことがあります。エスケープなしのSQLを使用する場合はDB::rawメソッドを使用します。

DB::rawメソッドはエスケープ処理がされていないのでSQLインジェクションに注意。

CONCAT関数を使用する。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 12.5 文字列関数

 User::where(DB::raw('CONCAT(family_name, last_name)'), 'like', '%'.$text.'%')->get();

参考

【Laravel】EloquentクエリでCONCAT関数を使う | 84LIFEブログ

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

windows,homestead,laravel環境にphpmyadminを接続しようとしたらハマった。

このサイトを参考にして、タイトルの環境化でsqliteからphpmyadminを接続しなおしてみました。
https://qiita.com/r-kawanishi/items/f12741bebd398d791114
基本的には上記サイトのまんまやったのですが、少し躓いたので備忘録を残しておきます。phpmyadminを開き、php artisan migrate:refreshをたたくと以下のエラーを吐きました。

エラー文↓

$ php artisan migrate:refresh

   Illuminate\Database\QueryException  : SQLSTATE[HY000] [2002] 対象のコンピューターによ
って拒否されたため、接続できませんでした。
 (SQL: select * from information_schema.tables where table_schema = homestead and table_name = migrations and table_type = 'BASE TABLE')

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

  Exception trace:

  1   PDOException::("SQLSTATE[HY000] [2002] 対象のコンピューターによって拒否されたため 
、接続できませんでした。
")
      C:\Users\retur\dev_workspace\laravel\practice\code\laravelyoutube\vendor\laravel\framework\src\Illuminate\Database\Connectors\Connector.php:70

  2   PDO::__construct()
      C:\Users\retur\dev_workspace\laravel\practice\code\laravelyoutube\vendor\laravel\framework\src\Illuminate\Database\Connectors\Connector.php:70

  Please use the argument -v to see more details.

この 「対象のコンピューターによって拒否されたため 、接続できませんでした。」
を参考にググると以下のサイトが https://teratail.com/questions/158477
それを参考にして、.envファイルを編集しました。

.env

APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:VTiFYU4BPohmbw0xMJdXiGGCDfkDrM0MzpiTJW9cxBk=
APP_DEBUG=true
APP_URL=http://localhost

LOG_CHANNEL=stack

DB_CONNECTION=mysql
#DB_HOST=127.0.0.1
DB_HOST=192.168.10.10 //★hostの番号を変える
DB_PORT=3306
DB_DATABASE=homestead 
DB_USERNAME=homestead //★デフォルトなので、ここも固定
DB_PASSWORD=secret  //★ここもデフォルトなので、固定

BROADCAST_DRIVER=log
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=cookie
SESSION_LIFETIME=120

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_DRIVER=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_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-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}"

Homestead.yaml
ip: 192.168.10.10
memory: 2048
cpus: 2
provider: virtualbox
authorize: ~/.ssh/id_rsa.pub
keys:
    - ~/.ssh/id_rsa
folders:
    -
        map: 'C:\Users\retur\dev_workspace\laravel\practice\code\laravel-document'
        to: /home/vagrant/code
sites:
    -
        map: homestead.test
        to: /home/vagrant/code/public
    -   
        map: homestead.phpmyadmin
        to: /usr/share/phpmyadmin
databases:
    - homestead
    - laravel70 //★ここを編集しました。
features:
    -
        mariadb: false
    -
        ohmyzsh: false
    -
        webdriver: false
name: laravel-document
hostname: laravel-document
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

GASで翻訳API作成してLaravelで叩くまで

はじめに

この記事では

GASで英語から日本語に翻訳するAPIを作成しLaravelで結果を取得までします

GASを作成

こちらの記事を参考に作成しました
3 分で作る無料の翻訳 API with Google Apps Script

controllerを作成

一部抜粋

TransController.php
    public function index() {

        $transApiUrl = '公開したAPIのURL';
        $transSource = 'en'; // 翻訳前の言語
        $transTarget = 'ja'; // 翻訳語の言語
        $transText = "Hello"; // 翻訳する文字

        $transApiUrl .= '?text=' . urlencode($transText);
        $transApiUrl .= '&source=' . $transSource;
        $transApiUrl .= '&target=' . $transTarget;

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $transApiUrl);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        $res = curl_exec($ch);
        curl_close($ch);



        return $res;
    }

GASの翻訳APIを叩く際に翻訳するテキスト量が多い際に
Moved Temporarily
The document has moved here.

と出ることがあります
これは

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
この記載を追加することで回避できます

叩いてみる

APIの配下にcontrollerを作成したので
ルーティングを以下に追記

api.php
Route::get('trans', 'Api\TransController@index')->name('trans');

http://127.0.0.1:8000/api/transにアクセス

結果

{"code":200,"text":"こんにちは"}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む