- 投稿日:2020-04-07T21:57:36+09:00
Laravel でファサードを禁止されたときにすること
はじめに
Laravel はアーキテクチャの自由度が高い点でユニークなフレームワークに思う。
しかしチームで開発する上では、実装者によって書き方やアーキテクチャが変わりやすい点もある。
加えて MVC アーキテクチャだけではモデルやコントローラが太りやすい。
そんななか弊社で「DIに基づいた設計を行う」「ファーサードの使用は違法」とする「設計勧告案」が登場した。
でもあまり順守されていないように思うので、私の理解を書く。
なぜ DI か
ファサードは簡単に使える。
自分で取り込んだり、設定したりする必要があり、長くて覚えにくいクラス名を使わずに、Laravelの機能を簡素で覚えやすい文法で使ってもらえます。その上に、PHPの動的メソッドのユニークな使用方法のおかげで、簡単にテストができます。
https://readouble.com/laravel/6.x/ja/facades.html#when-to-use-facadesDI なら同じテスタビリティで、
クラスの依存関係を明示して、「大きなコンストラクタの視覚的なフィードバック」を得られる。ファサードの一番の危険性は、クラスの責任範囲の暴走です。ファサードはとても簡単に使用でき依存注入も必要ないため、簡単にクラスが成長し続ける結果、一つのクラスで多くのファサードが使われます。依存注入を使用すればクラスが大きくなりすぎることに伴う、大きなコンストラクタの視覚的なフィードバックにより、この危険性は抑制されます。
https://readouble.com/laravel/6.x/ja/facades.html#facades-vs-dependency-injection依存関係が増えてコンストラクタが大きくなったら、クラスをわけるサイン。
またはコンストラクタに小さく収まる単位にクラスの責任範囲をわけるとも言える。ヘルパは?
ヘルパもファサードと同じ利点・欠点を持ち、同様に禁止されると考える。
どう使うか
ファサードとクラスなら公式に対応表があります。
https://laravel.com/docs/6.x/facades#facade-class-reference
Carbon
Illuminate\Support\DateFactory
が使えます。
Carbon\Carbon
,Carbon\CarbonImmutable
と異なり、デフォルトの実装を順守してどちらかを返します。ヘルパ
ソースコードを見て必要なクラスを探す。
https://github.com/laravel/framework/blob/6.x/src/Illuminate/Support/helpers.php
https://github.com/laravel/framework/blob/6.x/src/Illuminate/Foundation/helpers.phpわかりづらいのであとで対応表を書くかもしれない。
おわりに
DI を使うことでクラスの依存関係を明示し、適度な責任範囲を保てる。
統一的に使われれば、ビジネスロジックを集約でき、よりメンテナンスしやすくなると思われる。
- 投稿日:2020-04-07T21:24:37+09:00
サーバーレスライブラリbrefを使い、素のPHPでHello world
ちょっと素のPHPが欲しいときがあったら、以下のようにさくっとデプロイできます。
$ serverless # プロジェクト作成 https://github.com/umihico/bref-demo/commit/0269a62 Serverless: No project detected. Do you want to create a new one? Yes Serverless: What do you want to make? AWS Node.js Serverless: What do you want to call this project? bref-demo Project successfully created in 'bref-demo' folder. You can monitor, troubleshoot, and test your new service with a free Serverless account. Serverless: Would you like to enable this? No You can run the “serverless” command again if you change your mind later. $ cd bref-demo $ composer require bref/bref # brefインストール https://github.com/umihico/bref-demo/commit/2143b4e本命のPHPファイルを追加し、serverless.ymlを設定します。0e8c61d
index.php+ <?php + + require __DIR__ . '/vendor/autoload.php'; + + lambda(function ($event) { + return [ + 'headers' => [ + 'Content-Type' => 'text/html' + ], + 'statusCode' => 200, + 'body' => '<html><!doctype html><head></head><body><h1>Go Serverless v1.0! Your function executed successfully!</h1></html>', + ]; + });
serverless.ymlprovider: name: aws - runtime: nodejs12.x + runtime: provided + +plugins: + - ./vendor/bref/bref functions: hello: - handler: handler.hello -# The following are a few example events you can configure -# NOTE: Please make sure to change your handler code to work with those events -# Check the event documentation for details -# events: -# - http: -# path: users/create -# method: get + handler: index.php + timeout: 28 + layers: + - ${bref:layer.php-73-fpm} + events: + - http: 'ANY /' + - http: 'ANY /{proxy+}' # - websocket: $connect
serverless deploy
で発行されたURLにアクセスしてみると、
ちゃんとHTMLが描写されていますね。jsonを返したい場合はこうです。66df3alambda(function ($event) { - return [ - 'headers' => [ - 'Content-Type' => 'text/html' - ], - 'statusCode' => 200, - 'body' => '<html><!doctype html><head></head><body><h1>Go Serverless v1.0! Your function executed successfully!</h1></html>', - ]; + return [ + 'headers' => [ + 'Content-Type' => "application/json", + ], + 'statusCode' => 200, + 'body' => json_encode(['json_key' => 'json_value']), + ]; });参考
- 投稿日:2020-04-07T16:23:52+09:00
ブラウザでnfcpyを使ってNFCタグのIDmを表示してみる
はじめに
PaSoRiでNFCタグを読み取ってブラウザに表示するというのは他の方もやっていらっしゃるのですが(WebUSBでFeliCaの一意なIDであるIDmを読む)、ただ自分の環境ではエラーが起きて使えなかったので、勉強も兼ねて別の方法で試してみることにしました。
※今回のこのNFCタグの読み取りはUbuntu環境で行いました。準備
nfcpyまでの準備はこちらの記事を参考にしました(Python で PaSoRiのセットアップ と FeliCaの読み取り)
pythonのNFCタグ読み取り用の簡潔なコードも準備しますnfc.pyimport nfc import binascii from nfc.clf import RemoteTarget try: clf = nfc.ContactlessFrontend('usb') tag = clf.connect(rdwr={ 'on-connect': lambda tag: False }) idm = binascii.hexlify(tag.idm) print(idm) except AttributeError: print("error") exit()実行すると
$python nf.py >>010104124a1a4f0fこんな感じでIDmのみ返してくれる。
コード
メインのページはjQueryを使いました。jQueryからPHPを呼び出して、さらにPHPから上で書いたpythonのコードを呼び出します。
jQueryは初めて使うので、ほとんどの部分はこちらの方の記事を参考にさせていただきました。(【PHP】Ajaxで非同期通信を行う方法。)
main.html<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>カード読み取り</title> </head> <body> <button id="button">読み取り</button> <div><br></div> <div id="result">IDmをここに表示します</div> <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> <script> $(function(){ $("#button").click(function(event){ $.ajax({ url: " main.php", dataType : "text", async: true, }).done(function(data){ $("#result").text("カードのIDmは"+data+"です"); }) }); }); </script> </body> </html>次は呼び出した先のPHP文
main.php<?php $command="sudo -S python nfc.py"; exec($command,$output); $idm=$output[0]; print $idm; exit(); ?>ここで注意なのがsudo権限が必要なことです。(本当はあまりよろしくないみたいですが…)
sudo権限なしではpythonのclf = nfc.ContactlessFrontend('usb')
の部分でエラーが起きてしまい、値を取得することが出来ません。apacheユーザーに権限を付与するため
sudo visudo
で設定ファイルを開き、www-data ALL=(root) NOPASSWD:ALLを書き加えます。
これで完成です。
ボタンを押してカードをPaSoRiにかざすと…
読み取れた!!たぶんこれはいいやり方ではないと思うのですが、今現在の自分の力量これが限界です…
詳しい方がもっとうまいやり方を見つけてくれるはず…!おわりに
なんでこんなにまどろっこしいことをしたかというと、PHPを勉強中だったからなんとしてもPHPを使いたかったからという…
まあ、これを使ってまた何か作れればいいかなと思っています。
- 投稿日:2020-04-07T16:23:52+09:00
ブラウザにnfcpyを使ってNFCタグのIDmを表示してみる
はじめに
PaSoRiでNFCタグを読み取ってブラウザに表示するというのは他の方もやっていらっしゃるのですが(WebUSBでFeliCaの一意なIDであるIDmを読む)、ただ自分の環境ではエラーが起きて使えなかったので、勉強も兼ねて別の方法で試してみることにしました。
※今回のこのNFCタグの読み取りはUbuntu環境で行いました。準備
nfcpyまでの準備はこちらの記事を参考にしました(Python で PaSoRiのセットアップ と FeliCaの読み取り)
pythonのNFCタグ読み取り用の簡潔なコードも準備しますnfc.pyimport nfc import binascii from nfc.clf import RemoteTarget try: clf = nfc.ContactlessFrontend('usb') tag = clf.connect(rdwr={ 'on-connect': lambda tag: False }) idm = binascii.hexlify(tag.idm) print(idm) except AttributeError: print("error") exit()実行すると
$python nf.py >>010104124a1a4f0fこんな感じでIDmのみ返してくれる。
コード
メインのページはjQueryを使いました。jQueryからPHPを呼び出して、さらにPHPから上で書いたpythonのコードを呼び出します。
jQueryは初めて使うので、ほとんどの部分はこちらの方の記事を参考にさせていただきました。(【PHP】Ajaxで非同期通信を行う方法。)
main.html<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>カード読み取り</title> </head> <body> <button id="button">読み取り</button> <div><br></div> <div id="result">IDmをここに表示します</div> <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> <script> $(function(){ $("#button").click(function(event){ $.ajax({ url: " main.php", dataType : "text", async: true, }).done(function(data){ $("#result").text("カードのIDmは"+data+"です"); }) }); }); </script> </body> </html>次は呼び出した先のPHP文
main.php<?php $command="sudo -S python nfc.py"; exec($command,$output); $idm=$output[0]; print $idm; exit(); ?>ここで注意なのがsudo権限が必要なことです。(本当はあまりよろしくないみたいですが…)
sudo権限なしではpythonのclf = nfc.ContactlessFrontend('usb')
の部分でエラーが起きてしまい、値を取得することが出来ません。apacheユーザーに権限を付与するため
sudo visudo
で設定ファイルを開き、www-data ALL=(root) NOPASSWD:ALLを書き加えます。
これで完成です。
ボタンを押してカードをPaSoRiにかざすと…
読み取れた!!たぶんこれはいいやり方ではないと思うのですが、今現在の自分の力量これが限界です…
詳しい方がもっとうまいやり方を見つけてくれるはず…!おわりに
なんでこんなにまどろっこしいことをしたかというと、PHPを勉強中だったからなんとしてもPHPを使いたかったからという…
まあ、これを使ってまた何か作れればいいかなと思っています。
- 投稿日:2020-04-07T15:08:16+09:00
Mac Laravel 環境構築初期やgit clone直後でローカルサーバを起動した時に500エラーが出た話
目的
- Laravelアプリの環境構築初期やgit clone直後にローカルサーバを起動すると500 Server Errorのエラーが出力される問題を解決した話をまとめる
問題のエラー
Laravelアプリのディレクトリ内で
$ php artisan serve
を実行し、ブラウザからhttp://127.0.0.1:8000/にアクセスしたところ下記の画面が表示された。原因
- Laravelアプリのルートフォルダ内に「.env」のファイルが存在しないことが原因である。
下記に問題発生時のLaravelアプリのルートフォルダ直下のフォルダ構成を記載する。
.editorconfig .env.example .git/ .gitattributes .gitignore .styleci.yml README.md app/ artisan bootstrap/ composer.json composer.lock config/ database/ package-lock.json package.json phpunit.xml public/ resources/ routes/ server.php storage/ tests/ vendor/ webpack.mix.js
解決法
下記コマンドを実行して「.env.example」ファイルを元に「.env」ファイルを作成する。
$ cd laravelアプリルートフォルダ $ cp .env.example .env下記コマンドを実行してローカルサーバを起動する。
$ php artisan servehttp://127.0.0.1:8000/にアクセスしたところ下記の画面が表示された。
アプリケーションキーがないので作ってくれと怒られたので、一旦ローカルサーバを止めて、ブラウザに記載されているコマンドを実行する。
$ cd laravelアプリルートフォルダ $ php artisan key:generate >Application key set successfully.下記コマンドを実行してローカルサーバを起動する。
$ php artisan serve自分が作成中のLaravelアプリのホーム画面がブラウザから確認することができた。
- 投稿日:2020-04-07T14:23:49+09:00
Doctrine で Oracle の日付を扱う時にすること
Symfony を使っていて Doctrine で Oracle データベースの日付を扱う時に
Could not convert database value "10-11-10" to Doctrine Type dateというようなエラーがでました。
Oralce が返してくる日付フォーマットと Doctrine のフォーマットが合わないので、このようなエラーが出ます。
sqlplus
コマンドで、日付を含むテーブルをクエリしてみると、フォーマットがそのようになっています。NLS_DATE_FORMAT
を指定すると、そのフォーマットで返ってくるようになります。では、Symfony ではどうしたらよいのでしょう。
https://github.com/doctrine/DoctrineBundle/issues/217#issuecomment-68053651
こちらの答えがありました。
service.yaml に次の定義を追加します。
oracle.listener: class: Doctrine\DBAL\Event\Listeners\OracleSessionInit tags: - { name: doctrine.event_listener, event: postConnect }このサービスは、Doctrine に初めから用意されているものです。
そのヘッダ部のコメントにこう書いてあります
/** * Should be used when Oracle Server default environment does not match the Doctrine requirements. * * The following environment variables are required for the Doctrine default date format: * * NLS_TIME_FORMAT="HH24:MI:SS" * NLS_DATE_FORMAT="YYYY-MM-DD HH24:MI:SS" * NLS_TIMESTAMP_FORMAT="YYYY-MM-DD HH24:MI:SS" * NLS_TIMESTAMP_TZ_FORMAT="YYYY-MM-DD HH24:MI:SS TZH:TZM" */
翻訳すると
Oracle Server のデフォルト環境が Doctrine の要件と一致しない場合に使われます。 Doctrine のデフォルトの日付書式には以下の環境変数が必要です。ということで、この設定をすると Oracle の日付フィールドを適切に扱えるようになります。
- 投稿日:2020-04-07T13:37:49+09:00
PHPでcsv(tsv)ファイルを読み込み・書き出しする方法
PHPでcsvファイルまたはtsvファイルの読み込み・書き出しする方法を紹介します。
どちらのファイルも手順と使用する関数は同じです。
(関数に指定するパラメータは一部異なります。)■補足情報
csvファイル…データがカンマ(,)で区切られた形式のファイル。
tsvファイル…データがタブ(/t)で区切られた形式のファイル。■手順
・「読み込み」の場合
1:fopen関数で読み込むファイルを指定する
2:fgetcsv関数でファイル内のデータを読み込む
3:fclose関数で読み込んでいたファイルを閉じる<?php //読み込み("r")でファイルを指定 $fo = fopen("FileName_r.sv", "r"); if (true == $fo) { //ファイル内の列を配列形式で$dataに格納する //tsvファイルの場合は「fgetcsv($fo, 0, "\t")」とする while ($data = fgetcsv($fo)) { //$dataに対する処理がある場合はここに記載 } } //読み込んでいたファイルを閉じる fclose($fo);・書き出しの場合
1:fopen関数で書き込むファイルを指定する
2:fputcsv関数でファイルに書き込みを行う
3:fclose関数で書き込んでいたファイルを閉じる<?php //書き出し("w")でファイルを指定 $fp = fopen("FileName_w.csv", "w"); //csv(tsv)ファイルに配列形式の変数($data)をデータとして追加します //tsvファイルの場合は「fputcsv($fp, $data, "\t")」とする if (true == $fp) { fputcsv($fp, $data); } //書き出していたファイルを閉じる fclose($fp); }読み込みと書き込みを同時に行う場合は、以下のようになります。
<?php $fo = fopen("FileName_r.csv", "r"); $fp = fopen("FileName_w.csv", "w"); if (true == $fo) { while ($data = fgetcsv($fo)) { //$dataに対する処理がある場合はここに記載 //$dataを列として書き出しファイルに追加 if (true == $fp) { fputcsv($fp, $data); } } fclose($fo); fclose($fp); }
- 投稿日:2020-04-07T12:55:36+09:00
laravel5.5でゲストログイン実装
ゲストログイン方法の実装をやりたかったんです。
誰かに機能を試してもらう時、いちいちユーザー登録とか面倒かなと思いましてん。若干わかりにくかったのでメモとして残します。
認証機能
Laravelにはお手軽で強力な認証機能が初めから使えるようになっています。
php artisan make:authこれだけで良いとかお手軽すぎます。
あとは新規ユーザー登録してログインすれば良いだけなんですが、ここにゲストユーザーのログイン機能を付けたいと思います。やりたいこと
公式ページにはこのように書いています。
Laravelの認証サービスにはAuthファサードでアクセスできます。クラスの最初でAuthファサードを確実にインポート>しておきましょう。次にattemptメソッドを見てみましょう。
App/Http/Controllers/Auth/LoginController.php<?php namespace App\Http\Controllers; use Illuminate\Support\Facades\Auth; class LoginController extends Controller { /** * 認証を処理する * * @return Response */ public function authenticate() { if (Auth::attempt(['email' => $email, 'password' => $password])) { // 認証に成功した return redirect()->intended('dashboard'); } } }この中の
Auth::attempt();
で認証するみたいです。
上記の引数ではemailとpasswordを渡しています。
passwordは自動でハッシュ化されるので、そのままで良いとのこと。とにかく認証するにも元のデータが必要なので、DBに適当にゲスト用データを入れます。
それに合うように、上記のemailとpasswordを決めてしまえば良いということです。
無理やりこんな感じにしました。App/Http/Controllers/Auth/LoginController.phppublic function authenticate() { $email = 'guest@guest.com'; $password = 'guestpass'; if (\Auth::attempt(['email' => $email, 'password' => $password])) { // 認証に成功した return redirect('/'); } return back(); }ルーティングもこれに合わせて調整。
web.phpRoute::get('guest', 'Auth\LoginController@authenticate')->name('login.guest');あとはボタンを押せばこのルートに飛ぶように調整しました。
中身のメモ
このLoginControllerは
AuthenticatesUsers
トレイトをuseしています。
これはvendor/laravel/framework/src/Illuminate/Foundation/Auth/
にあります。上記の
Auth::attempt();
はどこにあるん?
と思っていたらありました。
Illuminate\Auth\SessionGuard.php
だそうです。vendor/laravel/framework/src/Illuminate/Auth/SessionGuard.phppublic function attempt(array $credentials = [], $remember = false) { $this->fireAttemptEvent($credentials, $remember); $this->lastAttempted = $user = $this->provider->retrieveByCredentials($credentials); // If an implementation of UserInterface was returned, we'll ask the provider // to validate the user against the given credentials, and if they are in // fact valid we'll log the users into the application and return true. if ($this->hasValidCredentials($user, $credentials)) { $this->login($user, $remember); return true; } // If the authentication attempt fails we will fire an event so that the user // may be notified of any suspicious attempts to access their account from // an unrecognized user. A developer may listen to this event as needed. $this->fireFailedEvent($user, $credentials); return false; }さらに上記のメソッドが
Illuminate\Auth\EloquentUserProvider.php
に定義されているそうです。
どうやって見つけるんやろこれ…?気になること
かなり力技でログインさせてますが、これはある意味やりたい放題されそうで怖いです。
ゲストユーザーだけ機能を制限するような事もするべきですよね。一応目的のものはできました。
なんかやばそうな感じはあるので、随時また更新してきたいです。この記事を書くに当たってこちらを参考に勉強させてもらいました。
Laravel で認証パラメータを追加する
Laravel 5.5 認証
ありがとうございました。
- 投稿日:2020-04-07T10:37:54+09:00
Wordpressの出力内容を制御するときの超基本
まえがき
※この記事は「カスタム投稿タイプをゼロから作ってウェブサイト上に表示させるまで」
の続き。
前回の記事では書ききれなかった重要ポイントを書いていく。
なお、この記事はPHPどころかプログラムがろくに分からない人向けの記事である。基本原則1:表示と出力
前回の記事で、以下のようなコードが登場した。
single-newspaper.php<?php get_header(); ?> <section id="primary" class="content-area"> <main id="main" class="site-main"> <?php if( have_posts() ): while( have_posts() ) : the_post(); ?> <!-- 投稿(1個あたり)の内容ここから --> <!-- タイトル --> <h2><?php echo get_the_title(); ?></h2> <!-- アイキャッチ画像 --> <?php if ( has_post_thumbnail() ) : ?> <div class="images"><?php echo get_the_post_thumbnail( 'full' ); ?></div> <?php endif; ?> <!-- 本文 --> <p><?php the_content(); ?></p> <!-- 投稿(1個あたり)の内容ここまで --> <?php endwhile; endif; ?> </main> </section> <?php get_footer(); ?>もうご存知の人もいるだろうけれど、Wordpressはただ管理画面にナニかを入力しただけでは動かない。
その入力内容に対応したphpファイルを用意し、その中に規定のプログラムを書いてやらなければ、ページは白紙のままだ。たとえばここから、タイトルを表示させるコードを書き換えて以下のようにする。
single-newspaper.php<?php get_header(); ?> <section id="primary" class="content-area"> <main id="main" class="site-main"> <?php if( have_posts() ): while( have_posts() ) : the_post(); ?> <!-- 投稿(1個あたり)の内容ここから --> <!-- タイトル --> <h2></h2> <!-- アイキャッチ画像 --> <?php if ( has_post_thumbnail() ) : ?> <div class="images"><?php echo get_the_post_thumbnail( 'full' ); ?></div> <?php endif; ?> <!-- 本文 --> <p><?php the_content(); ?></p> <!-- 投稿(1個あたり)の内容ここまで --> <?php endwhile; endif; ?> </main> </section> <?php get_footer(); ?>今回は
<?php echo get_the_title(); ?>
を消してみた。
すると、ユーザーから見える個別記事のページには、アイキャッチ画像と本文だけが表示され、ページタイトルは見えなくなる。
ここんとこ、前回の記事通りにカスタム投稿タイプを作ってくれた人なら試して分かってくれているだろう。もちろんタイトルのデータ自体が消えたわけではない。ページが表示された時点でタイトルもちゃんと読み込まれてはいるのだ。マシンに表示させろと命令していないから見せていない、というだけで。
……というわけで出力のためのコードが必須なのだが、ただ書くだけじゃダメで、実際にはいくつかの制約が存在する。
基本原則2:ループ内に書く
先ほどのコード例に、以下のような記述があった。
single-newspaper.php<?php if( have_posts() ): while( have_posts() ) : the_post(); ?> <?php endwhile; endif; ?>まあざっくり言えば、先ほどの「出力のためのコード」(
<?php echo get_the_title(); ?>
とか<?php the_content(); ?>
とか)はwhile文の内側に書いてやらなくてはならないのだ。たとえばタイトルを表示させたい場合。以下のような書き方が正解となる。page-newspaper.php<?php if( have_posts() ): while( have_posts() ) : the_post(); ?> <?php echo get_the_title(); ?> <?php endwhile; endif; ?>なぜこのようにするのかというと、外側のhave_posts()等はいわゆる「主語」の役割で、中にいる<?php echo get_the_title(); ?>にどの記事のタイトルを取ってくればいいかを伝えているからなのだ。
逆に言えば、主語となるものさえあればよいということ。なので以下のような書き方もできる。page-hoge.php<?php echo get_the_title('67'); ?>これなら、上記のカッコ内(ループ内)かどうかを問わずどこにでも書ける。
ちなみにこれは「IDが67番になってる記事のタイトルを呼び出す」という意味のコードになる。この記事(※筆者が書いた記事ではないです)の「関連する投稿のタイトル・URLを表示する」で似たようなことをやっているが、原理は同じ。あちらは投稿をまるごと取ってくる
get_post()
を、get_post( 取ってきたい投稿のID )
として利用しているのだ。基本原則3:「取得」と「表示」は別物
※ここは、すでに他の動的言語を習得している人にとってはわかり切った内容なので読み飛ばしてOKだ。
見た目を操作するHTMLとは違い、phpではデータそのものの操作を行う。
要するに、パソコンに「このデータは〇〇に持っていけ」とか「このファイルには〇〇という名前をつけろ」とかいう、何らかの作業を命令するのだ。そんで、パソコンが命令した通りに仕事をすれば成功というわけ。
例えるなら、HTMLは舞台そのものの設計図であり、phpやjavascriptはその舞台でやる劇の台本なのだ。で、そのPHP(に限らず動的言語全般)の重要な要素に「変数」というのがある。
変数について知っておくべきことは3つ。
phpでの変数は基本的に頭に
$
さえついてれば、好きな名前をつけることができる($tamago_no_kimi
みたいなのでも全然オッケー。ただ、名前を付けるときは見やすさ、分かりやすさを考えた方がいい。)変数は入れ物である。変数に何らかのデータを取り込み入力することを「格納する」という。
まったく同じ名前の変数は同じイレモノとして扱われる。同じ変数に2回以上データを格納した場合(2個以上、ではないのがポイント)、先に入れた方は上書きされて消える
phpは「取得」と「表示」の2種類の方法でデータを呼び出すことができることも覚えておこう。
表示 取得 概要 呼び出したデータをユーザーに見えるように表示させること。 呼び出したデータを、ユーザーからは見えないようにしつつコンピュータに記憶させること。 補足 一度表示したら後から書き換えができないので、文字のトリミングなどの処理は表示する前に終わらせよう。 変数に格納するときには必ずこちらを使う必要あり。そのままだと存在はしてもユーザーから見えないので、ユーザーに見せたいときは「表示する」コード(echoやprintなど)が別途必要になる。 例 echo get_the_title();
$title = get_the_title();
ちなみに、ちょくちょく出てきている
echo
とはPHP関数のひとつで、echo 〇〇;
と書いたとき、〇〇部分に書いてあるデータを出力する、というプログラムだ。たとえば、Wordpress公式が出しているコードにしたって、表示用のものと取得用のものの2種類ある。
表示 取得 概要 出力に echo が不要。変数に格納はできない タイトルを出力するにはechoが必要だが、変数に格納できる。いろいろと加工できるのもこちら。途中で切ったり数字だけ抜き出したり書き換えたりとか。 例 the_title();
get_the_title();
~用例「変数への格納」~
page-hoge.php<?php $test = 'あうえい'; // この場合、変数に文字列の「あうえい」を格納したことになる。ちなみに、文字列を入力する場合は両側を""か''でかこわなければならない。また、文末には;をつけること。 $test = 1; $test = '1'; // 上の場合では変数に文字列の「1」を格納した。下の場合では変数に数値の「1」を格納した。 // 上の1は四則計算に使えないが、下の1は四則計算に利用できる。 // 当たり前だが「あうえい」みたいな文字列を数値として格納することはできない。 $test = get_field('hinichi'); // 変数にカスタムフィールドの値を格納したパターン。 // 管理画面のカスタムフィールド「hinichi」で入力したデータが取得され、ここに格納される。 ?>基本原則4:配列に気をつけよう
「出力の時には
echo
を利用すればよい」と上では書いた。上では。
これはウソじゃない。だが、例外もある。「配列」「連想配列」「オブジェクト」と呼ばれるタイプの値では、もうひと手間が必要なのだ。What is 配列?
さきほど変数についての解説をした。「変数には値を格納することができる」と。
これはなにも一つだけとは限らない。ひとつの変数に、2つ以上の値を格納することだってできる。これをやっているのが配列だ。
うーん、まあ、大雑把だが、配列がいかなるものかという話はどうでもいい。ググればすぐ出てくるだろうし。重要なのは実際の使い方だ。まず、例をお見せしよう。
page-hoge.php$hensu01 = array(8, 'grad', 'conrad'); // 配列です $hensu02 = array( 'neru-neru-neru-ne' ); // これも配列。ひとつしか入ってないけど配列、という場合もあるので気を付けよう。 echo $hensu01;さて問題。最後に
$hensu01
をechoで表示しようとしたが、これをやると何が表示されるだろうか。
もっとストレートに言おう。$hensu01
の中には3つの値が格納されているが、これをechoしたときに表示されるのは8, grad, conradのうちどれだろうか。正解は非常にシンプルだ。
実際にこれをやろうとすると、どれ一つまともに表示されずエラーが起きるのだから。
ってことは、配列(と、オブジェクト)に限っては、表示の際に単純なecho
を使ってはダメなのである。で、ここから先は配列、連想配列、オブジェクトの出力のやり方を書いていく。
……連想配列の説明がない?オブジェクトの説明がない?下手に解説すると混乱するだろうから、ここでは説明を省く。
今はとりあえず、配列と同じものだと思っておけばいい。配列の中身をぜんぶ出力する
page-hoge.php$hensu01 = array(8, 'grad', 'conrad'); // 配列です $hensu02 = array( 'neru-neru-neru-ne' ); // これも配列。ひとつしか入ってないけど配列、という場合もあるので気を付けよう。 foreach($hensu01 as $key => $value){ echo $value; } // 結果: 8gradconrad foreach($hensu01 as $key => $value){ echo $value; echo '---'; } // 結果: 8---grad---conrad foreach($hensu02 as $key => $value){ echo $value; } // 結果: neru-neru-neru-ne配列のある特定の値だけを出力する
page-hoge.php$hensu01 = array(8, 'grad', 'conrad'); // 配列です $hensu02 = array( 'neru-neru-neru-ne' ); // これも配列。ひとつしか入ってないけど配列、という場合もあるので気を付けよう。 echo $hensu01[0]; // 結果: 8 echo $hensu01[1]; // 結果: grad echo $hensu01[2]; // 結果: conrad echo $hensu01[0]; // 結果: neru-neru-neru-ne変数の後ろに何やら変な番号がついているが、これは、「キー」という。
変数が配列になったとき、見えはしないが、そこに入っている各々の値には自動的に必ず「キー」というナンバーが振られる仕組みになっている。このナンバーは0から始まり、前から順番に振られていく。つまり、この番号を指定して「$hensu01
の2番目」みたいな指定の仕方をしてやれば取り出せるというわけだ。連想配列の中身をぜんぶ出力する
page-hoge.php$hensu01 = array('first' => 8, 'second' => 'grad', 'third_hogehoge' => 'conrad'); // 配列です foreach($hensu01 as $key => $value){ echo $key; echo '-and-'; echo $value echo ' '; } // 結果: first-and-8 second-and-grad third_hogehoge-and-conrad上で話に取り上げた「キー」だが、これは自分で指定することもできるし、すでに指定してある場合もある。
「特に指定されなければ自動で前から番号が振られる」というだけであって、自分で好きなキーを指定することだってできるのだ。
で、このように、キーが自前で指定されている配列のことを「連想配列」と呼ぶ。連想配列のある特定の値だけを出力する
page-hoge.php$hensu01 = array('first' => 8, 'second' => 'grad', 'third_hogehoge' => 'conrad'); // 配列です echo $hensu01['first']; // 結果: first-and-8オブジェクトのある特定の値だけを出力する
page-hoge.php$hensu01 = new Fruit(); /* $hensu01 = object(Fruit)#1 (3) { ["name"]=> string(5) "fruit" ["color"]=> array(3) { ["red"]=> int(0) ["green"]=> int(0) ["blue"]=> int(0) } ["comment"]=> string(7) "nothing" } */ echo $hensu01->name; // 結果: fruit $hensu_instant = $hensu01->color; foreach($hensu_instant as $key => $value){ echo $key; echo '-and-'; echo $value echo ' '; } // 結果: red-and-0 green-and-0 blue-and-0 // $hensu01の中に入っているのは「オブジェクト」だが、$hensu01の中のcolorに入っているのは「連想配列」。オブジェクトは……説明しようとするとオブジェクト指向の話に入り込んで難解になってしまうので、さわりだけ。
オブジェクトが連想配列と似ているものだが、これを表示しようとした場合、変数->キー
のように、矢印でつなぐ必要がある。さいごに
分からないこと等あったら編集リクエストおねがいします
- 投稿日:2020-04-07T10:37:54+09:00
Wordpressの出力内容を制御するときの基本
まえがき
※この記事は「カスタム投稿タイプをゼロから作ってウェブサイト上に表示させるまで」
の続き。
前回の記事では書ききれなかった重要ポイントを書いていく。
なお、この記事はPHPどころかプログラムがろくに分からない人向けの記事である。基本原則1:表示と出力
前回の記事で、以下のようなコードが登場した。
single-newspaper.php<?php get_header(); ?> <section id="primary" class="content-area"> <main id="main" class="site-main"> <?php if( have_posts() ): while( have_posts() ) : the_post(); ?> <!-- 投稿(1個あたり)の内容ここから --> <!-- タイトル --> <h2><?php echo get_the_title(); ?></h2> <!-- アイキャッチ画像 --> <?php if ( has_post_thumbnail() ) : ?> <div class="images"><?php echo get_the_post_thumbnail( 'full' ); ?></div> <?php endif; ?> <!-- 本文 --> <p><?php the_content(); ?></p> <!-- 投稿(1個あたり)の内容ここまで --> <?php endwhile; endif; ?> </main> </section> <?php get_footer(); ?>もうご存知の人もいるだろうけれど、Wordpressはただ管理画面にナニかを入力しただけでは動かない。
その入力内容に対応したphpファイルを用意し、その中に規定のプログラムを書いてやらなければ、ページは白紙のままだ。たとえばここから、タイトルを表示させるコードを書き換えて以下のようにする。
single-newspaper.php<?php get_header(); ?> <section id="primary" class="content-area"> <main id="main" class="site-main"> <?php if( have_posts() ): while( have_posts() ) : the_post(); ?> <!-- 投稿(1個あたり)の内容ここから --> <!-- タイトル --> <h2></h2> <!-- アイキャッチ画像 --> <?php if ( has_post_thumbnail() ) : ?> <div class="images"><?php echo get_the_post_thumbnail( 'full' ); ?></div> <?php endif; ?> <!-- 本文 --> <p><?php the_content(); ?></p> <!-- 投稿(1個あたり)の内容ここまで --> <?php endwhile; endif; ?> </main> </section> <?php get_footer(); ?>今回は
<?php echo get_the_title(); ?>
を消してみた。
すると、ユーザーから見える個別記事のページには、アイキャッチ画像と本文だけが表示され、ページタイトルは見えなくなる。
ここんとこ、前回の記事通りにカスタム投稿タイプを作ってくれた人なら試して分かってくれているだろう。もちろんタイトルのデータ自体が消えたわけではない。ページが表示された時点でタイトルもちゃんと読み込まれてはいるのだ。マシンに表示させろと命令していないから見せていない、というだけで。
……というわけで出力のためのコードが必須なのだが、ただ書くだけじゃダメで、実際にはいくつかの制約が存在する。
基本原則2:ループ内に書く
先ほどのコード例に、以下のような記述があった。
single-newspaper.php<?php if( have_posts() ): while( have_posts() ) : the_post(); ?> <?php endwhile; endif; ?>まあざっくり言えば、先ほどの「出力のためのコード」(
<?php echo get_the_title(); ?>
とか<?php the_content(); ?>
とか)はwhile文の内側に書いてやらなくてはならないのだ。たとえばタイトルを表示させたい場合。以下のような書き方が正解となる。page-newspaper.php<?php if( have_posts() ): while( have_posts() ) : the_post(); ?> <?php echo get_the_title(); ?> <?php endwhile; endif; ?>なぜこのようにするのかというと、外側のhave_posts()等はいわゆる「主語」の役割で、中にいる<?php echo get_the_title(); ?>にどの記事のタイトルを取ってくればいいかを伝えているからなのだ。
逆に言えば、主語となるものさえあればよいということ。なので以下のような書き方もできる。page-hoge.php<?php echo get_the_title('67'); ?>これなら、上記のカッコ内(ループ内)かどうかを問わずどこにでも書ける。
ちなみにこれは「IDが67番になってる記事のタイトルを呼び出す」という意味のコードになる。この記事(※筆者が書いた記事ではないです)の「関連する投稿のタイトル・URLを表示する」で似たようなことをやっているが、原理は同じ。あちらは投稿をまるごと取ってくる
get_post()
を、get_post( 取ってきたい投稿のID )
として利用しているのだ。基本原則3:「取得」と「表示」は別物
※ここは、すでに他の動的言語を習得している人にとってはわかり切った内容なので読み飛ばしてOKだ。
見た目を操作するHTMLとは違い、phpではデータそのものの操作を行う。
要するに、パソコンに「このデータは〇〇に持っていけ」とか「このファイルには〇〇という名前をつけろ」とかいう、何らかの作業を命令するのだ。そんで、パソコンが命令した通りに仕事をすれば成功というわけ。
例えるなら、HTMLは舞台そのものの設計図であり、phpやjavascriptはその舞台でやる劇の台本なのだ。で、そのPHP(に限らず動的言語全般)の重要な要素に「変数」というのがある。
変数について知っておくべきことは3つ。
phpでの変数は基本的に頭に
$
さえついてれば、好きな名前をつけることができる($tamago_no_kimi
みたいなのでも全然オッケー。ただ、名前を付けるときは見やすさ、分かりやすさを考えた方がいい。)変数は入れ物である。変数に何らかのデータを取り込み入力することを「格納する」という。
まったく同じ名前の変数は同じイレモノとして扱われる。同じ変数に2回以上データを格納した場合(2個以上、ではないのがポイント)、先に入れた方は上書きされて消える
phpは「取得」と「表示」の2種類の方法でデータを呼び出すことができることも覚えておこう。
表示 取得 概要 呼び出したデータをユーザーに見えるように表示させること。 呼び出したデータを、ユーザーからは見えないようにしつつコンピュータに記憶させること。 補足 一度表示したら後から書き換えができないので、文字のトリミングなどの処理は表示する前に終わらせよう。 変数に格納するときには必ずこちらを使う必要あり。そのままだと存在はしてもユーザーから見えないので、ユーザーに見せたいときは「表示する」コード(echoやprintなど)が別途必要になる。 例 echo get_the_title();
$title = get_the_title();
ちなみに、ちょくちょく出てきている
echo
とはPHP関数のひとつで、echo 〇〇;
と書いたとき、〇〇部分に書いてあるデータを出力する、というプログラムだ。たとえば、Wordpress公式が出しているコードにしたって、表示用のものと取得用のものの2種類ある。
表示 取得 概要 出力に echo が不要。変数に格納はできない タイトルを出力するにはechoが必要だが、変数に格納できる。いろいろと加工できるのもこちら。途中で切ったり数字だけ抜き出したり書き換えたりとか。 例 the_title();
get_the_title();
~用例「変数への格納」~
page-hoge.php<?php $test = 'あうえい'; // この場合、変数に文字列の「あうえい」を格納したことになる。ちなみに、文字列を入力する場合は両側を""か''でかこわなければならない。また、文末には;をつけること。 $test = 1; $test = '1'; // 上の場合では変数に文字列の「1」を格納した。下の場合では変数に数値の「1」を格納した。 // 上の1は四則計算に使えないが、下の1は四則計算に利用できる。 // 当たり前だが「あうえい」みたいな文字列を数値として格納することはできない。 $test = get_field('hinichi'); // 変数にカスタムフィールドの値を格納したパターン。 // 管理画面のカスタムフィールド「hinichi」で入力したデータが取得され、ここに格納される。 ?>基本原則4:配列に気をつけよう
「出力の時には
echo
を利用すればよい」と上では書いた。上では。
これはウソじゃない。だが、例外もある。「配列」「連想配列」「オブジェクト」と呼ばれるタイプの値では、もうひと手間が必要なのだ。What is 配列?
さきほど変数についての解説をした。「変数には値を格納することができる」と。
これはなにも一つだけとは限らない。ひとつの変数に、2つ以上の値を格納することだってできる。これをやっているのが配列だ。
うーん、まあ、大雑把だが、配列がいかなるものかという話はどうでもいい。ググればすぐ出てくるだろうし。重要なのは実際の使い方だ。まず、例をお見せしよう。
page-hoge.php$hensu01 = array(8, 'grad', 'conrad'); // 配列です $hensu02 = array( 'neru-neru-neru-ne' ); // これも配列。ひとつしか入ってないけど配列、という場合もあるので気を付けよう。 echo $hensu01;さて問題。最後に
$hensu01
をechoで表示しようとしたが、これをやると何が表示されるだろうか。
もっとストレートに言おう。$hensu01
の中には3つの値が格納されているが、これをechoしたときに表示されるのは8, grad, conradのうちどれだろうか。正解は非常にシンプルだ。
実際にこれをやろうとすると、どれ一つまともに表示されずエラーが起きるのだから。
ってことは、配列(と、オブジェクト)に限っては、表示の際に単純なecho
を使ってはダメなのである。で、ここから先は配列、連想配列、オブジェクトの出力のやり方を書いていく。
……連想配列の説明がない?オブジェクトの説明がない?下手に解説すると混乱するだろうから、ここでは説明を省く。
今はとりあえず、配列と同じものだと思っておけばいい。配列の中身をぜんぶ出力する
page-hoge.php$hensu01 = array(8, 'grad', 'conrad'); // 配列です $hensu02 = array( 'neru-neru-neru-ne' ); // これも配列。ひとつしか入ってないけど配列、という場合もあるので気を付けよう。 foreach($hensu01 as $key => $value){ echo $value; } // 結果: 8gradconrad foreach($hensu01 as $key => $value){ echo $value; echo '---'; } // 結果: 8---grad---conrad foreach($hensu02 as $key => $value){ echo $value; } // 結果: neru-neru-neru-ne配列のある特定の値だけを出力する
page-hoge.php$hensu01 = array(8, 'grad', 'conrad'); // 配列です $hensu02 = array( 'neru-neru-neru-ne' ); // これも配列。ひとつしか入ってないけど配列、という場合もあるので気を付けよう。 echo $hensu01[0]; // 結果: 8 echo $hensu01[1]; // 結果: grad echo $hensu01[2]; // 結果: conrad echo $hensu01[0]; // 結果: neru-neru-neru-ne変数の後ろに何やら変な番号がついているが、これは、「キー」という。
変数が配列になったとき、見えはしないが、そこに入っている各々の値には自動的に必ず「キー」というナンバーが振られる仕組みになっている。このナンバーは0から始まり、前から順番に振られていく。つまり、この番号を指定して「$hensu01
の2番目」みたいな指定の仕方をしてやれば取り出せるというわけだ。連想配列の中身をぜんぶ出力する
page-hoge.php$hensu01 = array('first' => 8, 'second' => 'grad', 'third_hogehoge' => 'conrad'); // 配列です foreach($hensu01 as $key => $value){ echo $key; echo '-and-'; echo $value echo ' '; } // 結果: first-and-8 second-and-grad third_hogehoge-and-conrad上で話に取り上げた「キー」だが、これは自分で指定することもできるし、すでに指定してある場合もある。
「特に指定されなければ自動で前から番号が振られる」というだけであって、自分で好きなキーを指定することだってできるのだ。
で、このように、キーが自前で指定されている配列のことを「連想配列」と呼ぶ。連想配列のある特定の値だけを出力する
page-hoge.php$hensu01 = array('first' => 8, 'second' => 'grad', 'third_hogehoge' => 'conrad'); // 配列です echo $hensu01['first']; // 結果: first-and-8オブジェクトのある特定の値だけを出力する
page-hoge.php$hensu01 = new Fruit(); /* $hensu01 = object(Fruit)#1 (3) { ["name"]=> string(5) "fruit" ["color"]=> array(3) { ["red"]=> int(0) ["green"]=> int(0) ["blue"]=> int(0) } ["comment"]=> string(7) "nothing" } */ echo $hensu01->name; // 結果: fruit $hensu_instant = $hensu01->color; foreach($hensu_instant as $key => $value){ echo $key; echo '-and-'; echo $value echo ' '; } // 結果: red-and-0 green-and-0 blue-and-0 // $hensu01の中に入っているのは「オブジェクト」だが、$hensu01の中のcolorに入っているのは「連想配列」。オブジェクトは……説明しようとするとオブジェクト指向の話に入り込んで難解になってしまうので、さわりだけ。
オブジェクトが連想配列と似ているものだが、これを表示しようとした場合、変数->キー
のように、矢印でつなぐ必要がある。さいごに
分からないこと等あったら編集リクエストおねがいします
- 投稿日:2020-04-07T03:33:35+09:00
Composerとか入れたくないので簡単に使えるフレームワークを作った
そういえば僕も3ヶ月くらい前にComposerとかに依存したくなくて1ファイルで完結するフレームワークを作ってた。ソースコードはzonuexe/hogephpにある。
こういう雰囲気でコードが書ける。
index.php<?= (require __DIR__ . '/../Hoge.php')(function (Hoge\Framework $php) { $php->get('/', function () { ?> <!DOCTYPE html> <html> <title>Hoge index</title> <h1>The Hoge PHP Framework</h1> </html> <?php }); }) ?>トップページのルーティングしか定義していないが、これで起動スクリプトのコード全部だ。ほかにディスパッチ処理などのボイラープレートは要らない。
たわむれに作ったものなのでセキュリティは万全に考慮できているわけではない。
コンセプト
- フレームワーク本体は1ファイルで完結する
- ユーザーに無駄なボイラープレートは書かせない
- 副作用を容易に分離可能にし、ユニットテスト可能にする
最後の項目はまだ実装してないのだけれど、実際簡単にできる。
ファイル配置
. ├── Hoge.php ← フレームワーク本体 └── public ← ドキュメントルート ├── .htaccess ← Apacheの設定ファイル ├── favicon.ico ← 静的ファイル └── index.php ← 起動スクリプトPHPのビルトインHTTPサーバで起動するには
php -S localhost:3939 sample/index.php -t sample
だ。テンプレートエンジン
そんなものはない。PHPはテンプレートエンジンだ。
ルーティング
GET /phpinfo
というルーティングを追加したければ、こうする。$php->get('/phpinfo', function () { phpinfo(); });ルーティングに登録する関数は「HTMLを出力する」か「
[int $status, array<string,string|array<string>> $headers, string $body]
の形式の配列を返す」か、どちらか。3ヶ月前に書いた時点ではだるかったので静的ルーティングしか対応していなかった。超簡易ルーターを作成しました。の
*
を使ったパターンの書きかたがおもしろかったので、暇なときに真似しようと思う。それはそうと、パラメータを埋め込める動的ルーティングも半年くらい前に一度実装したらあまり難しくなかった。
今後の展望
- PDOを統合して簡単に使いたい気がする
- この形式ではPSR-7と同じく
setcookie
相当の操作がしにくいのでヘルパー関数を提供したい気がするこのまま忘れてしまう可能性も高い気がしますね。。。
おまけ: いままで作ったやつ
- シンプルなルーティングがしたかった - Qiita
- インスパイヤされて掲示板を作りたくなった(3) - Qiita
- PHP構築メモ: ライブラリのデモ用PHPアプリ - Qiita
- リバースルーティングの話とかもしてる
- DocCommentでPHPのユニットテストの書きやすさを劇的に改善する手法
- リバースルーティングの話とかもしてる
- OiraPHP/riha-saru
- phperkaigi-golf
- これはAura.Routerに依存している
- 投稿日:2020-04-07T00:46:55+09:00
超簡易ルーターを作成しました。
前置き
これ、本当に自分の良くない所だと思うのですが、Composerとかで入れるライブラリとかって分からないエラーが起きたり覚える事が多かったりで使うのが面倒なんですよね。
(なのでLaravelとかも中々踏み込めないでいるんですよね)ということで自分用として簡易ルータを作りました()
とりあえずTinyRouterという名前にしておきました。ソースコードは最後に載せますが、正直自分でもしっかり動くかわからないのでちゃんとしたサイトとかでは使わない方が良いです。
これの特徴
- 本体容量が小さい & 1ファイル
- $_GETなどの変数をそのまま使える。
- 少しだけNode.jsのExpressに似てる
- できることが普通のルーターに比べて少ない
- 他のルーターに比べてしっかり作られてない
- 他のルーターとの互換性がない
使い方
<?php require_once 'TinyRouter.php'; $r = new TinyRouter(); $r->get('/', function() { echo "Hello, World!"; }); $r->get('/prof/*/*', function($array) { var_dump($array); // "/prof/hello/world" にアクセスされた場合 // array(2) { // [0]=> // string(3) "hello" // [1]=> // string(3) "world" // } }, 418); $r->post('/sample', function() { redirect('/'); }); $r->all(function() { echo "404 not found"; }, 404);
$r
のところは$router
の略なので、好きな方に命名してください。仕様
- まず先に言っておきますが、このルーターは
$r->get()
,$r->post()
,$r->all()
が実行されるとプログラムが終了します。これが嫌な場合設定で変更できます。
ただ、falseにする場合は無名関数の最後にexitを追加しないと、最後のall()も同時に実行されます。(これはSwitch分と少し似ています)$r = new TinyRouter();
これでTinyRouterを読み込みます。$r->get(引数1, 引数2)
引数1にURLパス、第2引数に無名関数を置きます。
引数1のURLパスに当てはまった場合第2関数の中の無名関数が実行されます。
通常要りませんが、第2引数にステータスコードを入れると、そのステータスコードで表示します。$r->get('/prof/*', function($array){})
引数1の所にアスタリスク(*)を入れた場合、例えば/prof/test
とアクセスすると、第2引数にある無名関数の第1引数($array[0])にtestと言う文字列が入ります。
因みに:idなどのように名前は付けられません。- POSTに関しては
$r->post(引数1, 引数2)
という風にやれば良いです。$r->all(無名関数)
すべてのリクエストを受け付けます。これを最初に書けば全て、最後に書けば上記のリクエストに当てはまらなかったものが受け付けられます。これは規定でステータスコードが404になるので、例のように第2引数に404と書かなくても良いです。仕様の記載が少し雑だったかもしれませんが、プログラム自体はあまり難しくないと思います。
設定
最初の
$r = new TinyRouter();
の時点で第一引数にarrayを渡すことで設定ができます。
-all_to_return_404
⇒ all()を実行するときにHTTPステータスコード404を返します。規定: true
-responded_to_exit
⇒ アクションを実行したときにプログラムを終了します。規定: true
-accepted_regex
⇒ URL内のアスタリスクに適応する正規表現を指定します。規定: [a-zA-Z0-9\-_\.]+
$r = new TinyRouter([ 'responded_to_exit' => true, ]);ソースコード
一番上のredirectは要らない人は消しても良いです。
<?php function redirect(string $uri, int $http_response_code = 302) { header('Location: ' . $uri, true, $http_response_code); } class TinyRouter { protected $uri_info; protected $config; function __construct(array $config = []) { $this->uri_info = parse_url($_SERVER['REQUEST_URI']); $this->config = array_merge([ 'all_to_return_404' => true, 'accepted_regex' => '[a-zA-Z0-9\-_\.]+', 'responded_to_exit' => true ], $config); } public function request(string $method = 'GET', string $uri = '/', $function, int $status_code = -1) { if($method === '*') { if($status_code !== -1) { http_response_code($status_code); } if($this->config['responded_to_exit'] === true) { return $function() . exit; } else { return $function(); } } if($_SERVER["REQUEST_METHOD"] !== strtoupper($method)) { return false; } if(strpos($uri, '*') !== false) { $pattern = '/^' . preg_quote($uri, '/') . '$/'; $pattern = str_replace('\*', '(' . $this->config['accepted_regex'] . ')', $pattern); if(preg_match($pattern, $this->uri_info['path'], $matches)) { if($status_code !== -1) { http_response_code($status_code); } array_shift($matches); if($this->config['responded_to_exit'] === true) { return $function($matches) . exit; } else { return $function($matches); } } } else { if($uri === $this->uri_info['path']) { if($status_code !== -1) { http_response_code($status_code); } if($this->config['responded_to_exit'] === true) { return $function() . exit; } else { return $function(); } } } return false; } public function get(string $uri, $function, int $status_code = -1) { return $this->request('GET', $uri, $function, $status_code); } public function post(string $uri, $function, int $status_code = -1) { return $this->request('POST', $uri, $function, $status_code); } public function all($function, int $status_code = -1) { if($this->config['all_to_return_404'] === true) { $status_code = 404; } return $this->request('*', '', $function, $status_code); } }最後に
(そもそもLaravelをちゃんと勉強しろっていう話ですが)このプログラムでダメな部分などありましたら、コメントしていただけると幸いです。
- 投稿日:2020-04-07T00:46:55+09:00
【PHP】【短期】Qiitaの読んでおかなければいけない記事100選【毎日自動更新】
ページ容量を増やさないために、不具合報告やコメントは、説明記事 に記載いただけると助かります。
順位 記事名
________________________________________ユーザ 投稿日付
更新日付LGTM1 1 Cookieとセッションをちゃんと理解する hththt 15/08/07
20/01/201827
1202 【Laravel 6 & PHP 7.4 対応】Vue + Vue Router + Vuex + Laravel チュートリアル(全16回)を書きました。 MasahiroHarada 19/01/13
20/01/191809
863 Laravelの開発環境をDockerを使って構築する ucan-lab 19/02/15
20/01/31626
1364 nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する kotarella1110 16/03/17
18/04/091452
755 DI・DIコンテナ、ちゃんと理解出来てる・・? ritukiii 16/08/02
17/02/031368
546 【Laravel超入門】開発環境の構築(VirtualBox + Vagrant + Homestead + Composer) 7968 17/03/11
19/12/26646
667 【PHP超入門】Cookieとセッションについて 7968 16/08/21
19/09/25738
498 分岐アンチパターン pakkun 15/12/10
19/02/01721
539 【PHP超入門】HTTP(GET・POST)について 7968 16/07/27
19/12/18665
5810 【PHP超入門】名前空間(namespace・use)について 7968 16/10/05
19/09/25562
5111 LaravelのORMで初心者から職人へ henriquebremenkanp 16/05/29
18/12/26587
6312 PHP isset, empty, is_null の違い早見表 shinichi-takii 16/06/22
16/06/22490
5313 Laravel入門 - 使い方チュートリアル - sano1202 18/11/01
20/03/07265
8614 初心者向け。覚えておきたい 「ガード節」という書き方。 kouyan 18/03/10
19/05/27204
12315 就活のためにWEBサービスを作ったら、転職できた以上の価値をもたらしてくれた話 kd9951 18/05/08
18/05/101235
2716 これで完璧!今さら振り返る CSRF 対策と同一オリジンポリシーの基礎 mpyw 19/08/30
19/09/01758
4317 Laravelのバリデーションで指定できる内容をざっくりまとめ直しました。 fagai 15/12/18
19/08/30457
5318 【初心者向け】20分でLaravel開発環境を爆速構築するDockerハンズオン ucan-lab 19/07/18
19/10/19441
5919 Laravelの標準Authentication(Auth)の動きを調べてみる zaburo 16/02/13
20/01/13424
4020 2018年のパスワードハッシュ rana_kualu 18/02/07
20/01/14623
2821 【PHP超入門】クラス~例外処理~PDOの基礎 7968 15/04/04
19/09/25831
022 PHP開発でComposerを使わないなんてありえない!基礎編 niisan-tokyo 16/04/30
19/04/17585
2323 LINE Messaging API でできることまとめ【送信編】 kakakaori830 17/12/09
18/12/22363
2624 Laravelをこれから勉強しようと思っている人へ fagai 17/09/11
19/10/07342
2525 「あれ、チュートリアルから始まった」。僕とキャッシュとサイレントリリース。 Canon11 19/12/21
19/12/23313
626 PHPのリリース日とサポート期限 bezeklik 15/12/14
20/03/24315
2927 Laravel キャッシュクリア系コマンドなど Ping 17/06/08
18/03/22251
3228 PHPオブジェクト指向入門(前半) mpyw 14/05/25
15/01/091463
029 Laravelのファサードが全然わからなかったので自分なりに色々と調べた事 yousan 17/03/20
17/03/21261
3230 エラー画面やAPIエラーから独自エラーまで! フローチャートでちゃんと理解するLaravelの例外処理とケーススタディ kd9951 18/11/18
19/10/04302
3031 PHP(Laravel)入門者のための要点まとめ yyokii 18/06/11
19/01/20197
2732 第1回 もう怖くない DIだって知らなくていい こんなにカンタンだから今日から Laravelのサービスコンテナ を使ってみて! kd9951 18/06/06
19/10/18179
3133 PHPで日付時刻処理を書くならCarbonを使うべき yudsuzuk 16/05/01
16/05/01336
2134 Laravelで実践クリーンアーキテクチャ nrslib 19/03/14
19/03/26515
2635 [laravel] controllerからviewへの変数の受け渡しとその展開方法 ryo2132 16/08/12
19/12/19197
3536 PHPを少しでも速く動かしたい kapitan 17/07/13
17/07/13228
3837 Eloquent をおさらい shosho 17/05/31
19/01/22178
2438 VS CodeでPHPの開発をするのに導入した拡張機能 cflat0528 18/12/05
18/12/05157
3739 【Laravel】DB登録値取得時のfind()、get()、first()の返り値早見表 sola-msr 17/12/04
19/06/27160
2640 MySQL8.0 認証方式を変更する(Laravel5) ucan-lab 18/05/29
19/11/17179
1841 Laravelのディレクトリ構造について学ぶ shosho 17/04/26
17/04/26224
2642 Docker環境でLaravelを構築するまで、わずか15分。 hosono 18/03/14
19/06/01228
1443 更新! Laravel6/7「make:Auth」が無くなった 〜Laravel6/7でのLogin機能の実装方法〜MyMemo daisu_yamazaki 19/09/06
20/03/31154
4444 $_GET, $_POSTなどを受け取る際の処理 mpyw 13/07/15
18/03/171240
045 Laradockを使ったLaravel開発環境構築 J_Shell 18/03/10
19/06/23186
2146 Laravelでテストコードを書くためのチュートリアル niisan-tokyo 16/08/06
16/08/06266
2247 Laravel6 ログイン機能を実装する ucan-lab 19/09/13
20/02/17115
5448 商用環境でも使っている Laravel 用 php-fpm イメージの Dockerfile レシピ mpyw 20/03/14
20/03/27182
18249 [PHP] Xdebug のリモートデバッグ、理解していますか? castaneai 18/06/27
18/08/29197
2050 【PHP7.4】PHP7.4がリリースされたので新機能全部やる rana_kualu 19/12/01
19/12/21299
2351 3分でわかるデザインパターン入門(GoF) rch1223 17/02/20
17/02/21179
1952 もういい加減覚えよう。php.iniはどこにあるのか ritukiii 17/08/29
17/08/29140
2753 【企業サイト構築用】WordPress設計ガイドライン kgsi 16/12/13
19/03/19442
2454 新人プログラマですがjQueryのajaxがわからなすぎて勉強したまとめ okumurakengo 16/10/22
18/12/24291
1555 Laravelで気持ちよく開発をするための拡張機能のまとめ motuo 18/05/17
19/04/12133
3356 Laravelで始める依存性の注入(DI) harunbu 18/11/30
19/09/04123
2757 【Laravel サービスコンテナ 中級編】メソッドインジェクションがしたい! kd9951 18/10/09
19/05/22122
3058 【実録】WordPressサイトをAWS+Laravel+Nuxtにフルリプレイスした話 mejileben 19/06/17
20/02/26395
1459 Laravel5のアーキテクチャから学ぶより良いクラス設計 nunulk 16/08/04
17/04/05355
1460 Laravelのルーティングチートシート fagai 15/12/25
19/10/22217
2261 Laravel リポジトリパターンの実装 bmf_san 16/12/16
17/12/29199
2162 Laravelでコマンドラインアプリケーションを作成する nenokido2000 17/01/25
17/01/30168
2563 LaravelでRoute::resourceを使うときに気をつけること sympe 17/08/30
18/05/14156
1764 PHPで出来てしまうが控えたほうががいい書き方 shinkuFencer 17/01/10
17/01/23217
1665 逆引き!Composer コマンド・ライン一覧(と基本概要) KEINOS 18/06/26
20/03/15121
2366 PHPのオートロード(autoload) atwata 16/04/18
19/07/31175
1467 PHPができても他言語の学習には役に立たない理由を考えてみた。 raccy 17/05/08
18/12/11245
1268 フロー図で理解するLaravelバリデータの仕組みと、チーム開発でのケーススタディ kd9951 18/12/22
18/12/25106
2669 ECSのチュートリアル - コンテナ運用を現実のものにする niisan-tokyo 17/03/18
19/04/19181
1470 Laravel で Fat Controller を防ぐ 5 つの Tips nunulk 20/02/15
20/02/24174
17471 Laravelのバリデーションにはフォームリクエストを使おう sakuraya 16/11/07
18/02/09161
1972 Eloquentに惚れちゃう便利な機能 henriquebremenkanp 16/02/20
18/04/20237
1473 【Laravel】DBにデータを保存する方法。createとinsertの違いなど katsunory 18/01/30
18/04/04123
2274 CentOS7のPHPを5.6/7.0/7.1/7.2/7.3系にバージョンアップする heimaru1231 17/12/29
20/01/18119
2075 [Laravel5.1]Fakerチートシート tosite0345 17/10/04
17/10/04115
1776 CentOS6/CentOS7にPHP5.6/PHP7をyumでインストール ozawan 16/02/19
17/07/23506
877 P++: 銀河に平和をもたらすための奇策と決着 tadsan 19/08/14
19/08/14533
378 PHPでJSONデータの取得の仕方 fantm21 15/07/29
16/08/15246
1479 【PHP8】PHPでJITが使えるようになる rana_kualu 19/03/27
20/01/14381
2080 Laravelでプロジェクトを作成したらまずやることメモ ponko2 15/10/09
17/11/23383
981 Laravel5.6入門 基本CRUD操作を体で覚える sayama0402 18/02/16
19/05/26108
2182 in_arrayを使うときは黙って第三引数を付けること ritukiii 17/09/07
17/09/07109
2383 今時のPHP HTTPクライアントのGuzzleを使ってみた yousan 17/02/01
19/09/24141
1584 Laravel Passportの使い方まとめ zaburo 18/10/06
19/02/08114
1685 APIなどにfile_get_contents()を使うのはオススメしない理由と代替案 shinkuFencer 17/01/23
17/01/23234
1186 [LINE Bot] 位置情報から食べログ3.5以上の優良店を検索するbot作った NARI_Creator 18/07/25
19/07/24395
787 Laravel open source project で参考になりそうなもの acro5piano 17/01/16
18/10/09183
888 2つの座標間の距離を求める chiyoyo 16/11/07
19/04/22143
1989 [超簡単]LINE notify を使ってみる iitenkida7 16/10/02
19/08/22178
1190 【PHP7.4】ついにPHPにプロパティ型指定がやってくる rana_kualu 18/09/13
19/06/11361
991 Laravel で Service 層を取り入れるときに検討したいこと nunulk 19/05/26
19/05/26175
2092 Docker に Composer をインストールするベストプラクティス(と解説) yatsubashi 19/09/29
19/09/2959
4593 僕がLaravelのEloquentに$fillableでなく$guardedを指定する理由 toro_ponz 18/07/22
18/07/22109
1694 Laravelでウェブアプリケーションをつくるときのベストプラクティスを探る nunulk 16/10/20
17/10/22251
1795 脱PHP初心者!インターフェイスを理解しよう KNJ 19/08/11
19/08/13234
1096 LaravelでCRUDのAPIをささっと作る sayama0402 18/02/19
18/10/09101
1997 第3回 なんでもツッコんで気軽に取り出すLaravelサービスコンテナの核心「結合」 kd9951 19/03/20
19/09/1591
2198 Laravel+Nuxt.jsでDocker開発環境構築からHerokuデプロイまで kon_shou 19/07/09
19/07/09208
1999 OFFSETを使わない高速なページネーションの実現 mpyw 15/12/22
18/03/12326
9100 Laravel5.4以上、MySQL5.7.7未満 でusersテーブルのマイグレーションを実行すると Syntax error が発生する beer_geek 17/02/10
19/01/09147
16
1行目が総数。2行目が直近3ヵ月。 ↩
- 投稿日:2020-04-07T00:46:55+09:00
【PHP】【短期】Qiitaの今読んでおくべき記事100選【毎日自動更新】
ページ容量を増やさないために、不具合報告やコメントは、説明記事 に記載いただけると助かります。
順位 記事名
________________________________________ユーザ 投稿日付
更新日付LGTM1 1 Cookieとセッションをちゃんと理解する hththt 15/08/07
20/01/201827
1172 【Laravel 6 & PHP 7.4 対応】Vue + Vue Router + Vuex + Laravel チュートリアル(全16回)を書きました。 MasahiroHarada 19/01/13
20/01/191809
853 Laravelの開発環境をDockerを使って構築する ucan-lab 19/02/15
20/01/31626
1344 nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する kotarella1110 16/03/17
18/04/091452
745 DI・DIコンテナ、ちゃんと理解出来てる・・? ritukiii 16/08/02
17/02/031368
526 【Laravel超入門】開発環境の構築(VirtualBox + Vagrant + Homestead + Composer) 7968 17/03/11
19/12/26646
647 【PHP超入門】Cookieとセッションについて 7968 16/08/21
19/09/25738
488 分岐アンチパターン pakkun 15/12/10
19/02/01721
519 【PHP超入門】HTTP(GET・POST)について 7968 16/07/27
19/12/18665
5710 【PHP超入門】名前空間(namespace・use)について 7968 16/10/05
19/09/25562
4811 LaravelのORMで初心者から職人へ henriquebremenkanp 16/05/29
18/12/26587
6012 PHP isset, empty, is_null の違い早見表 shinichi-takii 16/06/22
16/06/22490
5213 Laravel入門 - 使い方チュートリアル - sano1202 18/11/01
20/03/07265
8514 初心者向け。覚えておきたい 「ガード節」という書き方。 kouyan 18/03/10
19/05/27204
12315 就活のためにWEBサービスを作ったら、転職できた以上の価値をもたらしてくれた話 kd9951 18/05/08
18/05/101235
2616 これで完璧!今さら振り返る CSRF 対策と同一オリジンポリシーの基礎 mpyw 19/08/30
19/09/01758
4317 Laravelのバリデーションで指定できる内容をざっくりまとめ直しました。 fagai 15/12/18
19/08/30457
5218 【初心者向け】20分でLaravel開発環境を爆速構築するDockerハンズオン ucan-lab 19/07/18
19/10/19441
5719 Laravelの標準Authentication(Auth)の動きを調べてみる zaburo 16/02/13
20/01/13424
3920 2018年のパスワードハッシュ rana_kualu 18/02/07
20/01/14623
2721 【PHP超入門】クラス~例外処理~PDOの基礎 7968 15/04/04
19/09/25831
022 PHP開発でComposerを使わないなんてありえない!基礎編 niisan-tokyo 16/04/30
19/04/17585
2223 LINE Messaging API でできることまとめ【送信編】 kakakaori830 17/12/09
18/12/22363
2624 Laravelをこれから勉強しようと思っている人へ fagai 17/09/11
19/10/07342
2525 「あれ、チュートリアルから始まった」。僕とキャッシュとサイレントリリース。 Canon11 19/12/21
19/12/23314
626 PHPのリリース日とサポート期限 bezeklik 15/12/14
20/03/24315
2927 PHPオブジェクト指向入門(前半) mpyw 14/05/25
15/01/091463
028 Laravel キャッシュクリア系コマンドなど Ping 17/06/08
18/03/22251
3129 Laravelのファサードが全然わからなかったので自分なりに色々と調べた事 yousan 17/03/20
17/03/21261
3230 エラー画面やAPIエラーから独自エラーまで! フローチャートでちゃんと理解するLaravelの例外処理とケーススタディ kd9951 18/11/18
19/10/04302
3031 PHP(Laravel)入門者のための要点まとめ yyokii 18/06/11
19/01/20197
2632 第1回 もう怖くない DIだって知らなくていい こんなにカンタンだから今日から Laravelのサービスコンテナ を使ってみて! kd9951 18/06/06
19/10/18179
3033 Laravelで実践クリーンアーキテクチャ nrslib 19/03/14
19/03/26515
2634 PHPで日付時刻処理を書くならCarbonを使うべき yudsuzuk 16/05/01
16/05/01336
2135 [laravel] controllerからviewへの変数の受け渡しとその展開方法 ryo2132 16/08/12
19/12/19197
3536 Eloquent をおさらい shosho 17/05/31
19/01/22178
2437 PHPを少しでも速く動かしたい kapitan 17/07/13
17/07/13228
3638 【Laravel】DB登録値取得時のfind()、get()、first()の返り値早見表 sola-msr 17/12/04
19/06/27160
2639 VS CodeでPHPの開発をするのに導入した拡張機能 cflat0528 18/12/05
18/12/05157
3540 MySQL8.0 認証方式を変更する(Laravel5) ucan-lab 18/05/29
19/11/17179
1841 $_GET, $_POSTなどを受け取る際の処理 mpyw 13/07/15
18/03/171240
042 Laravelのディレクトリ構造について学ぶ shosho 17/04/26
17/04/26224
2643 Docker環境でLaravelを構築するまで、わずか15分。 hosono 18/03/14
19/06/01228
1444 更新! Laravel6/7「make:Auth」が無くなった 〜Laravel6/7でのLogin機能の実装方法〜MyMemo daisu_yamazaki 19/09/06
20/03/31154
4445 Laradockを使ったLaravel開発環境構築 J_Shell 18/03/10
19/06/23186
2046 Laravelでテストコードを書くためのチュートリアル niisan-tokyo 16/08/06
16/08/06266
2047 Laravel6 ログイン機能を実装する ucan-lab 19/09/13
20/02/17115
5348 商用環境でも使っている Laravel 用 php-fpm イメージの Dockerfile レシピ mpyw 20/03/14
20/03/27182
18249 [PHP] Xdebug のリモートデバッグ、理解していますか? castaneai 18/06/27
18/08/29197
2050 【PHP7.4】PHP7.4がリリースされたので新機能全部やる rana_kualu 19/12/01
19/12/21299
2151 3分でわかるデザインパターン入門(GoF) rch1223 17/02/20
17/02/21179
1852 【企業サイト構築用】WordPress設計ガイドライン kgsi 16/12/13
19/03/19442
2353 もういい加減覚えよう。php.iniはどこにあるのか ritukiii 17/08/29
17/08/29140
2554 【実録】WordPressサイトをAWS+Laravel+Nuxtにフルリプレイスした話 mejileben 19/06/17
20/02/26398
1655 Laravelで始める依存性の注入(DI) harunbu 18/11/30
19/09/04123
2756 新人プログラマですがjQueryのajaxがわからなすぎて勉強したまとめ okumurakengo 16/10/22
18/12/24291
1457 Laravelで気持ちよく開発をするための拡張機能のまとめ motuo 18/05/17
19/04/12133
3258 【Laravel サービスコンテナ 中級編】メソッドインジェクションがしたい! kd9951 18/10/09
19/05/22122
2959 Laravelのルーティングチートシート fagai 15/12/25
19/10/22217
2260 Laravel5のアーキテクチャから学ぶより良いクラス設計 nunulk 16/08/04
17/04/05355
1461 Laravel リポジトリパターンの実装 bmf_san 16/12/16
17/12/29199
2162 Laravelでコマンドラインアプリケーションを作成する nenokido2000 17/01/25
17/01/30168
2463 LaravelでRoute::resourceを使うときに気をつけること sympe 17/08/30
18/05/14156
1764 PHPで出来てしまうが控えたほうががいい書き方 shinkuFencer 17/01/10
17/01/23217
1665 逆引き!Composer コマンド・ライン一覧(と基本概要) KEINOS 18/06/26
20/03/15121
2366 PHPができても他言語の学習には役に立たない理由を考えてみた。 raccy 17/05/08
18/12/11245
1267 PHPのオートロード(autoload) atwata 16/04/18
19/07/31175
1468 フロー図で理解するLaravelバリデータの仕組みと、チーム開発でのケーススタディ kd9951 18/12/22
18/12/25106
2669 Laravel で Fat Controller を防ぐ 5 つの Tips nunulk 20/02/15
20/02/24175
17570 ECSのチュートリアル - コンテナ運用を現実のものにする niisan-tokyo 17/03/18
19/04/19181
1471 Laravelのバリデーションにはフォームリクエストを使おう sakuraya 16/11/07
18/02/09161
1872 Eloquentに惚れちゃう便利な機能 henriquebremenkanp 16/02/20
18/04/20237
1473 【Laravel】DBにデータを保存する方法。createとinsertの違いなど katsunory 18/01/30
18/04/04123
2274 CentOS7のPHPを5.6/7.0/7.1/7.2/7.3系にバージョンアップする heimaru1231 17/12/29
20/01/18119
2075 [Laravel5.1]Fakerチートシート tosite0345 17/10/04
17/10/04115
1776 CentOS6/CentOS7にPHP5.6/PHP7をyumでインストール ozawan 16/02/19
17/07/23506
877 P++: 銀河に平和をもたらすための奇策と決着 tadsan 19/08/14
19/08/14533
378 【PHP8】PHPでJITが使えるようになる rana_kualu 19/03/27
20/01/14381
2079 PHPでJSONデータの取得の仕方 fantm21 15/07/29
16/08/15246
1480 Laravelでプロジェクトを作成したらまずやることメモ ponko2 15/10/09
17/11/23383
981 in_arrayを使うときは黙って第三引数を付けること ritukiii 17/09/07
17/09/07109
2382 Laravel5.6入門 基本CRUD操作を体で覚える sayama0402 18/02/16
19/05/26108
2083 [LINE Bot] 位置情報から食べログ3.5以上の優良店を検索するbot作った NARI_Creator 18/07/25
19/07/24395
784 今時のPHP HTTPクライアントのGuzzleを使ってみた yousan 17/02/01
19/09/24141
1385 【PHP7.4】ついにPHPにプロパティ型指定がやってくる rana_kualu 18/09/13
19/06/11361
986 Laravel Passportの使い方まとめ zaburo 18/10/06
19/02/08114
1587 Laravel で Service 層を取り入れるときに検討したいこと nunulk 19/05/26
19/05/26175
2088 APIなどにfile_get_contents()を使うのはオススメしない理由と代替案 shinkuFencer 17/01/23
17/01/23234
1089 2つの座標間の距離を求める chiyoyo 16/11/07
19/04/22143
1990 Laravelでウェブアプリケーションをつくるときのベストプラクティスを探る nunulk 16/10/20
17/10/22251
1791 Laravel open source project で参考になりそうなもの acro5piano 17/01/16
18/10/09183
792 [超簡単]LINE notify を使ってみる iitenkida7 16/10/02
19/08/22178
993 開発への異常な愛情 または私は如何にして嫉妬を止めてActive Recordを愛するようになったか KizashiTakata 19/12/04
20/03/1357
4094 LaravelでCRUDのAPIをささっと作る sayama0402 18/02/19
18/10/09101
1995 僕がLaravelのEloquentに$fillableでなく$guardedを指定する理由 toro_ponz 18/07/22
18/07/22109
1596 脱PHP初心者!インターフェイスを理解しよう KNJ 19/08/11
19/08/13234
997 第3回 なんでもツッコんで気軽に取り出すLaravelサービスコンテナの核心「結合」 kd9951 19/03/20
19/09/1591
2198 Laravel+Nuxt.jsでDocker開発環境構築からHerokuデプロイまで kon_shou 19/07/09
19/07/09208
1999 Docker に Composer をインストールするベストプラクティス(と解説) yatsubashi 19/09/29
19/09/2959
43100 Laravelのアセットに関するTips sakuraya 16/11/19
16/11/19120
16
1行目が総数。2行目が直近3ヵ月。 ↩
- 投稿日:2020-04-07T00:46:54+09:00
【PHP】【長期】Qiitaの読んでおかなければいけない記事100選【毎日自動更新】
ページ容量を増やさないために、不具合報告やコメントは、説明記事 に記載いただけると助かります。
順位 記事名
________________________________________ユーザ 投稿日付
更新日付LGTM1 1 Cookieとセッションをちゃんと理解する hththt 15/08/07
20/01/201827
5052 nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する kotarella1110 16/03/17
18/04/091452
3643 DI・DIコンテナ、ちゃんと理解出来てる・・? ritukiii 16/08/02
17/02/031368
3184 【Laravel 6 & PHP 7.4 対応】Vue + Vue Router + Vuex + Laravel チュートリアル(全16回)を書きました。 MasahiroHarada 19/01/13
20/01/191809
4115 分岐アンチパターン pakkun 15/12/10
19/02/01721
1936 【PHP超入門】Cookieとセッションについて 7968 16/08/21
19/09/25738
2957 【Laravel超入門】開発環境の構築(VirtualBox + Vagrant + Homestead + Composer) 7968 17/03/11
19/12/26646
3068 【PHP超入門】HTTP(GET・POST)について 7968 16/07/27
19/12/18665
2459 【PHP超入門】名前空間(namespace・use)について 7968 16/10/05
19/09/25562
27410 Laravelの開発環境をDockerを使って構築する ucan-lab 19/02/15
20/01/31626
47411 LaravelのORMで初心者から職人へ henriquebremenkanp 16/05/29
18/12/26587
21912 【PHP超入門】クラス~例外処理~PDOの基礎 7968 15/04/04
19/09/25831
18213 PHP isset, empty, is_null の違い早見表 shinichi-takii 16/06/22
16/06/22490
22114 Laravelのバリデーションで指定できる内容をざっくりまとめ直しました。 fagai 15/12/18
19/08/30457
19215 PHPオブジェクト指向入門(前半) mpyw 14/05/25
15/01/091463
14016 就活のためにWEBサービスを作ったら、転職できた以上の価値をもたらしてくれた話 kd9951 18/05/08
18/05/101235
10817 PHP開発でComposerを使わないなんてありえない!基礎編 niisan-tokyo 16/04/30
19/04/17585
17018 Laravelの標準Authentication(Auth)の動きを調べてみる zaburo 16/02/13
20/01/13424
16819 $_GET, $_POSTなどを受け取る際の処理 mpyw 13/07/15
18/03/171240
11820 2018年のパスワードハッシュ rana_kualu 18/02/07
20/01/14623
15521 Laravel入門 - 使い方チュートリアル - sano1202 18/11/01
20/03/07265
24122 LINE Messaging API でできることまとめ【送信編】 kakakaori830 17/12/09
18/12/22363
13423 PHPのリリース日とサポート期限 bezeklik 15/12/14
20/03/24315
12024 これで完璧!今さら振り返る CSRF 対策と同一オリジンポリシーの基礎 mpyw 19/08/30
19/09/01758
75825 初心者向け。覚えておきたい 「ガード節」という書き方。 kouyan 18/03/10
19/05/27204
16626 PHPで日付時刻処理を書くならCarbonを使うべき yudsuzuk 16/05/01
16/05/01336
12327 Laravelをこれから勉強しようと思っている人へ fagai 17/09/11
19/10/07342
13628 【初心者向け】20分でLaravel開発環境を爆速構築するDockerハンズオン ucan-lab 19/07/18
19/10/19441
44129 Laravelのファサードが全然わからなかったので自分なりに色々と調べた事 yousan 17/03/20
17/03/21261
11730 Laravel キャッシュクリア系コマンドなど Ping 17/06/08
18/03/22251
11331 [laravel] controllerからviewへの変数の受け渡しとその展開方法 ryo2132 16/08/12
19/12/19197
10932 Laravelでテストコードを書くためのチュートリアル niisan-tokyo 16/08/06
16/08/06266
9533 Eloquent をおさらい shosho 17/05/31
19/01/22178
13234 新人プログラマですがjQueryのajaxがわからなすぎて勉強したまとめ okumurakengo 16/10/22
18/12/24291
9735 Laravel5のアーキテクチャから学ぶより良いクラス設計 nunulk 16/08/04
17/04/05355
8036 PHP(Laravel)入門者のための要点まとめ yyokii 18/06/11
19/01/20197
15737 Laravelのディレクトリ構造について学ぶ shosho 17/04/26
17/04/26224
9338 PHPを少しでも速く動かしたい kapitan 17/07/13
17/07/13228
9639 【企業サイト構築用】WordPress設計ガイドライン kgsi 16/12/13
19/03/19442
6740 Docker環境でLaravelを構築するまで、わずか15分。 hosono 18/03/14
19/06/01228
12141 Laravelで実践クリーンアーキテクチャ nrslib 19/03/14
19/03/26515
15042 第1回 もう怖くない DIだって知らなくていい こんなにカンタンだから今日から Laravelのサービスコンテナ を使ってみて! kd9951 18/06/06
19/10/18179
14843 3分でわかるデザインパターン入門(GoF) rch1223 17/02/20
17/02/21179
11644 エラー画面やAPIエラーから独自エラーまで! フローチャートでちゃんと理解するLaravelの例外処理とケーススタディ kd9951 18/11/18
19/10/04302
13245 Laravelのルーティングチートシート fagai 15/12/25
19/10/22217
7246 CentOS6/CentOS7にPHP5.6/PHP7をyumでインストール ozawan 16/02/19
17/07/23506
5147 【Laravel】DB登録値取得時のfind()、get()、first()の返り値早見表 sola-msr 17/12/04
19/06/27160
12148 Laravel リポジトリパターンの実装 bmf_san 16/12/16
17/12/29199
7949 Laradockを使ったLaravel開発環境構築 J_Shell 18/03/10
19/06/23186
10950 Laravelでプロジェクトを作成したらまずやることメモ ponko2 15/10/09
17/11/23383
5951 Eloquentに惚れちゃう便利な機能 henriquebremenkanp 16/02/20
18/04/20237
6252 MySQL8.0 認証方式を変更する(Laravel5) ucan-lab 18/05/29
19/11/17179
12353 PHPのオートロード(autoload) atwata 16/04/18
19/07/31175
8254 PHPで出来てしまうが控えたほうががいい書き方 shinkuFencer 17/01/10
17/01/23217
7055 OFFSETを使わない高速なページネーションの実現 mpyw 15/12/22
18/03/12326
4956 [PHP] Xdebug のリモートデバッグ、理解していますか? castaneai 18/06/27
18/08/29197
11357 PHPができても他言語の学習には役に立たない理由を考えてみた。 raccy 17/05/08
18/12/11245
7458 Laravelでコマンドラインアプリケーションを作成する nenokido2000 17/01/25
17/01/30168
7759 PHPでJSONデータの取得の仕方 fantm21 15/07/29
16/08/15246
6460 もういい加減覚えよう。php.iniはどこにあるのか ritukiii 17/08/29
17/08/29140
9561 ECSのチュートリアル - コンテナ運用を現実のものにする niisan-tokyo 17/03/18
19/04/19181
7262 LaravelでRoute::resourceを使うときに気をつけること sympe 17/08/30
18/05/14156
7863 Laravelのバリデーションにはフォームリクエストを使おう sakuraya 16/11/07
18/02/09161
7064 VS CodeでPHPの開発をするのに導入した拡張機能 cflat0528 18/12/05
18/12/05157
12065 Laravelのルーティング書き方まとめ michiomochi@github 13/12/17
17/03/21429
4666 Laravel open source project で参考になりそうなもの acro5piano 17/01/16
18/10/09183
7767 Laravelでの基本的なリレーションシップもしくはJOIN zaburo 15/11/25
19/01/21178
5468 PHP初心者は最低限これはやっとけ - 開発に入る前編 rana_kualu 16/07/05
16/07/10708
4169 APIなどにfile_get_contents()を使うのはオススメしない理由と代替案 shinkuFencer 17/01/23
17/01/23234
5070 三項演算子をもっと使おう rana_kualu 15/10/16
17/11/12247
6171 依存性注入(DI)の解説とやり方 1000k 15/06/21
17/11/28285
4872 最低限書いておきたいPHPのDocコメント motoyan-qwt 14/09/26
14/10/01524
4973 [超簡単]LINE notify を使ってみる iitenkida7 16/10/02
19/08/22178
6474 Laravelでウェブアプリケーションをつくるときのベストプラクティスを探る nunulk 16/10/20
17/10/22251
4375 Laravelで気持ちよく開発をするための拡張機能のまとめ motuo 18/05/17
19/04/12133
9176 PHPによる簡単なログイン認証いろいろ mpyw 16/03/30
18/02/24394
4877 【実録】WordPressサイトをAWS+Laravel+Nuxtにフルリプレイスした話 mejileben 19/06/17
20/02/26395
39578 Dockerでいい感じにPHP(Laravel)のローカル開発環境を作る igayamaguchi 17/11/08
18/10/09192
5079 Macでローカルサーバを立ち上げる方法 shuntaro_tamura 15/09/11
15/10/05342
3980 PHPでログイン機能を実装するチュートリアル #1 ShibuyaKosuke 15/07/23
18/09/18215
5681 2つの座標間の距離を求める chiyoyo 16/11/07
19/04/22143
6282 [PHP] 配列・連想配列の初期化、結合、追加 shuntaro_tamura 15/09/12
15/09/12221
5283 今時のPHP HTTPクライアントのGuzzleを使ってみた yousan 17/02/01
19/09/24141
5984 PDOを使ったPHPでのデータベース基本操作 mitsuru793 15/12/14
15/12/14132
6085 Laravelで始める依存性の注入(DI) harunbu 18/11/30
19/09/04123
11086 Laravel5.4以上、MySQL5.7.7未満 でusersテーブルのマイグレーションを実行すると Syntax error が発生する beer_geek 17/02/10
19/01/09147
5587 laravel-adminで管理画面を速攻で構築する。 pikonori 16/12/01
16/12/01208
4888 Laravel artisanコマンドメモ zaburo 16/01/02
16/01/02150
5689 【Laravel サービスコンテナ 中級編】メソッドインジェクションがしたい! kd9951 18/10/09
19/05/22122
9790 Markdownで表の記載をするときにイラッとした経験のある人集まれ taruhachi 14/08/12
14/08/13246
3291 【PHP】連想配列、配列への追加 kazu56 14/05/28
16/04/13356
4092 Google OAuth 2.0 認証を使ったログインの実装 kite_999 17/02/06
17/02/06141
5793 Laravelのアセットに関するTips sakuraya 16/11/19
16/11/19120
5794 【Laravel】DBにデータを保存する方法。createとinsertの違いなど katsunory 18/01/30
18/04/04123
7495 CentOS7のPHPを5.6/7.0/7.1/7.2/7.3系にバージョンアップする heimaru1231 17/12/29
20/01/18119
7996 PHPの多次元連想配列のソート shy_azusa 15/08/10
19/03/29198
4397 FizzBuzzから始めるコードの再利用性を高めるトレーニング tadsan 16/10/30
16/10/30167
4998 [Laravel5.1]Fakerチートシート tosite0345 17/10/04
17/10/04115
7499 逆引き!Composer コマンド・ライン一覧(と基本概要) KEINOS 18/06/26
20/03/15121
90100 DockerでPHP7.0×Apacheの環境を構築する(更新: 2017/6/27) kurkuru 17/05/26
18/05/28175
44
1行目が総数。2行目が直近1年。 ↩
- 投稿日:2020-04-07T00:46:54+09:00
【PHP】【長期】Qiitaの今読んでおくべき記事100選【毎日自動更新】
ページ容量を増やさないために、不具合報告やコメントは、説明記事 に記載いただけると助かります。
順位 記事名
________________________________________ユーザ 投稿日付
更新日付LGTM1 1 Cookieとセッションをちゃんと理解する hththt 15/08/07
20/01/201827
5022 nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する kotarella1110 16/03/17
18/04/091452
3613 DI・DIコンテナ、ちゃんと理解出来てる・・? ritukiii 16/08/02
17/02/031368
3144 【Laravel 6 & PHP 7.4 対応】Vue + Vue Router + Vuex + Laravel チュートリアル(全16回)を書きました。 MasahiroHarada 19/01/13
20/01/191809
4105 分岐アンチパターン pakkun 15/12/10
19/02/01721
1916 【PHP超入門】Cookieとセッションについて 7968 16/08/21
19/09/25738
2937 【Laravel超入門】開発環境の構築(VirtualBox + Vagrant + Homestead + Composer) 7968 17/03/11
19/12/26646
3058 【PHP超入門】HTTP(GET・POST)について 7968 16/07/27
19/12/18665
2439 【PHP超入門】名前空間(namespace・use)について 7968 16/10/05
19/09/25562
27010 Laravelの開発環境をDockerを使って構築する ucan-lab 19/02/15
20/01/31626
47311 LaravelのORMで初心者から職人へ henriquebremenkanp 16/05/29
18/12/26587
21612 【PHP超入門】クラス~例外処理~PDOの基礎 7968 15/04/04
19/09/25831
18113 PHP isset, empty, is_null の違い早見表 shinichi-takii 16/06/22
16/06/22490
22014 Laravelのバリデーションで指定できる内容をざっくりまとめ直しました。 fagai 15/12/18
19/08/30457
18815 PHPオブジェクト指向入門(前半) mpyw 14/05/25
15/01/091463
14016 就活のためにWEBサービスを作ったら、転職できた以上の価値をもたらしてくれた話 kd9951 18/05/08
18/05/101235
10617 PHP開発でComposerを使わないなんてありえない!基礎編 niisan-tokyo 16/04/30
19/04/17585
16818 Laravelの標準Authentication(Auth)の動きを調べてみる zaburo 16/02/13
20/01/13424
16819 $_GET, $_POSTなどを受け取る際の処理 mpyw 13/07/15
18/03/171240
11820 2018年のパスワードハッシュ rana_kualu 18/02/07
20/01/14623
15421 Laravel入門 - 使い方チュートリアル - sano1202 18/11/01
20/03/07265
24122 LINE Messaging API でできることまとめ【送信編】 kakakaori830 17/12/09
18/12/22363
13423 PHPのリリース日とサポート期限 bezeklik 15/12/14
20/03/24315
11424 これで完璧!今さら振り返る CSRF 対策と同一オリジンポリシーの基礎 mpyw 19/08/30
19/09/01758
75825 初心者向け。覚えておきたい 「ガード節」という書き方。 kouyan 18/03/10
19/05/27204
16626 Laravelをこれから勉強しようと思っている人へ fagai 17/09/11
19/10/07342
13627 PHPで日付時刻処理を書くならCarbonを使うべき yudsuzuk 16/05/01
16/05/01336
12128 【初心者向け】20分でLaravel開発環境を爆速構築するDockerハンズオン ucan-lab 19/07/18
19/10/19441
44129 Laravelのファサードが全然わからなかったので自分なりに色々と調べた事 yousan 17/03/20
17/03/21261
11630 Laravel キャッシュクリア系コマンドなど Ping 17/06/08
18/03/22251
11231 [laravel] controllerからviewへの変数の受け渡しとその展開方法 ryo2132 16/08/12
19/12/19197
10932 Laravelでテストコードを書くためのチュートリアル niisan-tokyo 16/08/06
16/08/06266
9433 Eloquent をおさらい shosho 17/05/31
19/01/22178
13134 新人プログラマですがjQueryのajaxがわからなすぎて勉強したまとめ okumurakengo 16/10/22
18/12/24291
9535 Laravel5のアーキテクチャから学ぶより良いクラス設計 nunulk 16/08/04
17/04/05355
8036 PHP(Laravel)入門者のための要点まとめ yyokii 18/06/11
19/01/20197
15737 Laravelのディレクトリ構造について学ぶ shosho 17/04/26
17/04/26224
9238 【企業サイト構築用】WordPress設計ガイドライン kgsi 16/12/13
19/03/19442
6639 PHPを少しでも速く動かしたい kapitan 17/07/13
17/07/13228
9540 Docker環境でLaravelを構築するまで、わずか15分。 hosono 18/03/14
19/06/01228
12041 Laravelで実践クリーンアーキテクチャ nrslib 19/03/14
19/03/26515
14742 第1回 もう怖くない DIだって知らなくていい こんなにカンタンだから今日から Laravelのサービスコンテナ を使ってみて! kd9951 18/06/06
19/10/18179
14643 エラー画面やAPIエラーから独自エラーまで! フローチャートでちゃんと理解するLaravelの例外処理とケーススタディ kd9951 18/11/18
19/10/04302
13144 3分でわかるデザインパターン入門(GoF) rch1223 17/02/20
17/02/21179
11645 Laravelのルーティングチートシート fagai 15/12/25
19/10/22217
7246 CentOS6/CentOS7にPHP5.6/PHP7をyumでインストール ozawan 16/02/19
17/07/23506
5147 【Laravel】DB登録値取得時のfind()、get()、first()の返り値早見表 sola-msr 17/12/04
19/06/27160
12048 Laravel リポジトリパターンの実装 bmf_san 16/12/16
17/12/29199
7949 Laradockを使ったLaravel開発環境構築 J_Shell 18/03/10
19/06/23186
10950 Laravelでプロジェクトを作成したらまずやることメモ ponko2 15/10/09
17/11/23383
5951 Eloquentに惚れちゃう便利な機能 henriquebremenkanp 16/02/20
18/04/20237
6252 MySQL8.0 認証方式を変更する(Laravel5) ucan-lab 18/05/29
19/11/17179
12253 PHPのオートロード(autoload) atwata 16/04/18
19/07/31175
8154 PHPで出来てしまうが控えたほうががいい書き方 shinkuFencer 17/01/10
17/01/23217
6955 [PHP] Xdebug のリモートデバッグ、理解していますか? castaneai 18/06/27
18/08/29197
11156 PHPができても他言語の学習には役に立たない理由を考えてみた。 raccy 17/05/08
18/12/11245
7457 Laravelでコマンドラインアプリケーションを作成する nenokido2000 17/01/25
17/01/30168
7758 PHPでJSONデータの取得の仕方 fantm21 15/07/29
16/08/15246
6459 もういい加減覚えよう。php.iniはどこにあるのか ritukiii 17/08/29
17/08/29140
9560 ECSのチュートリアル - コンテナ運用を現実のものにする niisan-tokyo 17/03/18
19/04/19181
7161 LaravelでRoute::resourceを使うときに気をつけること sympe 17/08/30
18/05/14156
7862 VS CodeでPHPの開発をするのに導入した拡張機能 cflat0528 18/12/05
18/12/05157
11963 Laravelのバリデーションにはフォームリクエストを使おう sakuraya 16/11/07
18/02/09161
6964 Laravelでの基本的なリレーションシップもしくはJOIN zaburo 15/11/25
19/01/21178
5465 Laravelのルーティング書き方まとめ michiomochi@github 13/12/17
17/03/21429
4466 PHP初心者は最低限これはやっとけ - 開発に入る前編 rana_kualu 16/07/05
16/07/10708
4167 Laravel open source project で参考になりそうなもの acro5piano 17/01/16
18/10/09183
7668 三項演算子をもっと使おう rana_kualu 15/10/16
17/11/12247
6169 APIなどにfile_get_contents()を使うのはオススメしない理由と代替案 shinkuFencer 17/01/23
17/01/23234
4970 依存性注入(DI)の解説とやり方 1000k 15/06/21
17/11/28285
4771 最低限書いておきたいPHPのDocコメント motoyan-qwt 14/09/26
14/10/01524
4972 [超簡単]LINE notify を使ってみる iitenkida7 16/10/02
19/08/22178
6373 Laravelでウェブアプリケーションをつくるときのベストプラクティスを探る nunulk 16/10/20
17/10/22251
4374 【実録】WordPressサイトをAWS+Laravel+Nuxtにフルリプレイスした話 mejileben 19/06/17
20/02/26398
39875 Laravelで気持ちよく開発をするための拡張機能のまとめ motuo 18/05/17
19/04/12133
9176 PHPによる簡単なログイン認証いろいろ mpyw 16/03/30
18/02/24394
4777 PHPでログイン機能を実装するチュートリアル #1 ShibuyaKosuke 15/07/23
18/09/18215
5678 Dockerでいい感じにPHP(Laravel)のローカル開発環境を作る igayamaguchi 17/11/08
18/10/09192
5079 Macでローカルサーバを立ち上げる方法 shuntaro_tamura 15/09/11
15/10/05342
3980 [PHP] 配列・連想配列の初期化、結合、追加 shuntaro_tamura 15/09/12
15/09/12221
5281 2つの座標間の距離を求める chiyoyo 16/11/07
19/04/22143
6182 PDOを使ったPHPでのデータベース基本操作 mitsuru793 15/12/14
15/12/14132
6083 今時のPHP HTTPクライアントのGuzzleを使ってみた yousan 17/02/01
19/09/24141
5984 Laravelで始める依存性の注入(DI) harunbu 18/11/30
19/09/04123
11085 Laravel5.4以上、MySQL5.7.7未満 でusersテーブルのマイグレーションを実行すると Syntax error が発生する beer_geek 17/02/10
19/01/09147
5486 laravel-adminで管理画面を速攻で構築する。 pikonori 16/12/01
16/12/01208
4887 Laravel artisanコマンドメモ zaburo 16/01/02
16/01/02150
5688 【Laravel サービスコンテナ 中級編】メソッドインジェクションがしたい! kd9951 18/10/09
19/05/22122
9789 Markdownで表の記載をするときにイラッとした経験のある人集まれ taruhachi 14/08/12
14/08/13246
3190 【PHP】連想配列、配列への追加 kazu56 14/05/28
16/04/13356
3991 Google OAuth 2.0 認証を使ったログインの実装 kite_999 17/02/06
17/02/06141
5792 Laravelのアセットに関するTips sakuraya 16/11/19
16/11/19120
5793 【Laravel】DBにデータを保存する方法。createとinsertの違いなど katsunory 18/01/30
18/04/04123
7494 CentOS7のPHPを5.6/7.0/7.1/7.2/7.3系にバージョンアップする heimaru1231 17/12/29
20/01/18119
7995 FizzBuzzから始めるコードの再利用性を高めるトレーニング tadsan 16/10/30
16/10/30167
4996 [Laravel5.1]Fakerチートシート tosite0345 17/10/04
17/10/04115
7497 PHPの多次元連想配列のソート shy_azusa 15/08/10
19/03/29198
4398 逆引き!Composer コマンド・ライン一覧(と基本概要) KEINOS 18/06/26
20/03/15121
8899 DockerでPHP7.0×Apacheの環境を構築する(更新: 2017/6/27) kurkuru 17/05/26
18/05/28175
44100 [LINE Bot] 位置情報から食べログ3.5以上の優良店を検索するbot作った NARI_Creator 18/07/25
19/07/24395
35
1行目が総数。2行目が直近1年。 ↩
- 投稿日:2020-04-07T00:34:38+09:00
Virtualbox+Vagrant+HomesteadでLaravelの開発環境を構築した際に躓いたことを4つまとめ
どうも、直人です。
本日は、
Virtualbox+VagrantでLaravelの開発環境を構築した際に躓いたこと
というテーマで4つピックアップしてお伝えしていければなと思っております。執筆背景
はじめに、執筆背景です。
私は、現在laravelフレームワークについて学習してます。
開発環境は、Homesteadを利用して構築しており、laravelのバージョンは6.xを使用しております。この記事では、そんなlaravel初心者の私が
Homesteadを利用してlaravelの開発環境を構築する際に躓いたところ
をまとめてみました。なお、本記事は、躓いた点に焦点を当てた記事となっており、
環境の構築方法については本記事では触れないため、
構築方法について知りたい方は他の記事を参照してください。躓いたこと4選
以下から、躓いたところとその解決方法を示していきます。
VirtualBoxのインストールでインストールできませんでしたと表示される
VurtualBoxのインストーラーを公式サイト(https://www.virtualbox.org/wiki/Downloads)
からダウンロードしたのち、インストールを試みたところ、
インストールできませんでした
と表示される事案が発生した。この原因は、
macのセキュリティとプライバシーメニューの設定でVirtualBoxのインストールがブロックされたため
である。これは、以下の手順で対処することができます。
・ macのシステム環境設定からセキュリティとプライバシーのページを開く
・ 一般のタブを開くと"VirtualBox.pkg"は回発元を確認できないため、開けませんでしたと書かれているため、このまま開くボタンを押す
・ VirtualBoxのdmgファイルを開き、VirtualBoxをアンインストールする
・ VirtualBoxを再度インストールする
Vagrant upコマンドでThe path to your private key does not existと表示される
Vagrantを起動させようと、ターミナル上で
$ vagrant upコマンドを打つと、
Check your Homestead.yaml (or Homestead.json) file, the path to your private key does not exist.と表示されてしまい、Vagrantを起動することができなかった。
これは、
ssh認証鍵を作成していないことが原因で起こるエラーです。なので、ssh認証鍵を作成する必要があります。
手順としては、まずターミナルで以下のコマンドを打ち込みます。
$ cd ~/.ssh/ $ ssh-keygen -t rsa -f 任意のfile名上記のコマンドは、
まず~/.ssh/ディレクトリに移動したのち、その中に任意のファイル名をつけたssh認証キーを生成する
という内容です。上記のコマンドを打つと、
Enter file in which to save the key
と聞かれるのでそのままEnterキーを押します。すると、
Enter passphrase
と聞かれるので設定したいパスワードを入力します。ssh認証鍵を作成し終えたら、以下のコマンドで、Homesteadディレクトリに移動し、Homestead.yamlファイルを開きます。
$ cd Homestead $ vim Homestead.yamlHomestead.yamlファイルの以下の部分を先ほど作成したssh認証鍵がある場所(authorizeは公開鍵、keysは秘密鍵の場所)に指定します。
Homestead.yamlauthorize: ~/.ssh/任意のfile名.pub keys: - ~/.ssh/任意のfile名再度、以下のコマンドでvagrantを起動させると無事起動します。
$ vagrant uplaravel new app_nameコマンドが失敗する
ターミナル上で、
laravel new app_nameコマンドを打って、app_nameという名前のプロジェクトディレクトリーを作成しようと試みるも失敗した。
この理由は、
Homestead.yamlで指定された場所にディレクトリが作成されておらず、ホスト側とゲスト側で同期できなかったため
である。Homestead.yamlfolders: - map: ~/project/laravel/ to: /home/vagrant/laravel/そのため、laravelディレクトリをHomestead.yamlで指定された場所(この場合、ローカル環境では/projectの下、仮想環境では/home/vagrantの下)に作成して、以下のコマンドで設定を反映させた。
$ vagrant reload --provisionその後、vagrant上で以下のコマンドを打ち、laravelディレクトリに移動し、
$ cd laravel以下のコマンドを実行すると、appプロジェクトフォルダを作成することができた。
$ laravel new app_nameLaravelの初期画面がブラウザで表示されない
Homestead.yamlの設定を終え、laravelのトップ画面にアクセスしようと、
homestead.laravel
をブラウザのurlに打ち込むと、アクセスすることができなかった。この原因は、
Webサーバーに参照させるパスを、Projectディレクトリの配下にあるpublicディレクトリに指定していなかったため
であった。
webサーバーに参照させるパスは、以下の部分で指定することができます。
以下の変更前の設定では、
homestead.laravel
がクライアントから送信されたときにwebサーバーは
/home/vagrant/laravel/app_name
を参照するように設定していました。Homestead.yamlsites: - map: homestead.laravel to: /home/vagrant/laravel/app_name/public php: "7.4"これを、
homestead.laravel
がクライアントから送信されたときにwebサーバーは
/home/vagrant/laravel/app_name/public
を参照するように変更しました。Homestead.yamlsites: - map: homestead.laravel to: /home/vagrant/laravel/app_name/public php: "7.4"ちなみに、上記の設定でもlaravelの画面が表示されない場合は、以下の手順で解決する場合がありますのでヒントになればなと思います。
まず、ローカル環境で、/etcディレクトリに移動し、hostsファイルを開きます。
$ cd /etc $ vim hostshostsファイルを開くと、以下のような画面がでてきます。Homestead.yamlファイルに書いてあったhomesteadのipアドレスとそのときのドメインを以下の例のように追記してみてください。
## # Host Database # # localhost is used to configure the loopback interface # when the system is booting. Do not change this entry. ## 127.0.0.1 localhost …(略) 192.168.10.10 homestead.laravel(例)Homestead.yamlip: "192.168.10.10" ←ipアドレス …(中略) sites: - map: homestead.laravel ←ドメインまとめ
環境構築は、躓くポイントが沢山あるため、自分も含めプログラミング初心者の方はプログラミングに入る前に挫折してしまいがちです。
また、ベテランエンジニアの方でもいざ環境構築を久しぶりにしてみると
「あれ?」
と思うようなポイントが散りばめられていると考えています。なので、環境構築をする際には、自分がやっている設定や設定過程で発生したエラーが何を意味しているのかをしっかりと理解する必要があると考えています。
最後になりますが、この記事が、Virtualbox+Vagrant+Homesteadでlaravelの開発環境を構築しようと試みている人に少しでも役に立てばと思ってます。