- 投稿日:2019-03-07T23:11:41+09:00
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
- 投稿日:2019-03-07T18:35:46+09:00
超シンプルに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"', ] );
- 投稿日:2019-03-07T15:19:14+09:00
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_USERNAMEとMAIL_PASSWORD=の項目はmailTrapから情報を参照。
メール送信のスクリプト
以下コマンドでメーう送信のために必要なクラスを生成。
php artisan make:mail SendMailcloud9上の以下のディレクトリ配下にファイルが生成されていることを確認。
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/ControllerTestMailControllerファイルを作成。
TestMailController.phpuse 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の簡単メール送信テスト
- 投稿日:2019-03-07T12:42:03+09:00
PhpStorm でファイル作成時にコードテンプレート使うと少し捗るよ (IntelliJ とかも同じはず。)
PhpStorm (IntelliJとかも) に、 Project Tree などから、コンテキストメニューを呼び出し、そこから指定のファイルを作成する機能があります。(あるいは、
cmd + n)こんなやつ。
例えば、 "PHP Class" を選べば、以下のようなダイアログが出てきます。
この画像の例は laravel を使った Project なので、 composer.json から適切に NameSpace 等を読み込んで事前に入力済み状態になっています。
で、例えば、
NameにHogeControllerと入力して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" を以下のように編集します。
<?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-07T11:27:38+09:00
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 の環境を構築しておきます。
設定は、データベースに接続できるだけで大丈夫。
.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 updateconfig/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 migrateCRUDの作り方
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を開きます。
生成される画面はこんな感じ。
- 投稿日:2019-03-07T11:27:38+09:00
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 の環境を構築しておきます。
設定は、データベースに接続できるだけで大丈夫。
.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 updateconfig/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 migrateCRUDの作り方
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を開きます。
生成される画面はこんな感じ。
- 投稿日:2019-03-07T11:20:46+09:00
(メモ) 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
以下作業メモ
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 sqlite3laravelのインストール
curl -sS https://getcomposer.org/installer | php sudo mv composer.phar /usr/local/bin/composer composer global require "laravel/installer"~/.bashrcexport PATH=$PATH:$HOME/.config/composer/vendor/binlaravel new blog cd blog vi .env.env- DB_CONNECTION=mysql + DB_CONNECTION=sqlitetouch homestead php artisan migrateconfig/app.php'timezone' => 'Asia/Tokyo' 'locale' => 'ja'
- 投稿日:2019-03-07T11:20:46+09:00
(メモ) Xdomain に laravel 5.7 をデプロイするとき.htaccessの修正が必要
- Xdomain (無料プラン) の php 7.1 で動かしてみた。
修正点
- /blog/public/ 以外にアクセスされた時、 /blog/public/ にアクセスさせる方法。
- 例) /blog/.env にアクセスされた時に /blog/public/ にアクセスさせる
./.htaccessRewriteEngine 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
注意点
にアクセスすると表示されてしまう。
.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 sqlite3laravelのインストール
curl -sS https://getcomposer.org/installer | php sudo mv composer.phar /usr/local/bin/composer composer global require "laravel/installer"~/.bashrcexport PATH=$PATH:$HOME/.config/composer/vendor/binlaravel new blog cd blog vi .env.env- DB_CONNECTION=mysql + DB_CONNECTION=sqlitetouch homestead php artisan migrateconfig/app.php'timezone' => 'Asia/Tokyo' 'locale' => 'ja'








