- 投稿日:2020-01-14T23:38:30+09:00
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.jstry { 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
- 投稿日:2020-01-14T16:43:32+09:00
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.phppublic 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.phppublic 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エラーが出た場合の対処法!
もっとわかりやすく書いた方がいいし、用語の使い方も修正した方がいいですよね。
もっと勉強して随時アップデートしたいです。
- 投稿日:2020-01-14T15:08:35+09:00
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.エラーが出ました。
原因
laravelプロジェクトのApp\Http\Controllers\AuthフォルダーにConfirmPasswordController.phpがないのは直接原因です。6.0->6.2の差分で分かったのは、laravel6.0のコアアプリケーションにこのファイルがなかったようです。composer updateはlaravel frameworkをバージョンアップしただけで、コアの部分はアップグレードしなかったため、エラーが起きたのです。
解決方法
laravelプロジェクトからConfirmPasswordController.phpをダウンロードして、自分のApp\Http\Controllers\Authに入れます。
以上です。
- 投稿日:2020-01-14T13:22:17+09:00
Laravel classが見つからない autoloaderに変更を反映させる
自分用コピペ
これは、クラス名を急に変えたときなどにおこります。
特に、tableをartisanで作って後からスペルミスなどでクラス名を変えたときとかによくでてしまいます。LaravelはAutoLoaderがあり、composerがクラス管理をしています。
そのため、composerの管轄外でクラス名等を変更するとおこるエラーです。
なので、解決策としてはcomposerにクラス名を変更したよと教えてあげればいいのですね。以下が、そのコマンドです。
composer dump-autoload
- 投稿日:2020-01-14T11:34:19+09:00
Laravel Migration 基礎
はじめに
- Laravel Migration の基礎的な使い方のメモ
環境
Laravel
$ php artisan --version Laravel Framework 5.8.16Mysql
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.phpclass 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 の実行状態に対して、
batch1まで戻りたい。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
- 投稿日:2020-01-14T11:20:24+09:00
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_messageJavaScriptと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-Viewlayout/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
- 投稿日:2020-01-14T10:20:36+09:00
【Laravel】セルを連結して検索
Laravel6.0
登録したユーザーの氏名(family_name)と名前(last_name)を連結してLike検索をしたいときなど。
時々、クエリの中で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();参考
- 投稿日:2020-01-14T03:33:09+09:00
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.yamlip: 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
- 投稿日:2020-01-14T02:06:18+09:00
GASで翻訳API作成してLaravelで叩くまで
はじめに
この記事では
GASで英語から日本語に翻訳するAPIを作成しLaravelで結果を取得までします
GASを作成
こちらの記事を参考に作成しました
3 分で作る無料の翻訳 API with Google Apps Scriptcontrollerを作成
一部抜粋
TransController.phppublic 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.phpRoute::get('trans', 'Api\TransController@index')->name('trans');
http://127.0.0.1:8000/api/transにアクセス結果
{"code":200,"text":"こんにちは"}
