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

【PHP,Laravel】PHPから変数や配列をまとめて送り、Laravelで表示する方法

とても悩んだので、プログラムを簡略化して記録します。

問題点

name  | number | text
test  |      1 | test
sample|      2 | sample

以上のようなとき、一行目しか変数に入らない!

できた時のプログラム

index.php
            $count = 1;

            $db = pg_connect("host=host port=5432 dbname=dashboard user=postgres password=○○" ); 
            if(!$db)throw new Exception("DB接続に失敗しました。");

            $search = pg_query("SELECT *FROM board_posted;");
            if (!$search)throw new Exception('クエリーが失敗しました。');

//ここからポイント
            for($i=0;$i<$rows_count;$i++){
                $rows[] = pg_fetch_array($search, $i, PGSQL_ASSOC);
            }

        $info = array(
            "count"=> $count,//数値
            "board"=> $rows//配列
        );
        print_r($rows);

        return view('dashboard')->with('info',$info);

print_r($rows)の結果は

Array (
[0] => Array (
 [number] => 0 [name] => hoge [text] => This is a sample.
 ) 
[1] => Array (
 [number] => 1 [name] => hoge [text] => This is a sample2.
 ) 
)
index.blade.php.html
      @for($i = 0; $i < $info['board_count']; $i++)
                  <div class="card" style="width: 60rem;">
                  {{$info['board'][$i]['number']}}<!--ここで配列から取り出す-->   
                  </div>
                  <div class="card-body">
                      <table border="1">
                          <tbody>
                          <tr>
                            <td>{{$info['board'][$i]['name']}}</td><!--ここで配列から取り出す-->
                          </tr>
                          {{$info['board'][$i]['text']}}<!--ここで配列から取り出す-->
                      </tbody>
                      </table>
                  </div>
      @endfor

当たり前かもしれませんが、$rows[]と配列にしたらできました。
あとlaravel側での取り出し方がポイントでした。

できなかった時のプログラム

index.php
            $count = 1;

            $db = pg_connect("host=host port=5432 dbname=dashboard user=postgres password=○○" ); 
            if(!$db)throw new Exception("DB接続に失敗しました。");

            $search = pg_query("SELECT *FROM board_posted;");
            if (!$search)throw new Exception('クエリーが失敗しました。');

            $rows = pg_fetch_array($search, $i, PGSQL_ASSOC);//一行の配列は入る

        $info = array(
            "count"=> $count,//数値
            "board_number"=> $rows['number'],//1個しか入っていなかった
            "board_name"=> $rows['name'],//1個しか入っていなかった
            "board_text"=> $rows['text'],//1個しか入っていなかった
        );
        print_r($rows);

        return view('dashboard')->with('info',$info);

まとめ

このような配列の中に配列があるものを三次元配列というそうです。
普通の配列か、そうでない配列かをわかる必要がありました。
当たり前だなと思いました。が、使わなければ忘れます…。
もっと簡単な記述方法があればご教授ください。
以上です。

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

【Laravel】5.5→7.2へアップデートをした話

はじめに

PHPのフレームワークを勉強しようと、Laravelを触っていたときの話。

どうやらバージョン毎に使えるコード・使えないコードがあるらしい...

そんなわけで初めてのLaravelバージョンアップ!
必要なファイルがインストールされていなかったり、エラーが発生したり...
それでも数十分で解決できて、とても簡単でした。

とりあえずやってみる

バージョンアップには、どうやらcomposer.jsonを編集する必要があるらしい。
しかし...それらしきファイルがない!

Composerのインストール

Composerをインストールしてみたを参考にインストールしました。

composer.jsonを編集

調べてみると、バージョンアップは、composer.jsonでバージョンを引き上げて composer update するだけみたい。
Laravelを5.8→6.0にアップデートしただけの話を参考にやってみます。

エラー その1

5.x→7.xへの大幅アップデートのため、ひたすらエラーが流れていきます。

Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Conclusion: don't install laravel/framework v7.24.0
    - Conclusion: don't install laravel/framework v7.23.2
...中略
    - Installation request for laravel/framework ^7.0 -> satisfiable by laravel/framework[v7.0.0, v7.0.1...以下略].
    - Installation request for laravel/tinker ^1.0 -> satisfiable by laravel/tinker[v1.0.0, v1.0.1...以下略].

どうやら、最後の方に出るエラーが肝のようです。

    - Installation request for laravel/framework ^7.0 -> satisfiable by laravel/framework[v7.0.0, v7.0.1...以下略].
    - Installation request for laravel/tinker ^1.0 -> satisfiable by laravel/tinker[v1.0.0, v1.0.1...以下略].

composer.jsonでlaravel/tinkerのバージョンを^2.0に変更。
無事アップデートが始まりました。

エラー その2

しかし、今度は別のエラーが発生

Script @php artisan package:discover handling the post-autoload-dump event returned with error code 255

Script @php artisan package:discover handling the post-autoload-dump event returned with error code 255を参考に対処していきます。

エラー その3

上記エラーは解決しましたが、また別のエラー発生

In cache.php line 91:

  Call to undefined function str_slug()

Script @php artisan package:discover handling the post-autoload-dump event returned with error code 1

Laravel6へのアップグレードで Call to undefined function str_slug()を参考に進めます。

composer require laravel/helpers

を実行したところ、別のエラーメッセージが...

In Auth.php line 56:

  In order to use the Auth::routes() method, please install the laravel/ui pa
  ckage.

Script @php artisan package:discover handling the post-autoload-dump event returned with error code 1

【Laravel6系】php artisan make:authが使えない問題の対処法を参考に進めていきます。

composer require laravel/ui

を実行し、無事エラーが消えました!

php artisan --version
Laravel Framework 7.24.0

まとめ

初めてのバージョンアップでしたが、とても簡単にできました!

composer.jsonで各パッケージのバージョンを変えて、あとはエラーメッセージを基に対処していくだけでした。

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

Laravel×Docker×Dusk×Seleniumでのテスト実行

はじめに

インターン現場でLaravelを使用しており、テスト環境の構築を行いました。

テストツールとしてDuskを使用し、seleniumとの連携という構成をとり、導入で何度かつまづいたので自分メモとして残したいと思います。

Duskって?

-ドキュメント
Laravelが標準で用意している、ブラウザの自動操作によるテストAPI。
テスト中はブラウザが勝手に動くのを眺めながらのんびりできます(笑)

Duskは「$php artisan dusk:install」でコマンドインストール後、すぐに使えます。
しかし今回は現場の意向でデフォルトのChromeDriverの使用ではなくseleniumを使用することになりました。

目標

--開発環境---
  • Laravel 6.18.26
  • Docker(Docker-compose) 19.03.8

docker環境でDusk × seleniumでテストを実行することを目標とします。
開発環境でdockerを使用していたので、selenium用のコンテナを準備するところからはじめました。

以下、順にまとめていきます

1.seleniumのコンテナを準備

selenium用のコンテナを定義するために、docker-compose.ymlに以下を追記。

docker-compose.yml
selenium:
    image: selenium/standalone-chrome-debug
    ports:
      - 4444:4444
      - 5900:5900
    container_name: selenium-container
    depends_on:
      - nginx
    privileged: true

ポートを2つ開放してますが、

4444 ⇨ selenium serverのポート
5900 ⇨ VNCのポート

です。
[参考]VNCについて

2.コンテナ起動

terminal

$ docker-compose up

...

Creating mysql-container      ... done
Creating phpmyadmin-container      ... done
Creating php-fpm-container         ... done
Creating nginx-container           ... done
Creating selenium-container        ... done

seleniumのコンテナが無事立ち上がりました。
php-fpmのコンテナ中に入ります。

terminal
$ docker exec -it php-fpm-container bash

3.Duskのインストール

ほぼ公式の引用です。
以下のコマンドはコンテナ中で行ってください!

terminal(コンテナ内)
# 共存パッケージのインストール
$ composer require --dev laravel/dusk

# dusk install
$ php artisan dusk:install

dockerを起動するとselenium portとVNCポートが開放されます。

4.seleniumの接続(:4444)

デフォルトのChromeDriveではなくseleniumを使用する場合、tests/DuskTestCase.phpを書き換える必要があります。

DuskTastCase.php
#driverメソッドを以下に書き換え

protected function driver()
    {
        return RemoteWebDriver::create(
            'http://selenium:4444/wd/hub', DesiredCapabilities::chrome()
        );
    }

ここで、docker-compose.ymlで定義した4444portが登場します!

5.VNCの接続(:5900)

今度はVNCに接続を行います。
macのfinderからlocalhost:5900に接続します。

スクリーンショット 2020-07-31 20.17.43.png

↓dockerが起動していればこんな感じでseleniumの画面が表示されました!!
スクリーンショット 2020-07-31 20.18.30.png

6.テストの実行

以下の簡単なログインテストを実行してみました。

LoginTest.php
<?php
namespace Tests\Browser;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Laravel\Dusk\Browser;
use Tests\DuskTestCase;


class LoginTest extends DuskTestCase
{
    /**
     * A Dusk test example.
     *
     * @return void
     */
    public function test_02_PassReset(){

        // login test
        $this->browse(function (Browser $browser) {
            // ページ"/login"で文字列"LARAVEL"を確認
            $browser->visit('login')
                    ->assertSee('LARAVEL');
        }); 
    } 
}

こちらのテストを実行。

スクリーンショット 2020-07-31 22.53.20.png

↑テスト実行時のキャプチャです。きちんとテストブラウザが動いて/loginにアクセスできています!

terminal
$ php artisan dusk
PHPUnit 8.5.8 by Sebastian Bergmann and contributors.

..                                                2 / 2 (100%)

Time: 4.4 seconds, Memory: 18.00 MB

OK (2 tests, 2 assertions)

テスト結果も◎でした!!!

まとめ

ブラウザテスト自体が初めてだったので、単純に楽しかったです!
時間があればselenium関連でスクレイピングとかにも挑戦したい!!!

※誤りや質問等ございましたらコメント頂けますと幸いです。

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

Laravelのコンストラクタとは

はじめに

コンストラクタとはクラスからインスタンスを生成するとき(オブジェクトがnewによって作成されるとき)に自動的に呼び出されるメソッドです。
オブジェクト作成時に初期化処理が必要な場合、コンストラクタ内に記述しておけば自動的に実行してくるので大変便利です。

コンストラクタを用いて実装してみる

class Job
{
    protected $job_service;

    public function __construct(
        JobService $job_service
    ) {
        $this->job_service = $job_service;
    }

    public function main()
    {
        $recruiting_jobs = $this->job_service->recruitingJobs();
        return $this->render($recruiting_jobs);
    }
}

メソッド名の部分を__constructとするとコンストラクタとなります。
コンストラクタのアクセス制限はpublicのみです。

おわりに

コンストラクタに実装すれば必要なたびごとに初期化の実装が不要になるので便利ですね。

参考:コンストラクタ - Laravel学習帳

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

【初心者が悩む】RubyとPHPとPythonどれが良いのか?

まずはじめに

プログラミングをやってみようとしてまず考える事が「どのプログラミング言語から初めよう?」というところではないでしょうか。

そしてググっていくとRubyというプログラミング言語が真っ先に情報として入ってくるのではないでしょうか?

Rubyが真っ先に初心者に引っかかる理由は何と言っても「プログラミングスクールの殆どがRubyを激推ししているから」に尽きます。

ちなみに更にググってみるとRubyと似た言語にPHPとPythonがあるのです。

一体どの言語を勉強すれば良いのでしょうか?

RubyとPHPとPythonのイメージ

まず、殆ど知識が無い状態の私が持っていたイメージ。

  • Ruby - 初めて耳にする。
  • PHP - 古臭い。
  • Python - 初めて耳にする。

結果、なんとなくPHPは聞いたことがある...という程度です。私の場合は、ワードプレスでブログ運営していた時期が少しばかりあったのでPHPというプログラミング言語の存在は知っていました。

PHPは古臭いと書きましたが、ググってみると、

  • Ruby - 1993年2月24日生まれ(1995年12月発表)
  • PHP - 1994年生まれ(1995年6月8日発表)
  • Python - 1990年生まれ(1991年発表)

PHPがこの3つのプログラミング言語の中で新しいことが分かりました。イメージだけで、古臭いと決め付けていたPHPに謝りたいです。

PHPだけ少し違う!?

比較されるには何か理由がある訳ですが、この3つのプログラミング言語は、サーバーサイドでとても使われている言語です。

そして、記述の方法がとてもよく似ています。

例えばシンプルにHello world!を3つの言語で使用してみましょう!

Ruby
print "Hello World!"
PHP
<?php 
echo "Hello World!"; 
?>
Python
print("Hello world!")

......
....
..

気づきましたか!?
RubyとPythonは書き方が似ていますが、PHPだけ少しゴチャっとしていますよね。先ほどは、記述方法がよく似ていると書きましたが、実はよくよく見てみるとPHPだけどこか違います。

なぜ、PHPだけ少しゴチャっとしているのかはPHPのWikipediaに下記のような記載を見つけましたが、これが答えなのではないでしょうか?

元々PHPはプログラミング言語と言えるものではなく、単にテンプレート的な処理を行うだけであったが、度重なる機能追加やコードの書き直しにより、2017年現在リリースされているPHP 5やPHP 7は目的によらず汎用的に使うことの出来るスクリプト言語となっている。

要するに
PHPは元々、プログラミング言語とは違うものだった。
推測ですが、それが答えだと思います。

RubyとPHPとPythonはなぜ比較されるのか?

ここでは大きく考えられる2つの要因について書きます。

フレームワークが凄い

フレームワークは、アプリケーションを作るときに開発工程を大幅に短縮することのできるソフトウェアのことで、このフレームワークが充実している=凄い機能のアプリを短期間で作成することのできる。使える人が使えば、魔法のアイテムのようなものですが、今回紹介したRubyとPHPとPythonには、

  • Ruby - Ruby on Rails
  • PHP - Laravel
  • Python - Django

上記のような素晴らしいフレームワークが揃っています。

近年伸びているメジャーサイトが利用している

やっぱりここに尽きるのではないでしょうか?

  • Ruby - Twitter, Hulu etc...
  • PHP - Wikipedia, Facebook etc...
  • Python - Googleの検索エンジン, YouTube etc...

どのプログラミング言語も甲乙付け難い一流企業が利用しています。

結局どの言語を学べばいいのか?

興味を持った言語を学べば良いと言ったらそれで済む話ですが、

趣味ではなく就職や転職の為に学んでいるのならば単純に求人数だけを見てみると、
PHP>=Ruby>Python
の傾向なので、PHPが一番なのかもしれません。
あくまで、求人数だけでの話ですが...。

参考: 【PHP/Python/Rubyを比べてみた】言語のメリットとデメリット、特徴まとめ | Workship MAGAZINE(ワークシップマガジン)

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

EC2 Amazon Linux 2 + nginx で Laravel の環境構築の際によく使うコマンド

yumアップデート

sudo yum update -y

nginxのインストール

sudo amazon-linux-extras install nginx1.12 -y

// nginxの起動
sudo systemctl start nginx

// 自動起動設定(これをやっておくとEC2再起動などの際に自動で起動してくれる)
sudo systemctl enable nginx

// nginxのステータス確認(起動失敗時などに調査で使用する)
systemctl status nginx.service

PHPのインストール

sudo amazon-linux-extras install php7.3

// Laravelを動かすためには php-xmlとphp-mbstringが必要
sudo yum install php-xml php-mbstring

Composerのインストール

sudo curl -sS https://getcomposer.org/installer | php

// パスを通す
sudo mv composer.phar /usr/local/bin/composer

Laravelのインストール

// インストール先のディレクトリに権限を付与する
sudo chmod -R 777 /usr/share/nginx/html

cd /usr.share/nginx/html

composer create-project --prefer-dist laravel/laravel app_name

Laravelのセットアップ

cd app_name

cp .env.example .env

php artisan コマンドを使えるようにする

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