- 投稿日:2019-12-05T23:33:28+09:00
Laravelで画像サイズを変更して保存する方法がめちゃめちゃ簡単だった話
はじめまして!qiita初投稿です?
最近Laravelで開発することが増えてきて、その中でも便利だなーと思った「画像サイズの圧縮」について書きます。
随時間違っている部分などは訂正していくと思います。ご指摘もいただけると嬉しいです?
開発環境
PHP 7.3.11
Laravel Framework 6.5.1
Composer version 1.9.1Laravelで画像処理をする。
今回自分は「interventionImage」というパッケージを利用して、画像サイズを小さくして保存を実装しました。
interventionImageはphpの画像処理ライブラリGD LibraryとImagickをサポートしています。
自分はGD Libraryを使用して実装しました。
GD Libraryのインストール方法は環境によっても変わってくると思うので、お使いの環境に合わせてインストールしてください。
実装までの流れ
interventionImageの公式はこちら
http://image.intervention.io/getting_started/installation#laravel実装の流れとしては、
1.パッケージのインストール。
2.Laravelで使用できるようにセットアップ。
3.実際に画像サイズを変更してみる。1.Laravelにintervention/imageをインストールする。
composerを使ってintervention/imageをインストール。
composer require intervention/image
2.セットアップ
InterventionImageをインストールしたら、Laravel構成ファイル
config/app.php
を開き、providers配列とaliases配列に次の行を追加します。providers配列に、このパッケージのサービスプロバイダーを追加。
Intervention\Image\ImageServiceProvider::class,
このパッケージのファサードをaliases配列に追加。Imageだとモデルとして定義したクラスと被りそうだったので、InterventionImageとしてaliasを保存。
'InterventionImage' => Intervention\Image\Facades\Image::class,
config/app.php~前略~ 'providers' => [ ~中略~ // Add Intervention Image. Intervention\Image\ImageServiceProvider::class, ], 'aliases' => [ ~中略~ 'Hash' => Illuminate\Support\Facades\Hash::class, // Add Intervention Image. 'InterventionImage' => Intervention\Image\Facades\Image::class, ~後略~3.実際に画像サイズを変更してみる。
今回は画像のアスペクト比をそのままで保存しつつ、横幅を1080pxにしました。
config/PostsController.php//エイリアスに追加したファサードを呼び出す。 use \InterventionImage; ~中略~ //formからの画像リクエストはimagefileで受け付けしたのでimagefileを設定しています。formに合わせて変更してください。 $file = $request->file('imagefile'); $name = $file->getClientOriginalName(); //アスペクト比を維持、画像サイズを横幅1080pxにして保存する。 InterventionImage::make($file)->resize(1080, null, function ($constraint) {$constraint->aspectRatio();})->save(public_path('/images/' . $filename ) );;ちなみに、横幅と高さを指定する場合はもう少しシンプルにできます。
InterventionImage::make($file)->resize(1080, 700)->save(public_path('/images/' . $filename ) );;
resize
で画像の大きさを指定するだけだったので、めっちゃ簡単だなーと思いめっちゃ感動しました。まとめ
少し面倒だと思ってた画像のresizeが、かなりシンプルな書き方で実装できて感動しました?
とはいえqiitaの初投稿もできたので、これきっかけでqiitaへの投稿を増やして行けたらいいなーと思いました!
- 投稿日:2019-12-05T21:19:38+09:00
Laravelで作ったファイルアップローダーEuropaのデータ管理ついて
カルネージハート Advent Calendar 2019 1日目の記事です。
カルネージハートEXAの公式アップローダーSATLOKEはお亡くなりになりました。
が、代替アップローダーでEuropaを運営しております。M2です。
Europaのデータ管理について
通常ファイルアップローダーはS3などで管理することが多いと思いますが、Europaについてのファイル管理は直接バイナリをDBに投入して管理しております。
なぜか、、、Herokuだからです。。。
HerokuでもS3使えるやーん的なツッコミあると思いますが、作った当初はノウハウがなくというか知識gただLaravelだとバイナリデータ取り出してそのままDBに入れると上手くはいりません...
そこでバイナリデータをラージオブジェクト (LOB)としてInsertしています。
migrationFile.phppublic function up() { Schema::create('files', function (Blueprint $table) { $table->increments('id'); $table->binary('file_data'); }); }//$hogeFileはリクエストから取得したFileデータ $fileData = file_get_contents($hogeFile); //Laravel/homesteadではPostgreSQLはpgsqlとして設定 $db = DB::connection('pgsql')->getPdo(); $stmt = $db->prepare("INSERT INTO files (file_data) VALUES (?)"); $stmt->bindParam(1, $fileData, $db::PARAM_LOB); $stmt->execute(); unset($db);これで無事バイナリデータがDBに投入できます!
最後に
今回カルネージハート Advent Calendar 2019を始動しました。
事実上の最新作EXAが2010年に発売以降続編の情報が皆無ですが、一部の熱狂的ファンは大会を開催してゲームを続けています。ゲームを盛り上げることで続編も出るかもしれません。カルネジスト、ネジらーの皆様のご協力をお願いします!
カルネージハートファンのプログラミング知識を共有しましょう!
腹筋ミサイル回避でお茶を濁します
- 投稿日:2019-12-05T20:24:53+09:00
自作したWebページをCSSでダークモードにする
序文
最近のiosアップデートでiphoneをダークモードに設定できるようになりました。私個人的にはダークモードの方が好みであり、自分自身のiphone,iPad,MacBookも全てダークモードに設定しております。
そこでふと自身で作成したWebページやポートフォリオをダークモードにできないかと思い、調べて見たところ簡単に設定する事ができましたので、下記に共有いたします。コード
閑話休題、styleの中に下記を追加するだけです。
現在主要なブラウザ、crome,firefox,safariでは対応している模様です。<style> @media (prefers-color-scheme: dark) { body{ background-color: #000; color: #aaa; } } </style>使用例
実際に私の簡単なサイト内で試して見ましたので画像を共有いたします。
*MacBookAir(2018)をダークモードの設定状態で、ブラウザはcromeを使用しております。
*サイトはちなみに自身の本管理用途をして,laravel(+vue,jquery)で作成したものです。最後に
以上WebページをCSSでダークモードにする方法でした。
なんとなくダークモードの方がテンション上がる気がする笑
- 投稿日:2019-12-05T19:35:59+09:00
npm run watchエラーになった場合
環境
Laravel 5.8
node v13.30
npm 6.13.1
webpack.mix.js問題点
プロジェクト下のターミナルで npm run watch をすると
$ npm run watch npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! @ watch: `NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js` npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the @ watch script. npm ERR! This is probably not a problem with npm. There is likely additional logging output above. npm ERR! A complete log of this run can be found in: npm ERR! /Users/emisub/.npm/_logs/2019-12-05T10_11_33_711Z-debug.logこのようなエラーが出てくる。
実は何度かこのエラーに遭遇していて大抵node modulesを再インストールすれば直ることがわかっていたが、この際まとめておこうと思います。
解決策
以下のコマンドを入力する
* インストールされたjsモジュールを全部消す rm -rf node_modules * npmのキャッシュをクリア npm cache clear --force * 再度モジュールを入れ直して実行 npm install npm run watch
- 投稿日:2019-12-05T18:17:44+09:00
【Laravel 6.x】マイグレーションでMySQLデータベースのテーブルを作成・編集する
Laravelではデータベースのテーブルを作成・編集する方法としてマイグレーションという仕組みが用意されている。
前提
- Laravel 6.6.1
- PHP7.3
- MySQL 5.6
マイグレーションの流れ
マイグレーションの流れは大まかに言えば、次の3ステップ。
- マイグレーションファイルを作成する
- マイグレーションファイルを編集する
- マイグレーションを実行する
1.マイグレーションファイルを作成する
マイグレーションファイルを作成するには、
php artisan make:migration
コマンドを使う。テーブルを新規作成する場合とテーブルを編集する場合でオプションが異なる。1-1.テーブルを新規作成する場合
コマンド$ php artisan make:migration 名前 --create=テーブル名このコマンドを実行すると
タイムスタンプ_名前.php
のファイル名で、database/migrations
にファイルが作成される。例えば、名前を
create_users_table
、テーブル名がusers
とすると、コマンドは以下のようになる。コマンド例$ php artisan make:migration create_users_table --create=users上記をコマンドを実行すると、
database/migrations
に2019_12_05_000000_create_users_table.php
が作成される。1-2.テーブルを編集する場合
コマンド$ php artisan make:migration 名前 --table=テーブル名このコマンドを実行すると
タイムスタンプ_名前.php
のファイル名で、database/migrations
にファイルが作成される。例えば、名前を
add_api_token_column
、テーブル名がusers
とすると、コマンドは以下のようになる。コマンド例$ php artisan make:migration add_api_token_column --table=users上記をコマンドを実行すると、
database/migrations
に2019_12_05_083543_add_api_token_column.php
のような名前のファイルが作成される。2.マイグレーションファイルを編集する
作成したマイグレーションファイルと開くと、以下のようになっている。
up
メソッドとdown
が出来ている。作成したファイル例:2019_12_05_083543_add_api_token_column.php<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class AddApiTokenColumn extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::table('users', function (Blueprint $table) { // }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('users', function (Blueprint $table) { // }); } }
up
メソッドには追加したい作業を記述し、down
メソッドにはup
メソッドの内容を元に戻す作業を記述する。それぞれSchema::table()
が作成されている。テーブルを作成する、すなわち、make:migration
のオプションを--create
にすると `Schema::create()' が作成されている。例にupメソッドとdownメソッドを追加<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class AddApiTokenColumn extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::table('users', function (Blueprint $table) { // api_token カラムを password カラムの次に追加。 // ユニークキーを追加し、 // NULL を許可で、デフォルトをNULLにする。 $table->string('api_token', 80)->after('password') ->unique() ->nullable() ->default(null); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('users', function (Blueprint $table) { // api_token カラムを削除 $table->dropColumn('api_token'); }); } }3.マイグレーションを実行する
以下の
php artisan migrate
コマンドを実行することで、マイグレーションファイルの内容がデータベースに反映される。同時にデータベースのmigrations
テーブルにファイル名と実行順序が保存される。コマンド$ php artisan migration
以下のように
Migrating
やMigrated
が表示されたらOK。コマンド実行後の例Migrating: 2019_12_05_083543_add_api_token_column Migrated: 2019_12_05_083543_add_api_token_column (0.01 seconds)
- 投稿日:2019-12-05T17:56:53+09:00
Laravel view composerでロジックを一箇所にまとめよう!
この記事について
あらすじ
自社サービス開発の中で共通でuser情報を使い回している箇所があり、その部分が煩雑な書き方になっていたので、処理をどこか一つにまとめたいと思っていました。
やりたい事
- 共通でuser情報を使い回しているを共通化する。
- ヘッダーのbladeファイル以外でサイドバーなどの箇所でもuser情報を使いたい。
やってみた事
- Laravel view composerを使って、処理を共通化する。
view composerとは?
ビューコンポーザはビューがレンダーされる時に呼び出される、コールバックかクラスメソッドのことです。 ビューがレンダーされるたびに結合したい情報があるなら、ビューコンポーザがロジックを一箇所にまとめるのに役立ちます。
処理イメージ図
どんな時に使うのか?
サイドバーなどすべてのページで共通するデータを表示したい時。
ビューロジックはできればコントローラーに書きたくないし、テンプレートもできるだけロジックを入れず、綺麗なhtmlのままでありたい。
コントローラーの肥大化を防ぎたい。
実装方法
実装手順
- ①サービスプロバイダーの用意
- ②app/config.phpに登録
- ③Composerクラスの作成
- ④SeriviceProviderへの設定
- ⑤bladeファイルの修正
①サービスプロバイダーの用意
$ php artisan make:provider ViewComposerServiceProvider
を実行して、サービスプロバイダーを生成する。<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use View; /** * Class ViewComposerServiceProvider * @package App\Providers */ class ViewComposerServiceProvider extends ServiceProvider { /** * */ public function boot() { } /** * Register any application services. * * @return void */ public function register() { // } }②app/config.phpに登録
「config/app.php」へ下記のようにSeriviceProviderを登録する
<?php 'providers' => [ App\Providers\ViewComposerServiceProvider::class, ],③Composerクラスの作成
「app/Http/ViewComposers」という形でディレクトリを作成し、ViewComposersディレクトリの中に「LayoutComposer.php」を作成します。
<?php namespace App\Http\ViewComposers\User\Worker; use Auth; use Illuminate\View\View; /** * Class LayoutComposer * @package App\Http\ViewComposers\User\Worker */ class LayoutComposer { /** * @param View $view */ public function compose(View $view) { $view->with([ 'loginUser' => Auth::user(), ]); } }④SeriviceProviderへの設定
bootメソッドにViewComposerが値を渡すviewを、View::composersメソッドを使って指定します。
<?php namespace App\Providers; use App\Http\ViewComposers\User\Agent as Agent; use App\Http\ViewComposers\User\FriendRecommendComposer; use App\Http\ViewComposers\User\Worker as Worker; use Illuminate\Support\ServiceProvider; use View; /** * Class ViewComposerServiceProvider * @package App\Providers */ class ViewComposerServiceProvider extends ServiceProvider { /** * */ public function boot() { View::composers([ Agent\LayoutComposer::class => 'agent.*', Worker\LayoutComposer::class => 'worker.*', FriendRecommendComposer::class => 'user.friend_recommend.block', ]); } /** * Register any application services. * * @return void */ public function register() { // } }⑤bladeファイルの修正
$loginUserの変数を該当箇所に書く
<?php <div class="user-block"> <div class="img-wrap"> <img src="{{ $loginUser->userProfile->image->url }}" alt=""> </div> <div class="user-name">{{ $loginUser->userProfile->display_name }}</div> <div class="user-type">{{ \App\Enums\UserRole::toJapanese($loginUser->userProfile->role) }}</div> </div>まとめ
- 共通で使うような変数やロジックがあればview composerにまとめよう!
参考記事
- 投稿日:2019-12-05T16:46:25+09:00
ログイン必須なLaravelシステムでファイルの保存と取得を行う
ログイン必須なLaravelシステムでファイルの保存と取得を行う
ログイン必須なLaravelシステムでファイルの保存と取得の方法を軽く調べてみました。
要約
だいたいドキュメントに書いてある。。。
- Storageを使う
- ファイルの操作はLaravelのドキュメントの通り。
- ファイルの保存場所のシンボリックリンクをpublicに作らない
- コントローラでファイルを取得して返すやりたいこと
- Laravelでファイルの保存と取得
- ファイルはログイン済みのユーザのみが見れる
- 非ログインユーザは見れない
方法
authのミドルウェアを指定したコントローラを経由してファイルを返すようにする。
ファイルの保存
use Illuminate\Support\Facades\Storage; Route::group(['middleware' => 'auth'], function() { Route::get('/', function() { $content = "hello world\n"; Storage::put('test.txt', $content); return "saved!"; }); });これで
$content
の内容がstorage/app/text.txt
に保存される。ファイルの取得
use Illuminate\Support\Facades\Storage; Route::group(['middleware' => 'auth'], function() { Route::get('/test.txt', function() { $content = Storage::get('test.txt'); return $content; }); });最後に
簡単にできた。あとは、コントローラでファイルに対しての認可を行ったりすれば、もっと複雑なことができそうです。
- 投稿日:2019-12-05T14:13:57+09:00
マークダウンエディタSimpleMDEを使ってみた!
はじめに
最近バッグログのwiki機能を触っている際に、これ、自分でも作れるんじゃね?
と思ったので、色々調べてみると、良さげなエディタを見つけたので使ってみることにした。Simple MDEとは?
JavaScriptのMarkdownエディターです。
公式ページ選んだ理由
- シンプルでわかりやすいUI
- 記載しながらリアルタイムでプレビューしてくれる書きやすさ
- 導入のしやすさ
画像で見て取れるように、太字にしたい箇所や見出しにしたい箇所などがわかりやすく、
リアルタイムでプレビューしてくれるので、見やすいし、描きやすい。
なおかつ導入には数コードですむため、初期導入にもってこいの印象環境
Laravel Framework 5.8.35
PHP 7.1.23 (cli)simpleMDEはcdnで読み込むことにする
基本サイトはlaravelで組んでいるのでlaravel上で動くことを確認コード
create.blade.php<textarea id="body" name="name" rows="8" cols="40"></textarea> <link rel="stylesheet" href="https://cdn.jsdelivr.net/simplemde/latest/simplemde.min.css"> <script src="https://cdn.jsdelivr.net/simplemde/latest/simplemde.min.js"></script> <script> var simplemde = new SimpleMDE({ element: document.getElementById("body") }); </script>問題発生
laravel上で読まれているjsかソースの順番からか、jsの読み込み順が前後したっぽい。
なので、domが生成されるのを待って実行することにcreate.blade.php<link rel="stylesheet" href="https://cdn.jsdelivr.net/simplemde/latest/simplemde.min.css"> <script src="https://cdn.jsdelivr.net/simplemde/latest/simplemde.min.js"></script> <script src="https://code.jquery.com/jquery-3.3.1.js"></script> <script> $(document).ready(function(){ var simplemde = new SimpleMDE({ element: document.getElementById("body") }); }); </script>できたーーーー!!!
感想
導入はトラブルもあったがめっちゃ簡単にできた。
色々オプションもあるらしいので調べながら使ってみたい。まあそりゃそうだけどマークダウンのテキストそのままポストされるので、それを保存したらいいかも。
今後も色々試してみる。
- 投稿日:2019-12-05T10:08:16+09:00
【Laravel】routes.phpでDBから値を取得する
routes.phpからレコードの値を取ってきてそのままviewへ表示させたい、という部分があったので、メモ程度に書きます。
環境
PHP : 5.6.30
MySQL : 10.1.21
Laravel : 5.1.46テーブル
以下サンプルテーブルです。
wordsテーブル
id message 1 Hello 2 こんにちは コード
route.phpRoute::get('/', function () { // cookieからidを設定する if ($_COOKIE['lang'] == 'en') { $id = 1; } else { $id = 2; } // DB::table()を使用して値を取得する $query = DB::table('words') ->select('message') ->where('id', $id) ->first(); $message = $query->message return view('main',['message' => $message]); }main.blade.php<!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> {{$message}} </body> </html>bladeの方はおまけ的な感じですが、一応念のため。
- 投稿日:2019-12-05T00:01:54+09:00
Laravel コントローラーからビューを表示
ビューの作成
resources/views
にindex.blade.phpファイルを作成する。
書き方に関しては下記参照
https://blog.hiroyuki90.com/articles/laravel-blade///変数を展開する場合 <h1>{{ $hello }}</h1>コントローラーの作成
app/Http/Controllers
にコントローラーを作成する。HomeControlller.php<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\View; class HomeController extends Controller { public function index() { $hello = 'Hello World'; return view('index', ['hello' => $hello]); //1つ目の引数にディレクトリとファイル名指定 //2つ目の引数でビューに$hello変数を渡す } }viewヘルパを使用する際は
use Illuminate\Support\Facades\View;
を記載しないとエラーが出てしまう。
view
ヘルパの中でresources/views
にサブディレクトリを作成する際はドット記法を使い記述する。HomeController.phpreturn view('admin.index', ['hello' => $hello]);1つ目の引数の
index
の部分がblade.phpのファイル名
2つ目の引数のhello
の部分がblade.phpファイルの中の変数を指定
$hello
がビューに渡す変数
compact
関数もしくはwith
メソッドで渡すことも可能
compact
関数
変数名とその値から配列を作成するHomeController.php$hello = 'Hello World'; return view('index', compact('hello')); //返り値 array(1) { ["hello"]=> string(11) "Hello World" } //もしくは return view('index')->with('hello',$hello);