- 投稿日:2020-10-24T20:37:37+09:00
Vue.jsのコンポーネント内からhrefで画面遷移するには
やりたかったこと
環境:Laravel + vue.js(単一Vueコンポーネント)
SPAではなく、普通に画面全体を遷移させる。
ただし、URLはbladeテンプレート側からpropsで受け取りvue側で他の変数と合体させるため可変にしたい。URLが固定でいいなら以下のように普通のHTMLでいい。
<a href="/edit"></a>で、この固定のURLの代わりにどうやってコンポーネント内のdataを埋め込むかというのが問題。
やり方がググっても出てこなかったのでかなりハマりました。
vue-rooterとかはいらないです。解決法
aタグの場合
sample.vue<template> <a :href="url_edit_id" class="btn btn-primary">編集</a> </template> <script> export default { props: ['url_edit'], data: function() { return { url_edit_id:'/edit' } }, </script>buttonタグの場合
ボタンタグの場はmethodsに任意の名前で関数を作成し、その中でlocation.href=[遷移させたいURL]を指定します。
そのmethod名をbuttonタグの中のv-on:clickの値として呼び出します。sample.vue<template> <button v-on:click="locate" class="btn btn-primary">編集</button> </template> <script> export default { props: ['url_edit'], data: function() { return { url_edit_id:'/edit' } }, methods: { locate: function() { location.href= this.url_edit_id; } }, </script>aタグの場合とbuttonタグの場合で書いていますが、リンクへの挙動は同じです。
script側のdata内で定義した変数名をマスタッシュ{{ }}とかつけずにそのまま書きます。
不思議な構文ですが、これでurl_edit_idの値である/editがtemplate側に置換されて文字列展開されます。
aタグの方が簡単なので必要なければaタグにボタンのcss当てた方が簡単です。
私は:disabled属性を当てる必要があったのでボタンタグを使う必要がありました。一応これで動きましたが、もっと簡単にかける方法あるよって方はコメントお願いします。
- 投稿日:2020-10-24T18:25:53+09:00
PHP: ユーザー権限でapacheなDIRを削除
ユーザー権限
しかなくて、Laravelのフォルダを単純に削除しようとすると、
storage以下
の所有者apache
のフォルダが消せないんですよねー
PHP
でPermission変更
かけてやると消せるんですが、ハマリポイントがあったんで備忘録です。chmod.php<?php function chmod_r($path) { $dir = new DirectoryIterator($path); foreach ($dir as $item) { if ($item->isDir() && !$item->isDot()) { //chomd()だとエラーがでたので。 system('chmod 0777 ' . $item->getPathname()); echo 'Dir : ' . $item->getPathname() . '<br>'; //再帰的に変更 chmod_r($item->getPathname()); } } } //パーミッション変更したいフォルダをフルパス指定してください。 chmod_r('/var/www/html/laravel'); ?>こいつを
実行できる場所(www以下等)
においてブラウザから実行
してください。
再帰的
に全フォルダのパーミッション
が変更されていますので、rm -rf {フォルダ名}
ですべてのapache所収者ディレクトリ
を消せるはずです!LGTMお願いします!
ストックのついでにお願いします!
モチベーションがあがります!
- 投稿日:2020-10-24T17:26:26+09:00
Laravel composer ライブラリインストール時のメモリエラー
目的
- Laravelで使うライブラリインストール時にメモリ系のエラーを解決した話をまとめる。
問題までの経緯
下記コマンドを実行してライブラリをインストールしようとした。
$ sudo composer require league/flysystem-aws-s3-v3 ~1.0問題
下記のエラーが発生しライブラリをインストールすることができない。
PHP Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 4096 bytes) in phar:///usr/local/bin/composer/src/Composer/DependencyResolver/Solver.php on line 223 Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 4096 bytes) in phar:///usr/local/bin/composer/src/Composer/DependencyResolver/Solver.php on line 223 Check https://getcomposer.org/doc/articles/troubleshooting.md#memory-limit-errors for more info on how to handle out of memory errors.問題解決までの経緯
- エラーに「このリンク見て!」って書いてあったから当該リングにアクセスしてみる。
リンク先の指示に従い現在の割り当てられている設定のメモリを出力するコマンドを実行してみる。
$ php -r "echo ini_get('memory_limit').PHP_EOL;"「128M」と出力された確かにこれだと足りていない。
php.iniファイルで割当メモリ設定を設定できるらしいので下記コマンドを実行してphp.iniファイルを開く。※php.iniファイルの場所は筆者の環境と異なる可能性があるので下記コマンドをただ実行してもphp.iniファイルを開けないかもしれない。(php.iniファイルの場所はこちらの方法で確認可能である→php.iniファイルの場所をターミナルで確認する)
$ sudo vi /etc/php.iniメモリ割り当て設定を無制限である
-1
に設定し保存して閉じた。/etc/php.ini; 省略 ; Maximum amount of memory a script may consume (128MB) ; http://php.net/memory-limit memory_limit = -1 ; 省略ライブラリインストールのコマンドを再度実行する。
$ sudo composer require league/flysystem-aws-s3-v3 ~1.0問題なくインストールする事ができた。
- 投稿日:2020-10-24T15:19:21+09:00
foreachで複数作ったbuttonタグでdivタグ全体をリンクにしてpostしたい!
こんにちは。クリスピーパンダです。
今回が初めての投稿ですが、早速行ってみましょう〜。この記事で実現できること
foreach等のループ文で複数作ったform、divタグ、buttonタグで、buttonタグをdivタグ全体に広げて、リンク(button)を作成するものです。
イメージは、記事投稿サイトなどで記事表示する際に、たくさんできたカードの全体をボタンにして、postしようよって感じです。通常postはしないですが、ユーザーIDを送信したいよ!とかあるんで、そういう時に役立つ思います!開発環境
OS:macOS Catalina
テキストエディタ:VSCode
フレームワーク:Laravel6
使用言語:HTML, CSS, JavaScript実装
HTML
今回はLaravelなのでBladeですがHTMLと同じです。@foreachやroute('post.show')などはBladeでPHPを記述していますが、他のフレームワークでもループ文やaction先など指定すれば実装できます。
index.blade.php@foreach($posts as $post) <form action="{{ route('post.show') }}" method="POST" name="post_show"> <div class="linkbox"> <p>{{ $post->title }}</p> <p>{{ $post->body }}</p> <input name="user_id" type="hidden" value="ここに送りたい値を記述"> <button type="submit"></button> </div> </form> @endforeachこれでpostのタイトルや内容が表示され、それを囲んでるdivタグ部分が次のCSSでリンク(ボタン)になります。
formタグ→divタグ→buttonタグの順番でコーディングしてください。CSS
今回のHTML部分では、CSSの読み込みは省略していますが、CSSの読み込みも忘れずに行ってくださいね!
style.css.linkbox { position: relative; } .linkbox button { position: absolute; top: 0; left: 0; height: 100%; width: 100%; /* buttonのスタイル削除 */ background-color: transparent; border: none; cursor: pointer; outline: none; padding: 0; appearance: none; }まずはポジションを使用して、buttonタグを浮き上がらせて、buttonタグのスタイルをすべて削除することで、スケスケのbuttonタグが出来上がるというイメージです。
最後に
aタグで実装すればいいじゃん!と最初に思ったのですが、どうやらループ文で複数作成したaタグでpostすると、JavaScript等をかませないとだめみたいだったので、今回は簡単にbuttonタグで実装してみました。
aタグでもこんな感じで実装できるよ!やもっと簡単な方法あるよって方はぜひ教えて下さい!
- 投稿日:2020-10-24T14:51:08+09:00
Laravel-Excelのインストールにおけるエラーを解消する
なにがあったか
公式の手順通りにインストールしているはずが、いくつかのエラー(主に関連するライブラリ)に見舞われた。
インストール
開発環境が Laravel ver5.5.49 であるため、公式を参考にバージョン3.0を導入(PHPのメモリ制限に引っかかるためリミットをなんとかしている)
$ COMPOSER_MEMORY_LIMIT=-1 composer require maatwebsite/excel:3.0インストールが
killed
で終わっているのに気づかず次の手順に進んだりするとハマる(自分)。
――で、これはどうもDockerのメモリが足りないらしいので、自分はDocker DesktopのPerformanceからメモリを4GBまで増やした。エラー
Excelファイルをダウンロードする実装自体は上記の手順でできてしまうが(スミマセン、うろ覚え)、このあとなんらかの事情で
composer install
を打った際にProblem 1 - phpoffice/phpspreadsheet 1.15.0 requires ext-gd * -> the requested PHP extension gd is missing from your system. - phpoffice/phpspreadsheet 1.15.0 requires ext-gd * -> the requested PHP extension gd is missing from your system. - Installation request for phpoffice/phpspreadsheet 1.15.0 -> satisfiable by phpoffice/こういった『関連するライブラリがない』というエラーが次々に出てくる。ゴチャゴチャと関連するライブラリを順番にインストールしていったが、最終的に『Laravelのバージョンが合わん』と言われてしまった。すでにスタートしている開発環境でそれをやるのはわりとめんどくさいので困った。
解決
$ COMPOSER_MEMORY_LIMIT=-1 composer require maatwebsite/excel:3.*バージョンの指定をやや緩くしたら解決した。
関連するライブラリをインストールしなければいけない点は同じだが、少なくとも「Laravelのバージョンが」と言われることはなくなって解決した(開発環境によっては違うポイントでエラーにハマる可能性はある)。雑感
3.0
はダメなのに3.*
だとOKなのはなんでだろう?
バージョンアップでLaravelのバージョン依存が緩和されたのかな。。
- 投稿日:2020-10-24T13:55:06+09:00
Laravel-Excelでbladeのテンプレートを使って複数シートで作成する
概要
いろんな事務所に所属するバンドのデータを取得。bladeにテンプレートを作り、事務所ごとのデータをExcelファイルでダウンロードするというパターンを想定して実装する。テーブルはbladeにてテンプレートを作る。
Laravel-Excelのインストールの手順などは省く。
bladeでテンプレートを作って出力する方法は下記を参考。Laravel-excel で帳票を出力する
https://qiita.com/ShibuyaKosuke/items/7e5e99c51546a578d97b複数ファイルは出せないのか
最初はダウンロードする処理を
foreach
で回して事務所ごとにファイルをダウンロードする処理をすればいいだろうと安易に考えていたが、どうもそれはできないようで(ダウンロードする処理でreturn
しなければならないため)、ファイルはひとつだが事務所ごとに複数シートで分けるということにした。
Laravel-Excel を使って複数シートでダウンロードする方法は公式サイトも含めて探せばいくつか見つかるが、bladeでテンプレートを作って出力するパターンのものは工夫して作らなければならなかった。必要なファイル
以下4点のファイルを用意すれば作ることができる。
ディレクトリやファイル名は任意。
テンプレートとなるbladeは割愛する。bandController.phppublic function export() { // 中略 // 複数シートでのダウンロード $view = \view('band_information.export') ->with('offices', $offices); return (new MultiBookExport($view))->download("band_info.xlsx"); }BandInfosExport.php<?php namespace App\Exports; use Maatwebsite\Excel\Concerns\Exportable; use Illuminate\Contracts\View\View; use Maatwebsite\Excel\Concerns\WithMultipleSheets; class BandInfosExport implements WithMultipleSheets { use Exportable; private $view; public function __construct(View $view) { $this->view = $view; } public function sheets(): array { $sheets = []; $i = 1; // 事務所数 $count = count($this->view->offices); // 事務所の数だけシートを作る foreach ($this->view->offices as $office) { $sheets[] = new BandInfosSheet($office); if ($i === $count) { return $sheets; } $i++; } } }<?php namespace App\Exports; use Maatwebsite\Excel\Concerns\WithTitle; use Illuminate\Contracts\View\View; use Maatwebsite\Excel\Concerns\FromView; class BandInfosSheet implements FromView, WithTitle { private $office; public function __construct($office) { $this->office = $office; } public function view(): View { // 事務所に所属するバンドのデータをbladeのテンプレートに渡す return \view('band_information.export') ->with('informations', $this->office['band_informations']); } public function title(): string { // シート名となる事務所名を取得 return $this->office->name; } }
- 投稿日:2020-10-24T10:13:47+09:00
【Laravel】Array to string conversion〜の解決方法
はじめに
今回はLaravelでRequestを受け取ってfillしてsaveしようとした時に
Array to string conversion〜
のエラー出てきたのでその解決方法の一つをまとめたいと思います。Array to string conversion〜の解決方法
<?php namespace App\Http\Controllers; use Request; use DB; //-----(省略)----- public function postEdit(Request $request) { $inputs = $request->validatedValues(); $user = User::findOrFail($inputs['id']); $user = fill($inputs->toArray())->save(); return redirect("/users/{$user->id}/edit"); }fillしてsaveしようと思った時にredirectの直前の実装で
Array to string conversion〜
とエラーが出てきてしまいました。あくまで1つの可能性ですが$requestの中身を確認した時にあるひとつの項目に対して複数選択が可能なjson型の項目があるとこのようなエラーになります。
そんな時はキャストを定義する必要があります。<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * ネイティブなタイプへキャストする属性 * * @var array */ protected $casts = [ 'options' => 'array', ]; }キャストを実装するとfillしてsaveできるようになるので参考にしてみてください。
最後に
いかがでしたでしょうか。
またエラーが出てきて詰まった際にはこのようにまとめていきたいと思います。
- 投稿日:2020-10-24T08:21:17+09:00
Laravelのenvメソッドがスレッドセーフ版のPHPでは正常に機能しない
環境
Windows 10 Pro
Apache 2.4
PHP 7.3 スレッドセーフ版
Laravel 6.18現象について
Laravelでの開発中に
envメソッドで時々値が読み込めない場合や
Apacheの公開ディレクトリに配置している他プロジェクトの環境変数を取得してしまう?現象が発生した。
(他プロジェクトの環境変数を取得しているかは確証はないがそれっぽい値を取得してしまう)調査した結果
PHPのgetenvがスレッドセーフ版のPHPでは正常に機能しないことを発見した。対応策について
設定ファイルをキャッシュすればいいらしい。
php artisan config:cache設定ファイルをキャッシュすると
envメソッドが実行されなくなるので注意が必要である。環境変数を変更した場合はその都度上記コマンドを実行し
キャッシュを更新する必要がある。まとめ
Windows+Apache環境でLaravelの開発をする場合、
この現象に遭遇する確率が高いので注意が必要。ちなみにLaravelの公式ドキュメントには
この問題への注意喚起はないと思われる。
(あったらすみません)ノンスレッドセーフ版なら上記の問題は発生しないので
dockerでノンスレッドセーフ版の環境を作って開発したほうがいい気がしてきた...参考URL
laravelやphpdotenvのissueで既に議論されていたのでご参考に
https://github.com/laravel/framework/issues/8191
https://github.com/vlucas/phpdotenv/issues/76