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

PHPで複数の値をreturnする[備忘]

やりたい事

  • 複数の値を一回のreturnにまとめたい

環境

  • PHP 7.2.6
  • CakePHP 3.6.13

サンプルコード

  • 生のPHPコードの場合
private function samples()
{
    $fruits1 = 'apple';
    $fruits2 = 'banana';

    return [$fruits1, $fruits2]; // もしくは、array($fruits1, $fruits2);
}

list($fruits1, $fruits2) = $this->samples();

echo $fruits1; // => apple
echo $fruits2; // => banana

解説

  • samplesアクション

    • $fruits1$fruits2を定義
    • returnする時に配列にする
  • list関数

    list — 配列と同様の形式で、複数の変数への代入を行う
    引用元:http://php.net/manual/ja/function.list.php

    • list関数を使用し、samplesアクションの返り値を受け取る

所感

  • 1回のreturnで済む事は気持ちいい
  • functionに切り出す程でもないけど、2つの値をそれぞれ呼び出し元に返したい場合の解消手段になり得る
  • 見慣れないせいか、直感的なコードの可読性はそこまで高くない?
  • 世間一般的に、こういう手法を使うのだろうか?

おまけ

Twitterやってます!外部のエンジニアの方ともどんどん繋がりたいと考えていますので、是非フォローして頂ければと思います!@Tatsuo96
ブログ始めました!
https://note.mu/tatsuo_iriyama

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

超シンプルにLaravelでCSVのダウンロードを実装する

LaravelでCSVダウンロード機能を作りたい

Controllerに以下をコピペすれば実装できる。

HogeConroller@csvDownload
# 配列を用意(内容は各自好きな物を)
$csv = [
  ['id', 'name', 'sex'],
  ['1', 'やまだ', 'おとこ'],
];

# ファイルの保存先、public直下のディレクトリなら誰でもあるはず(本来は/csv/などのディレクトリを作りましょう)
$stream = fopen('public/users.csv', 'w');

# 配列の中身をガンガン書き込む
foreach ($csv as $line) {
  fputcsv($stream, $line);
}
fclose($stream);

# PHP.iniの設定を上書きしている。これがないとCSVの情報が画面に表示されるだけでDLされない。
ini_set('output_buffering', 'On');

# 日本語が文字化けしないようにするためのおまじない
$csv = str_replace(PHP_EOL, "\r\n", file_get_contents('public/users.csv'));
$csv = mb_convert_encoding($csv, 'SJIS-win', 'UTF-8');

# file_get_contentsでpublic以下においたファイルを読み込んでる
return response(
    $csv,
    200,
    [
        'Content-Type' => 'text/csv',
        'Content-Disposition' => 'attachment; filename="users.csv"',
    ]
);
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel mailTrapでメール送信テスト 備忘録

本記事で達成できること

Laravelでmailtrapを利用したメール送信テストを実装できるようなる。
mailtrapとはメールを送信しても実際の宛先には飛ばさず、Webサイトから確認できるというサービス。

開発環境

cloud9
php 7.0 ※バージョン確認コマンド

php -v

Laravel 5.3.31 ※バージョン確認コマンド

php artisan --version

mailTrapでユーザー登録

以下の記事を参考に登録を行う。
メールの絡む開発にはmailtrapがおすすめ

Laravel側の設定

.env ファイルを開き、以下の初期値を変更する。

変更前:

MAIL_DRIVER=smtp
MAIL_HOST=mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

変更後:

MAIL_DRIVER=smtp
MAIL_HOST= smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=[MailtrapのUsername]
MAIL_PASSWORD=[MailtrapのPassword]
MAIL_ENCRYPTION=null

上記のMAIL_USERNAMEMAIL_PASSWORD=の項目はmailTrapから情報を参照。
スクショ.png

メール送信のスクリプト

以下コマンドでメーう送信のために必要なクラスを生成。

php artisan make:mail SendMail

cloud9上の以下のディレクトリ配下にファイルが生成されていることを確認。

app/Mail/SendMail.php

以下のようなファイルが生成される。

SendMail.php
<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;

class SendMail extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('view.name');
    }
}

build()メソッドに変更を加える。

public function build()
{
    return $this
        ->from('example@example.com')
        ->subject('テスト送信完了')
        ->view('emails.test');
}

※ 変更を加えたview('emails.test');にてメールテンプレートを作成するように記述しているが、テンプレート作成方法に関しては割愛させていただきます。

生成したファイルをインスタンス化してメールを送信するために、
とりあえずroutingは以下のように設定した。

web.php
// つまり "TestMailController" の sendメソッド を利用してメールを送信する
Route::get('/mail','TestMailController@send');

cloud9上の以下のディレクトリ配下に,

app/Http/Controller

TestMailControllerファイルを作成。

TestMailController.php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
use App\Mail\TestMail;

class TestMailController extends Controller
{
    public function send(){
        return Mail::to('ryoma@gmail.com')->send(new SendMail());
    }

}

sendメソッドを発火させればmailTrapのダッシュボード上で
メールを受信できていることを確認できる。

以上

参考にした記事:MailtrapでLaravelの簡単メール送信テスト

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

PhpStorm でファイル作成時にコードテンプレート使うと少し捗るよ (IntelliJ とかも同じはず。)

PhpStorm (IntelliJとかも) に、 Project Tree などから、コンテキストメニューを呼び出し、そこから指定のファイルを作成する機能があります。(あるいは、 cmd + n)

こんなやつ。

スクリーンショット 2019-03-07 12.24.09.png

例えば、 "PHP Class" を選べば、以下のようなダイアログが出てきます。

スクリーンショット 2019-03-07 12.26.22.png

この画像の例は laravel を使った Project なので、 composer.json から適切に NameSpace 等を読み込んで事前に入力済み状態になっています。

で、例えば、 NameHogeController と入力して OK を押すと以下のようなファイルが生成されます。

<?php
/**
 * Created by PhpStorm.
 * User: hokutoasari
 * Date: 2019-03-07
 * Time: 12:28
 */

namespace App\Http\Controllers;


class HogeController
{

}

これはこれで良いのですが、 Code Template を使うことで、もうちょっと便利になります。

Code Template を設定して使ってみる

Preferences -> Editor -> File and Code Templates を開きます。

で、例えば、 "PHP Class" を以下のように編集します。

スクリーンショット 2019-03-07 12.31.10.png

<?php
declare(strict_types=1);
#if (${NAMESPACE})

namespace ${NAMESPACE};

#end

final class ${NAME} {

}

こうしておくと、さっきの cmd + n から "PHP Class" を選択して生成されるコードが以下になります。

<?php
declare(strict_types=1);

namespace App\Http\Controllers;


final class HogeController
{

}

declare(strict_types=1); を先頭に入れて、 namespace を入れて、 class には final 修飾子を付けて、といった具合に Code Template に指定した内容に従って生成されます。

他にも使える値が Code Template の設定画面に書いてあるので、お好みの設定にすると捗る。

ご参考までに

ちなみに、僕は以下の設定を行っています。

PHP File

<?php
declare(strict_types=1);


PHP Class

<?php
declare(strict_types=1);
#if (${NAMESPACE})

namespace ${NAMESPACE};

#end

final class ${NAME} {

}

PHP Interface

<?php
declare(strict_types=1);
#if (${NAMESPACE})

namespace ${NAMESPACE};

#end
interface ${NAME} {

}

PHP Trait

<?php
declare(strict_types=1);
#if (${NAMESPACE})

namespace ${NAMESPACE};

#end
trait ${NAME} {

}

PHPUnit Test

<?php
declare(strict_types=1);

#if (${NAMESPACE})
namespace ${NAMESPACE};
#end

#if (${TESTED_NAME} && ${NAMESPACE} && !${TESTED_NAMESPACE})
use ${TESTED_NAME};
#elseif (${TESTED_NAME} && ${TESTED_NAMESPACE} && ${NAMESPACE} != ${TESTED_NAMESPACE})
use ${TESTED_NAMESPACE}\\${TESTED_NAME};
#end
use Tests\Unit\TestCase;

final class ${NAME} extends#if(${NAMESPACE}) TestCase #else PHPUnit_Framework_TestCase #end{

}

./tests/Unit/TestCase.php を用意して、 Unit Test に必要そうな便利メソッドをここに書いてるので、 use Tests\Unit\TestCase; して、 extends TestCase となるように書いてます。

デフォルトの laravel Project 状態なら use Tests\TestCase; で良いんじゃないかな。

おまけ

cmd + n で表示させて状態で、おもむろに "php" とか入力するとインクリメンタルサーチになって便利ですよ。

スクリーンショット 2019-03-07 12.25.54.png

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

Laravel でも bake したい CakePHPユーザーのための infyom

CakePHPからLaravelに移行すると cake.php bake に類するものが欲しくなると思います。そういうときは infyom がおすすめです。

InfyOm Laravel Generator : Laravel Scaffold, CRUD, API Generator

この infyom、Webでの編集画面の生成は、CakePHP の bake にちょっと劣るかもしれませんが、APIの生成、テストコードの生成などもでき、十分に使えます。

使い方

Laravelの環境構築

まずは Laravel の環境を構築しておきます。

インストール 5.8 Laravel

設定は、データベースに接続できるだけで大丈夫。.env の DB_* の項目をみればだいたいわかります。

infyomのインストール、設定

その後パッケージをインストール。

composer.json に追記。5.8.x-dev, 5.8.0 のか所は利用している Laravel のバージョンに合わせます。

"require": {
    "infyomlabs/laravel-generator": "5.8.x-dev",
    "laravelcollective/html": "^5.8.0",
    "infyomlabs/adminlte-templates": "5.8.x-dev",
# インストール
composer update

config/app.php の2か所に追記

    'providers' => [
        // ...略
        Collective\Html\HtmlServiceProvider::class,
        Laracasts\Flash\FlashServiceProvider::class,
        Prettus\Repository\Providers\RepositoryServiceProvider::class,
        \InfyOm\Generator\InfyOmGeneratorServiceProvider::class,
        \InfyOm\AdminLTETemplates\AdminLTETemplatesServiceProvider::class,
    ],
    'aliases' => [
        // ...略
        'Form'      => Collective\Html\FormFacade::class,
        'Html'      => Collective\Html\HtmlFacade::class,
        'Flash'     => Laracasts\Flash\Flash::class,
    ],

その後、設定ファイルや infyom 関連ファイルを展開。

php artisan vendor:publish --all
php artisan infyom:publish
php artisan infyom.publish:layout

テーブルの準備と画面の作成

とりあえず準備されているマイグレーションファイルから users テーブルを作成します。

php artisan migrate

CRUDの作り方

php cake.php bake all [Model]的な使い方、uses テーブルのCRUDを作る場合。

php artisan infyom:scaffold User --fromTable --tableName=users

書き方は

php artisan infyom:scaffold 生成するモデル名 --fromTable --tableName=元となるテーブル名

という形です。

自動生成されたモデルをちょっと修正

生成されたコードは softDelete が有効になっていますが、テーブルにはカラムがないので、コメントアウトします。

app/Models/User.php

    //use SoftDeletes;

また、IDが必須になっているのでそれをコメントアウトし無効にします。

    public static $rules = [
        // 'id' => 'required',

コマンド実行時にこのようなエラーが出たら

   Symfony\Component\Debug\Exception\FatalThrowableError  : Class 'Doctrine\DBAL\Driver\PDOMySql\Driver' not found

以下のコマンドを実行後、もう一度 php artisan infyom:scaffold ... を実行してください。

composer require doctrine/dbal

動作確認

サーバーを起動して

php artisan serve

http://127.0.0.1:8000/users

を開きます。

生成される画面はこんな感じ。

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

Laravel でもCRUD を bake したい CakePHPユーザーのための infyom

CakePHPからLaravelに移行すると cake.php bake に類するものが欲しくなると思います。そういうときは infyom がおすすめです。

InfyOm Laravel Generator : Laravel Scaffold, CRUD, API Generator

この infyom、Webでの編集画面の生成は、CakePHP の bake にちょっと劣るかもしれませんが、APIの生成、テストコードの生成などもでき、十分に使えます。

使い方

Laravelの環境構築

まずは Laravel の環境を構築しておきます。

インストール 5.8 Laravel

設定は、データベースに接続できるだけで大丈夫。.env の DB_* の項目をみればだいたいわかります。

infyomのインストール、設定

その後パッケージをインストール。

composer.json に追記。5.8.x-dev, 5.8.0 のか所は利用している Laravel のバージョンに合わせます。

"require": {
    "infyomlabs/laravel-generator": "5.8.x-dev",
    "laravelcollective/html": "^5.8.0",
    "infyomlabs/adminlte-templates": "5.8.x-dev",
# インストール
composer update

config/app.php の2か所に追記

    'providers' => [
        // ...略
        Collective\Html\HtmlServiceProvider::class,
        Laracasts\Flash\FlashServiceProvider::class,
        Prettus\Repository\Providers\RepositoryServiceProvider::class,
        \InfyOm\Generator\InfyOmGeneratorServiceProvider::class,
        \InfyOm\AdminLTETemplates\AdminLTETemplatesServiceProvider::class,
    ],
    'aliases' => [
        // ...略
        'Form'      => Collective\Html\FormFacade::class,
        'Html'      => Collective\Html\HtmlFacade::class,
        'Flash'     => Laracasts\Flash\Flash::class,
    ],

その後、設定ファイルや infyom 関連ファイルを展開。

php artisan vendor:publish --all
php artisan infyom:publish
php artisan infyom.publish:layout

テーブルの準備と画面の作成

とりあえず準備されているマイグレーションファイルから users テーブルを作成します。

php artisan migrate

CRUDの作り方

php cake.php bake all [Model]的な使い方、uses テーブルのCRUDを作る場合。

php artisan infyom:scaffold User --fromTable --tableName=users

書き方は

php artisan infyom:scaffold 生成するモデル名 --fromTable --tableName=元となるテーブル名

という形です。

自動生成されたモデルをちょっと修正

生成されたコードは softDelete が有効になっていますが、テーブルにはカラムがないので、コメントアウトします。

app/Models/User.php

    //use SoftDeletes;

また、IDが必須になっているのでそれをコメントアウトし無効にします。

    public static $rules = [
        // 'id' => 'required',

コマンド実行時にこのようなエラーが出たら

   Symfony\Component\Debug\Exception\FatalThrowableError  : Class 'Doctrine\DBAL\Driver\PDOMySql\Driver' not found

以下のコマンドを実行後、もう一度 php artisan infyom:scaffold ... を実行してください。

composer require doctrine/dbal

動作確認

サーバーを起動して

php artisan serve

http://127.0.0.1:8000/users

を開きます。

生成される画面はこんな感じ。

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

(メモ) xdomain(xfree) に laravel 5.7 をデプロイするとき.htaccessの修正が必要

  • xdomain (xfree) の php 7.1 で動かしてみた。

修正点

./public/.htaccess
-    <IfModule mod_negotiation.c>
-        Options -MultiViews -Indexes
-    </IfModule>
+    #<IfModule mod_negotiation.c>
+    #    Options -MultiViews -Indexes
+    #</IfModule>
  • http://サブドメイン.php.xdomain.jp/プロジェクト名/public/

にアクセスして表示されることを確認。
おかしい場合は以下のパーミッションを777にしてみる。

  • storage
  • bootstrap/cache

スクリーンショット_2019-03-07_11-26-54.png


以下作業メモ

FileManager

1ファイルで動く。編集にも対応。
これを使うとファイルやフォルダの削除が簡単に出来る。
※ 自分以外は使えないように適宜修正すること。

tar.gz解凍

  • デプロイの時、ファイルが9000ファイル程とUPLOADに時間がかかるため、tar.gz圧縮し、xdomain上でtar.gz解凍すると早い。
<?php
try {
    $phar = new PharData('src.tar.gz');
    $phar->extractTo('.', null, true); // すべてのファイルを展開し、上書きします
} catch (Exception $e) {
    // エラー処理
}

(参考までに)zipファイル解凍

<?php
$zipfile = 'src.zip';
$zip = new ZipArchive;
if ($zip->open($zipfile) === TRUE) {
    $zip->extractTo('.');
    $zip->close();
    echo 'success';
} else {
    echo 'some error';
}

事前準備

sudo apt install -y \
 php-zip php-mbstring php-xml php-sqlite3 php-mysql sqlite3

laravelのインストール

curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
composer global require "laravel/installer"
~/.bashrc
export PATH=$PATH:$HOME/.config/composer/vendor/bin
laravel new blog

cd blog
vi .env
.env
- DB_CONNECTION=mysql
+ DB_CONNECTION=sqlite
touch homestead
php artisan migrate
config/app.php
'timezone' => 'Asia/Tokyo'
'locale' => 'ja'
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

(メモ) Xdomain に laravel 5.7 をデプロイするとき.htaccessの修正が必要

修正点

  • /blog/public/ 以外にアクセスされた時、 /blog/public/ にアクセスさせる方法。
    • 例) /blog/.env にアクセスされた時に /blog/public/ にアクセスさせる
./.htaccess
RewriteEngine On
# 相対ディレクトリ。今回は/blogという名前。
RewriteBase /blog

# /public/が含まれていない場合、RewriteRuleに従う
RewriteCond %{REQUEST_URI} !/public/.*
# RewriteCondでマッチした場合、RewriteBase/public にアクセスさせる。
RewriteRule ^ public 
</IfModule>
  • 以下の修正をしないとLaravelの表示が出来ない。
./public/.htaccess
-    <IfModule mod_negotiation.c>
-        Options -MultiViews -Indexes
-    </IfModule>
+    #<IfModule mod_negotiation.c>
+    #    Options -MultiViews -Indexes
+    #</IfModule>
  • http://サブドメイン.php.xdomain.jp/プロジェクト名/public/

にアクセスして表示されることを確認。
おかしい場合は以下のパーミッションを777にしてみる。

  • storage
  • bootstrap/cache

スクリーンショット_2019-03-07_11-26-54.png

注意点

にアクセスすると表示されてしまう。
.htaccessでアクセスできないように制御が必要。

広告について

(※)3ヶ月間、ファイルマネージャのご利用、もしくはFTPでの接続が行われない場合は、広告が表示されます。

この点は注意。


以下作業メモ

FileManager

1ファイルで動く。編集にも対応。
これを使うとファイルやフォルダの削除が簡単に出来る。
※ 自分以外は使えないように適宜修正すること。

tar.gz解凍

  • デプロイの時、ファイルが9000ファイル程とUPLOADに時間がかかるため、tar.gz圧縮し、xdomain上でtar.gz解凍すると早い。
<?php
try {
    $phar = new PharData('src.tar.gz');
    $phar->extractTo('.', null, true); // すべてのファイルを展開し、上書きします
} catch (Exception $e) {
    // エラー処理
}

(参考までに)zipファイル解凍

<?php
$zipfile = 'src.zip';
$zip = new ZipArchive;
if ($zip->open($zipfile) === TRUE) {
    $zip->extractTo('.');
    $zip->close();
    echo 'success';
} else {
    echo 'some error';
}

事前準備

sudo apt install -y \
 php-zip php-mbstring php-xml php-sqlite3 php-mysql sqlite3

laravelのインストール

curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
composer global require "laravel/installer"
~/.bashrc
export PATH=$PATH:$HOME/.config/composer/vendor/bin
laravel new blog

cd blog
vi .env
.env
- DB_CONNECTION=mysql
+ DB_CONNECTION=sqlite
touch homestead
php artisan migrate
config/app.php
'timezone' => 'Asia/Tokyo'
'locale' => 'ja'
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む