20190829のPHPに関する記事は9件です。

さくらネットのレンタルサーバーにLaravelを導入してみた

サーバーと契約

さくらネットのHPから簡単に契約できました。
契約したら1、2分でIDとかがメールで届きました。
仮登録という件名のメールにサーバーのパスワードとか入ってました。
これを大事にメモしておく。

自分のアドレスのパス

さくらネットでは(というか他もそうかもしれないが)
/home/hoge/www/
がホームディレクトリになる。
(hogeは自分のユーザー名)

試しに何か転送してみる

試しに適当なindex.htmlを作成して

scp index.html hoge@hoge.sakura.ne.jp:~/www

か、FTPソフトでwww直下においてみる。
ドメイン名にもユーザー名と同じhogeがつくのでハマりやすいです。ていうか軽くハマりました。
メールちゃんとみたほうが良いです。
それで
http://www.hoge.sakura.ne.jp/index.html
にアクセスして開けたらとりあえず自分のサーバー領域は稼働しています。
apachとか自分で立ち上げなくても初めから常時起動しています。

Laravelアプリを転送

本当はgitをうまく使うと楽に管理できるらしいのですが、そういうのはもっと詳しく書いている人がいるのでそちらをみてください。私もそのうちチャレンジするつもりです。
というわけで、今回はゴリ押しでアプリのフォルダごと一式全部さっきのwwwフォルダ直下にscpで送ります。
これはFTPソフトよりターミナルが楽だと思います。

scp -r helloApp hoge@hoge.sakura.ne.jp:~/www

scp -r でフォルダ丸ごとコピーできます。
これで
http://hoge.sakura.ne.jp/helloApp/public/index.php

がアプリのトップページになります。
間のpublicとかなくすやり方も他のページググったら出てきます。

MySQLにつなぐ

繋ぎ方はローカルサーバーより簡単だったので
やり方は他のページを見てもらうとして、
ハマったことだけ書きます。

.envファイルを編集するのですが、sshでサーバーのシェルに入ってvimを使おうとしたらカーソルキーが使えなくて操作できなかった。筆者の環境がたまたまかもしれない。
ですが、さくらの管理ページから入ると専用のWEBエディタが使えてメモ帳みたいな感じで簡単に編集できました。

パスワードなどが違ってDBに接続できない。
ホスト名とか必要なことが一式管理ページにあるのでそれを使えば動きました。

パスワードとかがきちんと合えば、sshでアプリのフォルダにcdで入って
php artisan migration
php artisan db:seed
でローカルのDBがサーバーに再現できちゃいます。すごい。

テーブル名が大文字・小文字が違って繋がらない。
マイグレーションまでできたは良いが、あるはずのテーブルがselectできないと言われた。
まさかと思いつつエラーメッセージに合わせたら動いた。
ローカルでは動いていたんだけど。
どうもMySQLはバージョンによって大文字小文字を同一視したり分けたりするらしいです。
対応は他の方が書いてくれています。

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

[WordPress]includeしたPHPのソースがブラウザに表示されてしまう

実施環境

  • Windows10
  • xampp
  • WordPress 5.2.2
  • PHP 7.3.7

経緯

独自テンプレート内のindex.phpでhoge.phpをincludeしたところ
hoge.php内のechoで記述したhtmlを認識してしまい、ブラウザ上にPHPのソースが表示されてしまいました。

page-xxx.php
<?php
/**
 * 
 * Template Name:サンプルテンプレート
 * 
 */
get_header();
?>
<?php
  include __DIR__.'index.php';
?>
<?php
  get_footer();
?>
hoge.php
<?php
  function strOutput(){
    echo '<p>hogehoge!</p>'
  }
?>
index.php
<?php
  include __DIR__.'hoge.php';
?>
  <body>
    <div>
      <?php strOutput(); ?>
    </div>
  </body>

解決策

.phpの拡張子を持つファイルをPHPファイルとして認識してもらうためにApacheの設定を修正しました。
xamppがインストール済だと以下に設定ファイルが配置してあります。

C:\\xampp\\apache\\conf\\httpd.conf

ファイルを開き、最下部に以下を追記し保存。

AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

Apacheを再起動します。

参考資料

参考にさせていただきました!
http://www.8acrewood.com/wordpress/archives/249

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

Laravelでリレーションされているデータをpaginateする

色々躓いたのでまとめておきます。

前提

PHP 7.0
Laravel 5.5

データ構造

Work

id category_id title
1 1 なんかのしごと

WorkCategory

id name
1 未分類

やりたいこと

上記データ構造のデータを下記のような形で返すAPIを作りたい

{
  "id": "1",
  "category_name": "未分類",
  "title": "なんかのしごと" 
}

かつ、Laravelさんのページネーション情報つきで!

1対1リレーションするようにモデルを変更する

Eloquent:リレーション 5.5 Laravel

Work.php
class Work extends Model {
    public function workCategory() {
        return $this->hasOne('App\models\WorkCategory', 'id', 'category_id');
    }
}

躓いたこと

workCategory ではなく categoryName にして名前だけ直接取ろうとして、なんか色々だめでした。
素直に関連するモデル名にしたらすんなり動きました。

下記だめだったコード

だめだったコード
class Work extends Model {
    public function categoryName() {
        return $this->hasOne('App\models\WorkCategory', 'id', 'category_id')->name;
    }
}

主に name が存在しないという感じで怒られていました。
また、名前だけを取る方法をやめ WorkCategory 自体を持つように変えています。

EagerLoad を使う

Work::paginate(9); ではなく Work::with('workCategory')->paginate(9); を使う。

WorkRepository.php
class WorkRepository {

    public function getPaginateWorks() {
        return Work::with('workCategory')->paginate(9);
    }
}

Resources を用意してJSONに変換する

Laravel 5.5 Eloquent: APIリソース のようにモデルをJSONに変換する層が用意されているみたいです。

$ php artisan make:resource PaginatedWorks --collection

artisan にリソースを作ってもらって、先程の変換ロジックを入れます。

PaginatedWorks.php
class PaginatedWorks extends ResourceCollection {
    public function toArray($request) {
        return ['data' => $this->collection->transform([$this, 'map'])];
    }

    public function map($work) {
        return [
            'id' => $work->id,
            'category_name' => $work->workCategory->name,
            'title' => $work->title
        ];
    }
}

paginate 内のデータ変換には transform メソッドを使うと良いみたいです。

callable は配列で渡してもOK

Resouces を知る前に書いていたので Repository になっています

WorkRepository.php
class WorkRepository {

    public function getPaginateWorks() {
        $works = Work::with('workCategory')->paginate(9);
        $works->getCollection()->transform([$this, 'map']);
        return $works;
    }

    public function map(Work $work) {
        return [
            'id' => $work->id,
            'category_name' => $work->workCategory->name,
            'title' => $work->title
        ];
    }
}

はじめのうち transform$this->map を渡していて
Undefined property: App\\Repositories\\WorkRepository::$map と怒られていました。
調べたところ [$this, 'map'] という風に配列で渡してやれば実行してくれるとのこと。
渡す配列は1つ目にインスタンス、2つ目に実行するメソッド名の文字列。

下記だめだったコード

だめだったコード
class WorkRepository {
    public function getPaginateWorks() {
        $works = Work::with('workCategory')->paginate(9);
        $works->getCollection()->transform($this->map);
        return $works;
    }

    private function map(Work $work) {
        return [
            'id' => $work->id,
            'category_name' => $work->workCategory->name,
            'title' => $work->title
        ];
    }
}

渡したいメソッドを private で定義していたところも躓いていました。
なお PHP7.1 以上であれば private で渡せる方法がある模様です。

結果

WorkController.php
class WorksController extends Controller {
    public function __construct() {
    }

    public function index(Request $request) {
        $paginatedWorks = (new WorkRepository())->getPaginatedWorks();
        return new PaginatedWorks($paginatedWorks);
    }
}
Work.php
class Work extends Model {
    public function workCategory() {
        return $this->hasOne('App\models\WorkCategory', 'id', 'category_id');
    }
}
WorkRepository.php
class WorkRepository {
    public function getPaginateWorks() {
        return Work::with('workCategory')->paginate(9);
    }
}
PaginatedWorks.php
class PaginatedWorks extends ResourceCollection {
    public function toArray($request) {
        return ['data' => $this->collection->transform([$this, 'map'])];
    }

    public function map($work) {
        return [
            'id' => $work->id,
            'category_name' => $work->workCategory->name,
            'title' => $work->title
        ];
    }
}
Response
{
  "data": [
    {
      "id": 1,
      "category_name": "\u672a\u5206\u985e",
      "title": "\u30af\u30ec\u30b9\u30c8\u30db\u30fc\u30eb\u30c7\u30a3\u30f3\u30b0\u30b9 \u30b3\u30fc\u30dd\u30ec\u30fc\u30c8\u30b5\u30a4\u30c8\u5236\u4f5c"
    }
  ],
  "links": {
    "first": "\/api\/works?page=1",
    "last": "\/api\/works?page=1",
    "prev": null,
    "next": null
  },
  "meta": {
    "current_page": 1,
    "from": 1,
    "last_page": 1,
    "path": "\/backoffice\/api\/works",
    "per_page": 9,
    "to": 1,
    "total": 1
  }
}

Responsepath は少し変えてます。

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

PHPとStripe(決済サービス)で決済処理を実装してみる

Stripeにはテスト環境があって簡単に決済処理が試せるとの事だったので試してみました。

Stripeとは

API型の決済サービスです。
APIベースで決済処理を記述できます。
会員登録するとテスト用のAPIキーが発行されるので簡単に動作確認が出来ます。

Stripeの大まかな機能&サービス

  • Payments
    • 支払い機能
  • Billing
    • 定期的な支払い機能
  • Connect
    • 支払いを別の利用者に送金する機能
  • Sigma
    • SQLを用いてトランザクションデータからカスタムレポートを作成する機能
  • Atlas
    • アメリカでインターネットビジネスを始める起業家を支援するサービス
  • Radar
    • 支払い履歴から不正な支払を検出する機能
  • Issuing
    • 物理カード、仮想カードを発行するサービス
  • Terminal
    • 物理カードリーダを経由して支払いを行う機能(2019年8月現在 日本では利用できない)

今回は支払い機能(Payments)に絞って触っていきます。
その他の機能の詳細については公式ドキュメントを参照してください。
Documentation | Stripe

支払い機能(Payments)について

ウェブ、モバイルでのクレジットカード支払いをサポートしています。
更にいくつかの機能に分かれます。

  • Checkout
    • Stripeが用意する決済フォームを経由して決済する方法です。
    • あらかじめ、Stripeのダッシュボードで商品と価格を登録しておいて、発行されるリンクを設置するだけで決済することもできます。
  • Card Payment
    • 自サイトにクレジットカード情報入力欄(Stripe Elements)を設置して、ユーザにクレジットカード情報を入力して貰って決済します。
    • カード情報を保存しておき、任意のタイミングで決済する事も出来ます。

Stripe Elementsについて

Stripeが提供している、クレジットカード情報を入力するUIコンポーネントです。
web, iOS, Androidをサポートしています。

以下の画像の様なクレジットカード情報入力欄を構築できます
image.png

動かして試せる環境を用意しました

DockerでWebアプリケーションを起動して実際に動かせるサンプルを作りました。
ソースコードを書き換えてみる事も出来ます。
HTTPSに対応したサーバを用意しなければいけないので自前でやろうとするとそこそこ面倒かと思います。
詳しい起動方法はReadmeを参照してください。
GitHub - t-kuni/stripe-php-sample

フォルダ構成について

srcフォルダにサンプルソースコードが格納されています。
目的別にフォルダを分けており、以下の様になっています。

  • checkout
    • Stripeが用意する決済フォーム(Checkout)を経由して決済する
  • charge
    • 自サイトに設置したクレジットカード情報入力欄を用いて決済(Charge)する
  • create-customer
    • 顧客情報(Customer)を作成する
  • customers
    • 顧客(Customer)の一覧を表示する
  • charge-by-customer
    • 顧客IDを元に決済(Charge)する
  • card-list
    • クレジットカードの一覧を表示する
  • add-card
    • クレジットカードを追加する

※括弧書きの英名はStripeの用語に対応しています

テスト用のクレジットカード

テスト用のクレジットカード情報は以下の公式ドキュメントに記載があります。
Test card numbers and tokens

カードブランド毎に番号が割り振られています。
有効期限とCVCは何でも良い様です。

決済フォーム(Checkout)で決済する

概要

CheckoutはStripeが用意する決済フォームにリダイレクトするだけで決済ができる機能です。
「月次のバッチ処理で決済を行う」といったケースには対応できませんが、
シンプルなECサイトなどで活用すれば工数を掛けずに決済処理が実装できるかと思います。

(以下の画像の様な決済フォームが表示されます)
image.png

なお、Stripeのダッシュボードであらかじめ商品名や金額などを登録しておけば、リンクを張るだけで決済できる方法もありますが、ここではあえてPHPを使う方法を使っています。

大まかな流れは以下の様になります。

image.png

処理内容の解説

以下のサンプルコードに沿って解説していきます
/src/checkout/index.php

1. Stripeライブラリの初期化(サーバサイド)

Stripeから提供されるシークレットキーパブリックキーを設定してライブラリを初期化します。
シークレットキーとパブリックキーはStripeのダッシュボードから取得できます。

/src/checkout/index.php#L4-L11

$dotenv = Dotenv\Dotenv::create('../');
$dotenv->load();

$secretKey = getenv('STRIPE_SECRET_KEY');
$publicKey = getenv('STRIPE_PUBLIC_KEY');

\Stripe\Stripe::setApiKey($secretKey);

なお、それぞれのキーについてはハードコードするのを避けるため、phpdotenvを使って.envファイルから読み込む様にしています。

PHPのStripeライブラリの導入はコチラを参考にしてください。

2. 支払いフォームを構築するリクエストをStripe APIに送信する

商品名や商品画像、価格、数量を指定してフォームを構築するリクエストをStripe APIに送信します。
処理は同期的に実行され、通信している事を意識せず利用する事ができます。
処理に失敗した場合は例外Stripe\Error\InvalidRequestが発生します。
返り値の$sessionは手順4で参照するので保持しておきます。

/src/checkout/index.php#L13-L26

$session = \Stripe\Checkout\Session::create([
    'payment_method_types' => ['card'],
    'line_items'           => [[
        'name'        => 'T-shirt',                           // 商品名
        'description' => 'Comfortable cotton t-shirt',        // 説明
        'images'      => ['https://example.com/t-shirt.png'], // 画像URL
        'amount'      => 500,                                 // 金額
        'currency'    => 'jpy',                               // 単位
        'quantity'    => 1,                                   // 数量
    ]],
    'success_url'          => 'https://example.com/checkout/success.php', // 成功時リダイレクトURL
    'cancel_url'           => 'https://example.com/checkout/cancel.php',  // 失敗時リダイレクトURL
]);

3. Stripeライブラリの初期化(フロントエンド)

StripeのJavaScriptライブラリの読み込みと初期設定を行います。
手順1で読み込んだパブリックキーをここで使用しています。

<script src="https://js.stripe.com/v3/"></script>

<script>
    const publicKey = '<?= $publicKey ?>';

    var stripe = Stripe(publicKey);

4. 決済ボタンが押下されたら決済画面にリダイレクトする処理

決済ボタンが押下されるとredirectToCheckoutを呼び出して決済画面に遷移させます。
この時に手順2で取得した$session->idを引数に渡します。

/src/checkout/index.php#L39-L48

function onClick() {
    stripe.redirectToCheckout({
        sessionId: '<?= $session->id ?>'
    }).then(function (result) {
        // If `redirectToCheckout` fails due to a browser or network
        // error, display the localized error message to your customer
        // using `result.error.message`.
    });
}

自サイトにクレジットカード情報入力欄を設置して決済(Charge)する

概要

自サイトにクレジットカード情報入力欄を設置して決済を行う方法です。
クレジットカード情報はStripe APIを通してクレジットカードトークンに置き換えられるので
クレジットカード情報そのものを自サーバ上で扱う必要はありません。
UIとしてStripe Elementsを使用します。

大まかな流れは以下の様になります。

image.png

処理内容の解説

以下のサンプルコードに沿って解説していきます。
/src/charge/index.php
/src/charge/action.php

なお、Checkoutと重複する内容は解説を省きます。

1. クレジットカード情報入力欄の表示

formを用意しておいて、stripeのjsライブラリでクレジットカード情報入力欄を構築します。

/src/charge/index.php#L18-L31

<form action="/charge/action.php" method="post" id="payment-form" style="width: 400px;">
    <div class="form-row">
        <label for="card-element">クレジットカード情報</label>

        <div id="card-element">
            <!-- ここにクレジットカード情報入力欄が挿入される -->
        </div>

        <!-- ここにエラーメッセージが表示される -->
        <div id="card-errors" role="alert"></div>
    </div>

    <button>決済実行</button>
</form>

/src/charge/index.php#L39-L49

// スタイルのカスタマイズ
var style = {
    base: {
        fontSize: '16px',
        color: "#32325d",
    }
};

// クレジットカード情報入力欄の構築
var card = elements.create('card', {style: style});
card.mount('#card-element');

以下の様なフォームが表示されるはずです。
image.png

2. クレジットカード情報入力欄のsubmit時

submit時のリスナーを登録します。
入力されたクレジットカード情報をcreateTokenに渡して、クレジットカードトークンを取得し、取得したクレジットカードトークンを自サーバにポストします。

// submit時のリスナー
var form = document.getElementById('payment-form');
form.addEventListener('submit', function(event) {
    event.preventDefault();

    // Stripeサーバにクレジットカード情報を送信してクレジットカードトークンを取得する
    stripe.createToken(card).then(function(result) {
        if (result.error) {
            var errorElement = document.getElementById('card-errors');
            errorElement.textContent = result.error.message;
        } else {
            // クレジットカードトークンを自サーバにsubmitする
            stripeTokenHandler(result.token);
        }
    });
});

function stripeTokenHandler(token) {
    var form = document.getElementById('payment-form');
    var hiddenInput = document.createElement('input');
    hiddenInput.setAttribute('type', 'hidden');
    hiddenInput.setAttribute('name', 'stripeToken');
    hiddenInput.setAttribute('value', token.id);
    form.appendChild(hiddenInput);
    form.submit();
}

3. 決済処理

クレジットカードトークンを元に決済処理を行います。
Charge::createメソッドを使います。

stripe-php-sample/action.php at master · t-kuni/stripe-php-sample · GitHub

$token  = $_POST['stripeToken'];

$charge = \Stripe\Charge::create([
    'amount'      => 999,              // 金額
    'currency'    => 'jpy',            // 単位
    'description' => 'Example charge', // 名目
    'source'      => $token,           // クレジットカードトークン
]);

なお、クレジットカードトークンは一度しか使用できないことと、数分で失効してしまう点に注意してください。
ユーザがクレジットカード情報を入力した後、時間を開けて決済したい場合や
複数回決済する必要がある場合は、次の顧客情報(Customer)を作成します。

クレジットカード情報を保存して後で決済(Charge)する

概要

クレジットカードトークンを元に顧客情報(Customer)を生成する事ができます。
顧客情報に含まれる顧客IDをDB等に保存しておく事で、任意のタイミングで決済を行う事ができます。

大まかな流れは以下の様になります。
なお、クレジットカード情報からクレジットカードトークンを取得するまでは前章と同じです。

image.png

処理内容の解説

以下のサンプルコードに従って解説します。

顧客情報の作成
/src/create-customer/index.php
/src/create-customer/action.php
顧客IDを元に決済
/src/charge-by-customer/index.php
/src/charge-by-customer/action.php

1. 顧客ID取得処理

クレジットカードトークンをCustomer::createメソッドに渡す事で顧客情報(Customer)が作成できます。

/src/create-customer/action.php#L16-L20

$token = $_POST['stripeToken'];
$email = $_POST['email'];
$name  = $_POST['name'];
$customer = \Stripe\Customer::create([
    'source' => $token, // クレジットカードトークン
    'email'  => $email, // メールアドレス
    'name'   => $name,  // 顧客の名前
]);

$customer->idで顧客IDにアクセスできるので、これをDBなどに保存します。

2. 顧客IDを元に決済する

手順1で作成した顧客IDを用いて決済をします。
Charge::createメソッドを使います。

/src/charge-by-customer/action.php#L15-L19

$charge = \Stripe\Charge::create([
    'amount'   => $amount,     // 金額
    'currency' => 'jpy',       // 単位
    'customer' => $customerId, // 顧客ID
]);

以上が決済の主な流れです。

クレジットカードの一覧を表示する

1つの顧客情報(Customer)には、複数のクレジットカードを登録する事ができます。
顧客情報に紐づいているクレジットカードの一覧を取得するにはCustomer::allSourcesメソッドを実行します。

/src/card-list/action.php#L14-L20

$cards = \Stripe\Customer::allSources(
    $customerId, // 顧客ID
    [
        'limit'  => 3,      // 最大件数
        'object' => 'card', // リソース種別
    ]
);

レスポンスの形式については公式APIリファレンスが分かりやすいです。
https://stripe.com/docs/api/cards/list

クレジットカードを追加する

顧客情報(Customer)に、クレジットカードを登録します。
Customer::createSourceメソッドを実行します。
あらかじめクレジットカードトークンを取得しておく必要があります。

/src/add-card/action.php#L15-L20

$card = \Stripe\Customer::createSource(
    $customerId, // 顧客ID
    [
        'source' => $token, // クレジットカードトークン
    ]
);

所感

以上、PHPでStripeを用いた決済処理を実装する方法の解説でした。
Stripeの使い方のイメージが沸きましたでしょうか?

私個人の感想ですが、さすがデベロッパファーストを謳っているだけあって、簡単に実装できました。
公式ドキュメントも各言語のサンプルがあってわかりやすくて良かったです。
なんならローカルにHTTPSに対応したwebサーバを立てる方が大変だった可能性も・・・。

それでは、よきPHPライフを!

参考情報

公式ドキュメント
https://stripe.com/docs

公式APIリファレンス
https://stripe.com/docs/api

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

CodeCeption入門

よく忘れてググるのでメモっとく

CodeCeption

https://codeception.com/

PHPのテスティングフレームワーク。
単体テスト、機能テスト、受け入れテストを区別しつつ、CodeCeptionで完結できる。

  • unit ... 単体テスト
  • functional ... 機能テスト
  • acceptance ... 受け入れテスト

テストを作成

> php vendor/bin/codecept generate:cest unit User/Register

テストを実行

すべてのテストを実行

> php vendor/bin/codecept run

任意の区分のテストを実行

> php vendor/bin/codecept run unit

任意のディレクトリのテストを実行

> php vendor/bin/codecept run unit User/

任意のテストを実行

> php vendor/bin/codecept run unit User/RegisterCest
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

webarenaでubuntu その37

概要

webarenaでubuntu18.04やってみた。
php7.2やってみた。

splitが無い。

explodeで代替

ereg_replaceが無い。

preg_replaceで代替

eregiが無い。

preg_matchで代替

nowが無い。

以上。

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

phpの開発環境用のdocker-compose

horizontal.png
fattyrabbit/php-fpmを利用したローカル開発環境のdocker-compose

全体ソース:https://bitbucket.org/FattyRabbit/php-dev-docker-compose/src/master/

概要:phpの開発(laravelの開発用)のためにlocal環境を作成する目的で、以下を目指しました。

  • 出来る限り軽い
  • 他のバージョンのPhpを同時に動かす

それで選択したのが「nginx」+「php-fpm」の構成しました。

php-fpmのカスタマイズ

元になるphpのfpmは問題点としてListenポートが「9000」固定で複数のfpmを同時に利用できないところが問題でした。その為にphpのfpm(まずは7.3)のDockerfileを改善してContainerを実行する際にポートを設定出来るように修正を加えました。

改善したphp-fpmのソース:
https://bitbucket.org/dockerfile_test/php-fpm/src/master/

nginx

何回かテスト中に問題として出たのがサーバーの設定ファイルの修正があった場合、Dockerfile内でCOPYを利用すると再Buildしても上手く更新されない場合がありましたので、サーバーの管理をvolumesで管理するように設定しました。
これでDockerの再起動や中のデモンの再起動でも設定の変更が反映されるようになりました。

docker-compose.xml
    proxy:
        build: nginx
        container_name: proxy
        build:
          context: .
          dockerfile: docker-nginx/Dockerfile
        volumes:
          - ./etc/logs/nginx:/etc/nginx/logs
          - ./etc/nginx/conf.d:/etc/nginx/conf.d
          - ./etc/nginx/letsencrypt:/etc/letsencrypt
          - ./www:/var/www/
        ports:
          - 80:80
          - 443:443

php-fpm

このではListenのポートを「9001」にしてみました。

docker-compose.xml
  php-7.3:
    build:
      context: .
      dockerfile: docker-php-7.3/Dockerfile
      args:
        LISTEN_PORT: 9001
    container_name: php-7.3
    volumes:
      - ./www:/var/www/
      - ./etc/php/php.ini:/usr/local/etc/php/php.ini

nginxの設定

実際のウェブサーバーでphpを利用する設定です。

/etc/nginx/conf.d/default.conf
   location ~ \.php$ {
        fastcgi_pass    php-7.3:9001;
        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include         fastcgi_params;
    }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

オンラインエディタのススメ

phpでのwebアプリ開発を効率的に進めていくために、オンラインエディタを作ったのでその紹介です。

B-code

B-code.png

B-codeはブラウザを使ってサーバ上のファイルを直接編集するためのツールです。もうFTPは要りません。

インストール

いきなりインストールです。
B-codeはデータベースを使いません。phpがあれば動きますのでまずはインストールしてみてください。

1 githubからソースコードをダウンロードしてください。
https://github.com/TakaoNishidaBBT/B-code

2 解凍したファイルをFTP(ここだけ必要です)でwebサーバにアップしてください。
3 アップしたディレクトリ直下にinstallというディレクトリがありますのでブラウザで開きます。

アップロードしたディレクトリがhttp://hoge.com/bcode/の場合、http://hoge.com/bcode/install/となります。

B-code_intaller.png

インストール画面が開きますのでまずは、一番下の「ディレクトリパーミッションの確認」の赤くなっている行がない状態にしてください。そのあと、Basic認証、管理者アカウントをそれぞれ設定し、「確認」→「インストール」と進んでください。

インストールが完了したら下の画面が表示されます。
B-code_finished_install2.png

「管理画面へ」をクリックしログイン画面を開きます。
B-code_login.png

設定した情報でログインします。

B-code_project.png

PROJECT

PROJECT管理画面がログイン後、最初に開きます。
「新規登録」ボタンからPROJECTを作成します。

B-code_project_detail.png

ドメインとDoc Rootは、B-codeがインストールされているところがデフォルトで表示されています。
B-codeは、マルチドメインにも対応していますので、その場合はここを変更してください。

各項目を設定し、「登録」ボタンをクリックするとPROJECTが作成されます。
B-code_project2.png

「OPEN」ボタンをクリックしてエディタを起動します。

EDITOR

B-code_editor.png

空のPROJECTに既存のファイルをまとめてアップロードするにはzipファイルを使います。
B-code_upload.gif

ファイルの全選択はctl+a、削除はdeleteキーでできます。

あとは、ファイルを選択して編集するだけ。

もうFTPは要りません。

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

Laravel 5.7でControllerのファイル名を少し変更(大文字)しただけなのに、Controllerファイルが見つからないエラーが出るようになった

問題

すでに作ったControllerファイル名を変更(大文字・小文字)したら、ファイルが見つからないエラーが出てサイトが動かなくなった。表示されたエラーは以下の通り:

ErrorException (E_WARNING)
include(/hogehoge/backend/vendor/composer/../../app/Http/Controllers/NameOfController.php): 
failed to open stream: No such file or directory

環境と経緯

  • Laravel 5.7使用。
  • "php artisan make:controller nameOfController"でコントローラを追加。
  • 自動生成されたファイルの名前(nameOfController.php)を、のちに"NameOfController.php"へ変更。
  • ファイル名を変更した後で、routes/web.phpには、"Route::get('/entrance', 'NameOfController@hoge')->name('hoge');"を追加。
  • 前述の問題が発生。ErrorException・No such file or directoryエラーが発生し、サイトが動かなくなった。

解決策

ターミナルで、"composer dump-autoload"をlaravelプロジェクトのルートディレクトリで実行する。こちらのブログが参考になりました。

背景

コントローラを作っていくうちに、コントローラファイル名のケーススタイルがバラバラになってきた(camelCase名で作ったコントローラよりPascalCaseの方が多くなってきた)ため、手に負えなくなる前に統一しておこうと思った途端に起きた問題でした。

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