- 投稿日:2019-08-29T23:17:26+09:00
さくらネットのレンタルサーバーに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はバージョンによって大文字小文字を同一視したり分けたりするらしいです。
対応は他の方が書いてくれています。
- 投稿日:2019-08-29T23:14:38+09:00
[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 .phpsApacheを再起動します。
参考資料
参考にさせていただきました!
http://www.8acrewood.com/wordpress/archives/249
- 投稿日:2019-08-29T17:46:32+09:00
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リレーションするようにモデルを変更する
Work.phpclass 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.phpclass 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.phpclass 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.phpclass 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.phpclass WorksController extends Controller { public function __construct() { } public function index(Request $request) { $paginatedWorks = (new WorkRepository())->getPaginatedWorks(); return new PaginatedWorks($paginatedWorks); } }Work.phpclass Work extends Model { public function workCategory() { return $this->hasOne('App\models\WorkCategory', 'id', 'category_id'); } }WorkRepository.phpclass WorkRepository { public function getPaginateWorks() { return Work::with('workCategory')->paginate(9); } }PaginatedWorks.phpclass 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 } }
Response
のpath
は少し変えてます。
- 投稿日:2019-08-29T15:28:14+09:00
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をサポートしています。動かして試せる環境を用意しました
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サイトなどで活用すれば工数を掛けずに決済処理が実装できるかと思います。なお、Stripeのダッシュボードであらかじめ商品名や金額などを登録しておけば、リンクを張るだけで決済できる方法もありますが、ここではあえてPHPを使う方法を使っています。
大まかな流れは以下の様になります。
処理内容の解説
以下のサンプルコードに沿って解説していきます
/src/checkout/index.php1. 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を使用します。大まかな流れは以下の様になります。
処理内容の解説
以下のサンプルコードに沿って解説していきます。
/src/charge/index.php
/src/charge/action.phpなお、Checkoutと重複する内容は解説を省きます。
1. クレジットカード情報入力欄の表示
formを用意しておいて、stripeのjsライブラリでクレジットカード情報入力欄を構築します。
<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>// スタイルのカスタマイズ var style = { base: { fontSize: '16px', color: "#32325d", } }; // クレジットカード情報入力欄の構築 var card = elements.create('card', {style: style}); card.mount('#card-element');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等に保存しておく事で、任意のタイミングで決済を行う事ができます。大まかな流れは以下の様になります。
なお、クレジットカード情報からクレジットカードトークンを取得するまでは前章と同じです。処理内容の解説
以下のサンプルコードに従って解説します。
顧客情報の作成
/src/create-customer/index.php
/src/create-customer/action.php
顧客IDを元に決済
/src/charge-by-customer/index.php
/src/charge-by-customer/action.php1. 顧客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
- 投稿日:2019-08-29T15:06:32+09:00
CodeCeption入門
よく忘れてググるのでメモっとく
CodeCeption
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
- 投稿日:2019-08-29T14:25:23+09:00
webarenaでubuntu その37
- 投稿日:2019-08-29T12:14:35+09:00
phpの開発環境用のdocker-compose
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.xmlproxy: 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:443php-fpm
このではListenのポートを「9001」にしてみました。
docker-compose.xmlphp-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.ininginxの設定
実際のウェブサーバーでphpを利用する設定です。
/etc/nginx/conf.d/default.conflocation ~ \.php$ { fastcgi_pass php-7.3:9001; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
- 投稿日:2019-08-29T05:27:51+09:00
オンラインエディタのススメ
phpでのwebアプリ開発を効率的に進めていくために、オンラインエディタを作ったのでその紹介です。
B-code
B-codeはブラウザを使ってサーバ上のファイルを直接編集するためのツールです。もうFTPは要りません。
インストール
いきなりインストールです。
B-codeはデータベースを使いません。phpがあれば動きますのでまずはインストールしてみてください。1 githubからソースコードをダウンロードしてください。
https://github.com/TakaoNishidaBBT/B-code2 解凍したファイルをFTP(ここだけ必要です)でwebサーバにアップしてください。
3 アップしたディレクトリ直下にinstallというディレクトリがありますのでブラウザで開きます。アップロードしたディレクトリがhttp://hoge.com/bcode/の場合、http://hoge.com/bcode/install/となります。
インストール画面が開きますのでまずは、一番下の「ディレクトリパーミッションの確認」の赤くなっている行がない状態にしてください。そのあと、Basic認証、管理者アカウントをそれぞれ設定し、「確認」→「インストール」と進んでください。
設定した情報でログインします。
PROJECT
PROJECT管理画面がログイン後、最初に開きます。
「新規登録」ボタンからPROJECTを作成します。ドメインとDoc Rootは、B-codeがインストールされているところがデフォルトで表示されています。
B-codeは、マルチドメインにも対応していますので、その場合はここを変更してください。各項目を設定し、「登録」ボタンをクリックするとPROJECTが作成されます。
「OPEN」ボタンをクリックしてエディタを起動します。
EDITOR
空のPROJECTに既存のファイルをまとめてアップロードするにはzipファイルを使います。
ファイルの全選択はctl+a、削除はdeleteキーでできます。
あとは、ファイルを選択して編集するだけ。
もうFTPは要りません。
- 投稿日:2019-08-29T01:38:05+09:00
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の方が多くなってきた)ため、手に負えなくなる前に統一しておこうと思った途端に起きた問題でした。