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

Laravel6.x 画像をリサイズしてアップロードする方法

Authの認証機能で作成された新ユーザー登録に画像のアップロード機能を追加していきます。画像アップロード処理はIntervention Imageライブラリを使用して画像をリサイズして保存する方法をやっていきます。 画像保存するにあたってusersテーブルにimg_nameカラムを追加する Intervention Imageについて 実装環境 PHP 7.3 Laravel 6.20.26 1.Intervention Imageをインストール まずはライブラリをcomposerを使用してインストール $ composer require intervention/image 次に config/app.php でプロバイダーとエイリアスに追加する。 config/app.php 'providers' => [ Intervention\Image\ImageServiceProvider::class, ], 'aliases' => [ 'Image' => Intervention\Image\Facades\Image::class, ], 2.画像アップロード処理 img_nameカラムを追加したのでApp\User.phpで追加したカラムも保存できるよいうに$fillableにカラム名を追記する。 app/User.php protected $fillable = [ 'name', 'email', 'password', 'img_name', //img_name追加 ]; 新規登録の処理が書いてあるapp/Http/Controllers/Auth/RegisterController.phpにアップロード処理を追記する。 app/Http/Controllers/Auth/RegisterController.php namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use App\Providers\RouteServiceProvider; use App\User; use Illuminate\Foundation\Auth\RegistersUsers; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Validator; use Intervention\Image\Facades\Image; //Intervention Imageライブラリ:追記 class RegisterController extends Controller { use RegistersUsers; protected $redirectTo = RouteServiceProvider::HOME; public function __construct() { $this->middleware('guest'); } protected function validator(array $data) { return Validator::make($data, [ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], 'password' => ['required', 'string', 'min:8', 'confirmed'], 'img_name' => ['file', 'image', 'mimes:jpeg,png,jpg,gif', 'max:2000'], ]); } protected function create(array $data) { if (isset($data['img_name'])) { $img_file = $data['img_name']; //画像がアップロードされたのか確認 if ($img_file->isValid()) { //画像の拡張子取得 $extension = $img_file->extension(); //ファイル名作成 $img_name = uniqid(mt_rand()) . '.' . $extension; //画像を編集して、保存 $img = Image::make($img_file->getRealPath()); $img->resize(400,400)->save(storage_path() . '/app/public/images/' . $img_name); } else { $img_name = ''; } } else { $img_name = ''; } return User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => Hash::make($data['password']), 'img_name' => $img_name, ]); } } 解説 validatorメソッドに画像のバリデーション追記。 protected function validator(array $data) { return Validator::make($data, [ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], 'password' => ['required', 'string', 'min:8', 'confirmed'], 'img_name' => ['file', 'image', 'mimes:jpeg,png,jpg,gif', 'max:2000'], ]); } createメソッドに画像をリサイズして保存する処理を追記。 Laravelは画像のアップロードした際/storage/app/public配下にファイルが保存されるようになっているので、/storage/app/public配下にimagesディレクトリを作成してそこに保存するよいうにする。 また、サイトのページに公開する際はpublicフォルダが読み込まれるのでpublicフォルダ内に画像ファイルがなくてはいけない。 /storage/app/publicからpublicにシンボリックリンクを作成することで画像表示できるよいうになる。 php artisan storage:linkをコマンドプロンプトで実行する。 protected function create(array $data) { if (isset($data['img_name'])) { $img_file = $data['img_name']; //画像がアップロードされたのか確認 if ($img_file->isValid()) { //画像の拡張子取得 $extension = $img_file->extension(); //ファイル名作成 $img_name = uniqid(mt_rand()) . '.' . $extension; //画像を編集して、保存 $img = Image::make($img_file->getRealPath()); $img->resize(400,400)->save(storage_path() . '/app/public/images/' . $img_name); } else { $img_name = ''; } } else { $img_name = ''; } return User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => Hash::make($data['password']), 'img_name' => $img_name, ]); } }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelで <textarea>の先頭にスペースが出てくる

ローカルで開発中地味に改善するのに困ったのでメモ 実装したいもの ・自己紹介に入力した内容を修正したい このように書いていました。 edit.blade.php <textarea> {{ old($profile) ?? $profile->text }} </textarea> このように先頭に変なスペースが出てきます。 改善方法 ・一行で書く。 たったこれだけでした。 edit.blade.php <textarea>{{ old($profile) ?? $profile->text }}</textarea> フロントをまだ使いこなせていないのでメモしていきます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【環境構築】Docker×Laravel×MySql

docker×laravel×mysqlを使った環境構築を行ったのでその手順をご紹介します。 初めてdockerで環境構築を行ったので、少しでも参考になればと思います。 環境 環境     バージョン PHP 7.0.27 FW CakePHP3.2.13 Apache 2.2.15 OS CentOS6.9 DB MySQL5.6.39 手順 DockerフォルダDL Git Clone Docker コンテナに入る Apache起動 ドキュメントルート設定 Composer install mysql起動 データベース作製 app.phpの設定 データベース接続 環境構築してみよう DockerフォルダDL 今回は元々用意していたDockerFile,ymlファイルなどをまとめてダウンロードしてます。 下記、フォルダ構造になります。 -/ |- docker-compose.yml |- docker |- db | |- Dockerfile | |- files | |- entry.sh | |- my.cnf | | |- web |- Dockerfile |- files |- composer.phar |- dev.conf |- php.ini |- ssl.conf Git Clone githubにてプロジェクトの取得。 フォルダ構造は下記のようになりました。 -/ |- project |- docker-compose.yml |- docker Dockerコンテナに入る コンテナに入る前にイメージの作製、コンテナを起動します。 コマンドラインで下記を実行する。 ビルド docker build // ビルドすることでdocker fileからイメージが得られます。 コンテナの起動 $ docker-compose up -d // コンテナを起動します。  下記のコマンドで、ビルドとコンテナの起動を一度に行えます。 ビルドとコンテナの起動 $ docker-compose up -d --build // イメージのビルドから始めてコンテナを起動します。 $ docker ps //起動中のコンテナの確認  オプション-dについて $ docker-compose up // ターミナルでコンテナを起動しているため、同じターミナルでは作業できない。 $ docker-compose up -d // コンテナをバックグラウンドで起動するため、同じターミナルで作業ができる。 下記のコマンドでコンテナに入ります。 $ docker exec -it CONTAINER ID /bin/bash //CONTAINER IDは docker psをした際に確認できます。 Apache起動 webコンテナ内で、下記コマンドでApache起動する。 service httpd start Apache起動 service httpd stop Apache停止 service httpd restart Apache再起動 /etc/init.d/httpd status Apache状態確認 ドキュメントルート設定 web内のhttpd.confのドキュメントルートの設定を確認します。 今回のディレクトリ構造だとvar/www/htmlで問題なさそうです。 composer install composer installができませんでした。 アクセス権限の問題だと思い、アクセス権限777に変更しました。 アクセス権限に関しては下記の記事を参考にしました。 https://qiita.com/t-a-run/items/239ed690ece7a011804a 下記、実行できました。 因みに、composer installはprojectフォルダで行いました。 compser install この状態でアクセスするとデータベースエラーとブラウザに表示されます。 エラーの内容は、そのような(接続した)ファイルは見つからない。 database error(SQLSTATE[HY000] [2002] No such file or directory mysql起動 mysqlを動作させます。 webコンテナに入った時、同様にdbコンテナに入ります。 service mysqld status //mysqlの起動状態の確認 service mysqld start //mysqlの起動 ログイン前に初期のユーザー名とパスワードを確認します。 DBコンテナ内でmysqld.logを確認します。 cat mysqld.log A temporary password is〜に書いてあるユーザー名パスワードを取得。 ユーザー名:root データベースにログインします。 docker exec -it コンテナID mysql -u root -p パスワード再設定->データベース作製->テーブル作成をおこないます。 app.phpの設定 git clone時には、app.phpは含まれていません。作成しましょう。 -/ |- project |- config |-app.php app.phpの書き方はネットで検索すると出てきます。今回は他で使っていたファイルをそのままコピーして中身を編集しました。主にデータベースのしか触っていないです。 'Datasources' => [ 'default' => [ 'className' => 'Cake\Database\Connection', 'driver' => 'Cake\Database\Driver\Mysql', 'persistent' => false, 'host' => 'localhost', /** * CakePHP will use the default DB port based on the driver selected * MySQL on MAMP uses port 8889, MAMP users will want to uncomment * the following line and set the port accordingly */ //'port' => 'non_standard_port_number', 'username' => 'root', 'password' => 'データベース作成時に設定したパスワード', 'database' => 'データベース作成時に設定したパスワード', 'port' => ポート番号, 'encoding' => 'utf8', 'timezone' => 'UTC', 'flags' => [], 'cacheMetadata' => true, 'log' => false, cat mysqld.log A temporary password isに書いてあるパスワードを取得 ->dbコンテナでmysqlをrestartし、ログイン->パスワード再設定->データベース作製->テーブル作成-> データベース接続 sequel proを使い、クイック接続にて接続テストを実行しました。 無事に接続完了しました。 ブラウザでlocalhostと検索すると無事開けました。 参考資料 docker-compose.yml の内容を理解しよう https://futureys.tokyo/lets-understand-contents-of-docker-compose-yml/ Docker compose ことはじめハンズオン https://qiita.com/TsutomuNakamura/items/7e90e5efb36601c5bc8a Dockerfileの書き方と使い方 https://blog.codecamp.jp/docker-file-how-to 起動中の docker コンテナのシェルに入る https://qiita.com/sekizo/items/27cc9b406332afc674f6 データベース作製 https://noumenon-th.net/programming/2019/04/01/docker-entrypoint-initdb01/ chmodで設定する権限の書き方 https://qiita.com/irasally/items/6ebc3c68e22905fb7330
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel 8.40にEloquentリリーションwithOnly関数到着

概念 モデルを取得するときに、常にいくつかのリレーションをロードしたい場合は、モデルの$withプロパティで定義出来ますが、このPRでデフォルトのEagerロードをオーバーライドして、$withプロパティ内のすべてのアイテムを取得せず、withOnlyで定義されているリレーションのみ取得することができるようになりました。 セットアップ ジュースの管理システムを例にして、ジュース、ジュースのメーカー(作っている会社)と種類(トマト、アップルなどなど)のモデルでそれぞれの適切な情報を管理する。その上この例のサービスの仕組みではジュースのモデルのデータを取得するとき、ほぼ全ての場合においてメーカーの情報も必要となります。(たとえばメーカーの名前を表示することなど)。そのためジュースのモデルの$withで定義することになって、デフォルトでloadすることにします。 このようなジュースのモデルは下記のようになります。 <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; /** *ジュースモデル * */ class Juice extends Model { /** * 常にデフォルトとしていつも取得するリレーション定義 * * @var array */ protected $with = ['maker']; /** * このJUICEを作っている会社 */ public function maker() { return $this->belongsTo(Maker::class); } /** * JUICEの種類 */ public function type() { return $this->belongsTo(Type::class); } } デフォルトでmakerがていぎされていますので、取得する時メーカーの情報が自動的にジュースモデルと一緒に取得されます $juice = App\Models\Juice::first(); // メーカーのリレーションも取得される App\Models\Juice { id: 1, name: 'めっちゃおいしいジュース' maker_id: 1, type_id: 1, ... maker: App\Models\Maker { id: 1, name: 'いい会社なまえ', .... }, } withOnlyの使い方 typeを引数としてwithOnlyの関数にわたして、メーカー(デフォルトでロードされるリレーション)の情報が取得されなくなります。 $juice = App\Models\Juice::withOnly('type')->first(); // メーカーのリレーション取得しない // 種類のリレーションがロードされる App\Models\Juice { id: 1, name: 'めっちゃおいしいジュース' maker_id: 1, type_id: 1, ... type: App\Models\Type { id: 1, type_name: 'オレンジ', .... }, } 複数のリレーションを取得したいときにはwithOnlyにリレーションの名前の配列を渡すことができます(デフォルトのEagerロードで定義されているリレーションでも可能)。空の配列の場合、すべてのリレーションが取得しないようになります。 $juice = App\Models\Juice::withOnly(['type', 'maker'])->first(); // メーカーと種類のリレーションどっちも取得 App\Models\Juice { id: 1, name: 'めっちゃおいしいジュース' maker_id: 1, type_id: 1, ... type: App\Models\Type { id: 1, type_name: 'オレンジ', .... }, maker: App\Models\Maker { id: 1, name: 'いい会社なまえ', .... }, } まとめ $withプロパティ内のリレーションを除外でき、withOnlyの関数の引数にわたされているリレーションのみ取得することが簡単にできます。 三章 https://github.com/laravel/framework/pull/37144 https://laravel.com/docs/8.x/eloquent-relationships#eager-loading-by-default
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerでデータベースを変更した場合

理解しないといけないこと Dockerでは、volumeという仕組みがあります。 コンテナは起動し、停止すると毎回破棄してしまうため、コンテナ内にデータを保存しておくことはできません。 保存するなら、volumeにデータを保存する運用がいいと思います。 volumeについてはここで説明は省略しますが、下記記事はとてもわかりやすいです。 一度作成したMySQLデータベースから別の名前に変更する場合の注意 docker-compose.ymlを変更するだけではうまくいかない。 その理由はMySQLのデータベースをDockerのvolumeに保存しているから。 docker-compose.ymlのデータベース情報で下記の通り記載している。 volumes: - db-volume:/var/lib/mysql そのため、dockerのvolumeも削除しなければならないため、volume削除も手順として必要になる。 作業内容 docker-compose.ymlの修正 Laravelの.envの修正 docker volumeの削除 dockerの再ビルド MySQL認証方法の変更(MySQL8のみ) マイグレーション実行 データベース確認 docker-compose.ymlの修正 下記の通り記載しているファイルを変更 変更前 #データベースのコンテナ mysql: image: mysql:8.0 container_name: mysql ports: - '4306:3306' environment: MYSQL_DATABASE: test MYSQL_USER: docker MYSQL_PASSWORD: docker MYSQL_ROOT_PASSWORD: root TZ: 'Asia/Tokyo' volumes: - db-volume:/var/lib/mysql MYSQL_DATABASE、MYSQL_USER、MYSQL_PASSWORDを修正 変更後 #データベースのコンテナ mysql: image: mysql:8.0 container_name: mysql ports: - '4306:3306' environment: MYSQL_DATABASE: test-2 MYSQL_USER: docker-2 MYSQL_PASSWORD: docker-2 MYSQL_ROOT_PASSWORD: root TZ: 'Asia/Tokyo' volumes: - db-volume:/var/lib/mysql Laravelの.env修正 下記の通り記載しているファイルを変更 変更前 DB_CONNECTION=mysql DB_HOST=mysql DB_PORT=3306 DB_DATABASE=test DB_USERNAME=docker DB_PASSWORD=docker MYSQL_DATABASE、MYSQL_USER、MYSQL_PASSWORDを修正 変更後 DB_CONNECTION=mysql DB_HOST=mysql DB_PORT=3306 DB_DATABASE=test-2 DB_USERNAME=docker-2 DB_PASSWORD=docker-2 docker volume削除 volume確認 ホスト側のターミナル(or コマンドプロンプト)にて、下記コマンドを実行 docker volume ls 下記volumeがあることを確認 local ****_db-volume volume削除 ※dockerのコンテナが動いている時にやるとエラーを起こす。必ずコンテナを停止してからやること! Error response from daemon: remove ****_db-volume: volume is in use - [48abed9a0abfe9b06a5bba351f0ea862d16ead41d40e48a50981a0dec5c72a29] コンテナ停止を確認したら下記実行 $ docker volume rm ****_db-volume // 削除後volumeがないことを確認する $ docker volume ls dockerの再ビルド docker-compose.ymlが変更され、volumeも削除されているため、再度ビルドを実行。 下記コマンドでビルドとコンテナ起動を同時に可能。 docker-compose up -d -build MySQL認証方法の変更 MySQL8のみ実行 マイグレーション実行 Laravelでマイグレーションを実行するため、Laravelプロジェクトが入っているphpコンテナへログイン $ docker-compose exec php bash 以下、コンテナ内での作業となります /var/www/html# php artisan migrate データベース確認 マイグレーション実行後、テーブルができているかを確認。 MySQLコンテナに入り、rootユーザーでログイン。 その後、修正したデータベース(test-2)にテーブルがあるかを確認する。 matsunoMBP:crm-backend naoki$ docker-compose exec mysql bash root@0573a3c19569:/# mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 10 Server version: 8.0.23 MySQL Community Server - GPL Copyright (c) 2000, 2021, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> use test-2 Database changed mysql> mysql> show tables; +-----------------------+ | Tables_in_crm_test_db | +-----------------------+ | course | | migrations | | term | | user | +-----------------------+ 4 rows in set (0.01 sec) 為になる文献 【Docker】docker-compose.ymlの変更がDBに反映されなかった話 - Qiita Docker volumeの削除 - Qiita
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaravelでPHP Fatal error: Allowed memory size of 1610612736 bytes exhausted...エラー

Laravelでデバックバーをインストールしようとしたらエラー出ました。 原因は別件でphpのバージョンを変えたのでその影響でした。 忘れないように忘備録。。 コンソール composer require barryvdh/laravel-debugbar (*゚▽゚)ノ ターン いつものようにデバックバーをインストールだっ コンソール PHP Fatal error: Allowed memory size of 1610612736 bytes exhausted ... (;´Д`) あれなんか急にエラー出た。。。 調べたらComposerのメモリ不足エラーみたいでした。。 php.iniの設定変更で治るみたいなので場所を調べたら コンソール $ php --ini | grep "php.ini" ↓ コンソール Loaded Configuration File:/usr/local/etc/php/7.4/php.ini ( ノД`) そういや別件でphpのバージョン変えてた・・ php.ini memory_limit = -1 この変更で治りました。 参考にしました。 https://qiita.com/miriwo/items/a5fa25c1d36d00f40ec9 https://qiita.com/miriwo/items/acb49b0a97b5d5fa47fd
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む