20201024のlaravelに関する記事は8件です。

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属性を当てる必要があったのでボタンタグを使う必要がありました。

一応これで動きましたが、もっと簡単にかける方法あるよって方はコメントお願いします。

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

PHP: ユーザー権限でapacheなDIRを削除

ユーザー権限しかなくて、Laravelのフォルダを単純に削除しようとすると、
storage以下所有者apacheのフォルダが消せないんですよねー

PHPPermission変更かけてやると消せるんですが、ハマリポイントがあったんで備忘録です。

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お願いします!
ストックのついでにお願いします!
モチベーションがあがります!

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

Laravel composer ライブラリインストール時のメモリエラー

目的

  • Laravelで使うライブラリインストール時にメモリ系のエラーを解決した話をまとめる。

問題までの経緯

  1. 下記コマンドを実行してライブラリをインストールしようとした。

    $ 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.
    

問題解決までの経緯

  1. エラーに「このリンク見て!」って書いてあったから当該リングにアクセスしてみる。
  2. リンク先の指示に従い現在の割り当てられている設定のメモリを出力するコマンドを実行してみる。

    $ php -r "echo ini_get('memory_limit').PHP_EOL;"
    
  3. 「128M」と出力された確かにこれだと足りていない。

  4. php.iniファイルで割当メモリ設定を設定できるらしいので下記コマンドを実行してphp.iniファイルを開く。※php.iniファイルの場所は筆者の環境と異なる可能性があるので下記コマンドをただ実行してもphp.iniファイルを開けないかもしれない。(php.iniファイルの場所はこちらの方法で確認可能である→php.iniファイルの場所をターミナルで確認する

    $ sudo vi /etc/php.ini
    
  5. メモリ割り当て設定を無制限である-1に設定し保存して閉じた。

    /etc/php.ini
    ; 省略
    
    ; Maximum amount of memory a script may consume (128MB)
    ; http://php.net/memory-limit
    memory_limit = -1
    
    ; 省略
    
  6. ライブラリインストールのコマンドを再度実行する。

    $ sudo composer require league/flysystem-aws-s3-v3 ~1.0
    
  7. 問題なくインストールする事ができた。

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

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タグでもこんな感じで実装できるよ!やもっと簡単な方法あるよって方はぜひ教えて下さい!

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

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のバージョン依存が緩和されたのかな。。

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

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.php
public 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;
    }
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【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',
    ];
}

引用:Eloquent:ミューテタ 8.x Laravel

キャストを実装するとfillしてsaveできるようになるので参考にしてみてください。

最後に

いかがでしたでしょうか。
またエラーが出てきて詰まった際にはこのようにまとめていきたいと思います。

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

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

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