20200407のPHPに関する記事は17件です。

Laravel でファサードを禁止されたときにすること

はじめに

Laravel はアーキテクチャの自由度が高い点でユニークなフレームワークに思う。

しかしチームで開発する上では、実装者によって書き方やアーキテクチャが変わりやすい点もある。

加えて MVC アーキテクチャだけではモデルやコントローラが太りやすい。

そんななか弊社で「DIに基づいた設計を行う」「ファーサードの使用は違法」とする「設計勧告案」が登場した。

でもあまり順守されていないように思うので、私の理解を書く。

なぜ DI か

ファサードは簡単に使える。

自分で取り込んだり、設定したりする必要があり、長くて覚えにくいクラス名を使わずに、Laravelの機能を簡素で覚えやすい文法で使ってもらえます。その上に、PHPの動的メソッドのユニークな使用方法のおかげで、簡単にテストができます。
https://readouble.com/laravel/6.x/ja/facades.html#when-to-use-facades

DI なら同じテスタビリティで、
クラスの依存関係を明示して、「大きなコンストラクタの視覚的なフィードバック」を得られる。

ファサードの一番の危険性は、クラスの責任範囲の暴走です。ファサードはとても簡単に使用でき依存注入も必要ないため、簡単にクラスが成長し続ける結果、一つのクラスで多くのファサードが使われます。依存注入を使用すればクラスが大きくなりすぎることに伴う、大きなコンストラクタの視覚的なフィードバックにより、この危険性は抑制されます。
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 を使うことでクラスの依存関係を明示し、適度な責任範囲を保てる。

統一的に使われれば、ビジネスロジックを集約でき、よりメンテナンスしやすくなると思われる。

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

サーバーレスライブラリ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.yml
 provider:
   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にアクセスしてみると、
スクリーンショット 2020-04-06 13.55.43.png
ちゃんとHTMLが描写されていますね。jsonを返したい場合はこうです。66df3a

 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>',
-    ];
+   return [
+       'headers' => [
+           'Content-Type' => "application/json",
+       ],
+       'statusCode' => 200,
+       'body' => json_encode(['json_key' => 'json_value']),
+   ];
 });

参考

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

ブラウザでnfcpyを使ってNFCタグのIDmを表示してみる

はじめに

PaSoRiでNFCタグを読み取ってブラウザに表示するというのは他の方もやっていらっしゃるのですが(WebUSBでFeliCaの一意なIDであるIDmを読む)、ただ自分の環境ではエラーが起きて使えなかったので、勉強も兼ねて別の方法で試してみることにしました。
※今回のこのNFCタグの読み取りはUbuntu環境で行いました。

準備

nfcpyまでの準備はこちらの記事を参考にしました(Python で PaSoRiのセットアップ と FeliCaの読み取り)
pythonのNFCタグ読み取り用の簡潔なコードも準備します

nfc.py
import 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

を書き加えます。

これで完成です。

Screenshot from 2020-04-07 16-18-00.png
ボタンを押してカードをPaSoRiにかざすと…
Screenshot from 2020-04-07 16-18-15.png
読み取れた!!

たぶんこれはいいやり方ではないと思うのですが、今現在の自分の力量これが限界です…
詳しい方がもっとうまいやり方を見つけてくれるはず…!

おわりに

なんでこんなにまどろっこしいことをしたかというと、PHPを勉強中だったからなんとしてもPHPを使いたかったからという…
まあ、これを使ってまた何か作れればいいかなと思っています。

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

ブラウザにnfcpyを使ってNFCタグのIDmを表示してみる

はじめに

PaSoRiでNFCタグを読み取ってブラウザに表示するというのは他の方もやっていらっしゃるのですが(WebUSBでFeliCaの一意なIDであるIDmを読む)、ただ自分の環境ではエラーが起きて使えなかったので、勉強も兼ねて別の方法で試してみることにしました。
※今回のこのNFCタグの読み取りはUbuntu環境で行いました。

準備

nfcpyまでの準備はこちらの記事を参考にしました(Python で PaSoRiのセットアップ と FeliCaの読み取り)
pythonのNFCタグ読み取り用の簡潔なコードも準備します

nfc.py
import 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

を書き加えます。

これで完成です。

Screenshot from 2020-04-07 16-18-00.png
ボタンを押してカードをPaSoRiにかざすと…
Screenshot from 2020-04-07 16-18-15.png
読み取れた!!

たぶんこれはいいやり方ではないと思うのですが、今現在の自分の力量これが限界です…
詳しい方がもっとうまいやり方を見つけてくれるはず…!

おわりに

なんでこんなにまどろっこしいことをしたかというと、PHPを勉強中だったからなんとしてもPHPを使いたかったからという…
まあ、これを使ってまた何か作れればいいかなと思っています。

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

Mac Laravel 環境構築初期やgit clone直後でローカルサーバを起動した時に500エラーが出た話

目的

  • Laravelアプリの環境構築初期やgit clone直後にローカルサーバを起動すると500 Server Errorのエラーが出力される問題を解決した話をまとめる

問題のエラー

  • Laravelアプリのディレクトリ内で$ php artisan serveを実行し、ブラウザからhttp://127.0.0.1:8000/にアクセスしたところ下記の画面が表示された。

    スクリーンショット 2020-03-18 13.54.41.png

原因

  • 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  
    

解決法

  1. 下記コマンドを実行して「.env.example」ファイルを元に「.env」ファイルを作成する。

    $ cd laravelアプリルートフォルダ
    $ cp .env.example .env
    
  2. 下記コマンドを実行してローカルサーバを起動する。

    $ php artisan serve
    
  3. http://127.0.0.1:8000/にアクセスしたところ下記の画面が表示された。

    スクリーンショット 2020-03-18 14.15.37.png

  4. アプリケーションキーがないので作ってくれと怒られたので、一旦ローカルサーバを止めて、ブラウザに記載されているコマンドを実行する。

    $ cd laravelアプリルートフォルダ
    $ php artisan key:generate
    >Application key set successfully.
    
  5. 下記コマンドを実行してローカルサーバを起動する。

    $ php artisan serve
    
  6. 自分が作成中のLaravelアプリのホーム画面がブラウザから確認することができた。

    スクリーンショット 2020-03-18 14.22.50.png

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

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 の日付フィールドを適切に扱えるようになります。

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

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);
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.php
public function authenticate()
    {
        $email = 'guest@guest.com';
        $password = 'guestpass';

        if (\Auth::attempt(['email' => $email, 'password' => $password])) {
            // 認証に成功した
            return redirect('/');
        }
        return back();
    }

ルーティングもこれに合わせて調整。

web.php
Route::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.php
public 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 認証
ありがとうございました。

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

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に入っているのは「連想配列」。

オブジェクトは……説明しようとするとオブジェクト指向の話に入り込んで難解になってしまうので、さわりだけ。
オブジェクトが連想配列と似ているものだが、これを表示しようとした場合、変数->キーのように、矢印でつなぐ必要がある。

さいごに

分からないこと等あったら編集リクエストおねがいします

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

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に入っているのは「連想配列」。

オブジェクトは……説明しようとするとオブジェクト指向の話に入り込んで難解になってしまうので、さわりだけ。
オブジェクトが連想配列と似ているものだが、これを表示しようとした場合、変数->キーのように、矢印でつなぐ必要がある。

さいごに

分からないこと等あったら編集リクエストおねがいします

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

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で続きを読む

超簡易ルーターを作成しました。

前置き

これ、本当に自分の良くない所だと思うのですが、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をちゃんと勉強しろっていう話ですが)このプログラムでダメな部分などありましたら、コメントしていただけると幸いです。

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

【PHP】【短期】Qiitaの読んでおかなければいけない記事100選【毎日自動更新】

ページ容量を増やさないために、不具合報告やコメントは、説明記事 に記載いただけると助かります。

順位 記事名
________________________________________
ユーザ 投稿日付
更新日付
LGTM1
1 Cookieとセッションをちゃんと理解する hththt 15/08/07
20/01/20
1827
120
2 【Laravel 6 & PHP 7.4 対応】Vue + Vue Router + Vuex + Laravel チュートリアル(全16回)を書きました。 MasahiroHarada 19/01/13
20/01/19
1809
86
3 Laravelの開発環境をDockerを使って構築する ucan-lab 19/02/15
20/01/31
626
136
4 nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する kotarella1110 16/03/17
18/04/09
1452
75
5 DI・DIコンテナ、ちゃんと理解出来てる・・? ritukiii 16/08/02
17/02/03
1368
54
6 【Laravel超入門】開発環境の構築(VirtualBox + Vagrant + Homestead + Composer) 7968 17/03/11
19/12/26
646
66
7 【PHP超入門】Cookieとセッションについて 7968 16/08/21
19/09/25
738
49
8 分岐アンチパターン pakkun 15/12/10
19/02/01
721
53
9 【PHP超入門】HTTP(GET・POST)について 7968 16/07/27
19/12/18
665
58
10 【PHP超入門】名前空間(namespace・use)について 7968 16/10/05
19/09/25
562
51
11 LaravelのORMで初心者から職人へ henriquebremenkanp 16/05/29
18/12/26
587
63
12 PHP isset, empty, is_null の違い早見表 shinichi-takii 16/06/22
16/06/22
490
53
13 Laravel入門 - 使い方チュートリアル - sano1202 18/11/01
20/03/07
265
86
14 初心者向け。覚えておきたい 「ガード節」という書き方。 kouyan 18/03/10
19/05/27
204
123
15 就活のためにWEBサービスを作ったら、転職できた以上の価値をもたらしてくれた話 kd9951 18/05/08
18/05/10
1235
27
16 これで完璧!今さら振り返る CSRF 対策と同一オリジンポリシーの基礎 mpyw 19/08/30
19/09/01
758
43
17 Laravelのバリデーションで指定できる内容をざっくりまとめ直しました。 fagai 15/12/18
19/08/30
457
53
18 【初心者向け】20分でLaravel開発環境を爆速構築するDockerハンズオン ucan-lab 19/07/18
19/10/19
441
59
19 Laravelの標準Authentication(Auth)の動きを調べてみる zaburo 16/02/13
20/01/13
424
40
20 2018年のパスワードハッシュ rana_kualu 18/02/07
20/01/14
623
28
21 【PHP超入門】クラス~例外処理~PDOの基礎 7968 15/04/04
19/09/25
831
0
22 PHP開発でComposerを使わないなんてありえない!基礎編 niisan-tokyo 16/04/30
19/04/17
585
23
23 LINE Messaging API でできることまとめ【送信編】 kakakaori830 17/12/09
18/12/22
363
26
24 Laravelをこれから勉強しようと思っている人へ fagai 17/09/11
19/10/07
342
25
25 「あれ、チュートリアルから始まった」。僕とキャッシュとサイレントリリース。 Canon11 19/12/21
19/12/23
313
6
26 PHPのリリース日とサポート期限 bezeklik 15/12/14
20/03/24
315
29
27 Laravel キャッシュクリア系コマンドなど Ping 17/06/08
18/03/22
251
32
28 PHPオブジェクト指向入門(前半) mpyw 14/05/25
15/01/09
1463
0
29 Laravelのファサードが全然わからなかったので自分なりに色々と調べた事 yousan 17/03/20
17/03/21
261
32
30 エラー画面やAPIエラーから独自エラーまで! フローチャートでちゃんと理解するLaravelの例外処理とケーススタディ kd9951 18/11/18
19/10/04
302
30
31 PHP(Laravel)入門者のための要点まとめ yyokii 18/06/11
19/01/20
197
27
32 第1回 もう怖くない DIだって知らなくていい こんなにカンタンだから今日から Laravelのサービスコンテナ を使ってみて! kd9951 18/06/06
19/10/18
179
31
33 PHPで日付時刻処理を書くならCarbonを使うべき yudsuzuk 16/05/01
16/05/01
336
21
34 Laravelで実践クリーンアーキテクチャ nrslib 19/03/14
19/03/26
515
26
35 [laravel] controllerからviewへの変数の受け渡しとその展開方法 ryo2132 16/08/12
19/12/19
197
35
36 PHPを少しでも速く動かしたい kapitan 17/07/13
17/07/13
228
38
37 Eloquent をおさらい shosho 17/05/31
19/01/22
178
24
38 VS CodeでPHPの開発をするのに導入した拡張機能 cflat0528 18/12/05
18/12/05
157
37
39 【Laravel】DB登録値取得時のfind()、get()、first()の返り値早見表 sola-msr 17/12/04
19/06/27
160
26
40 MySQL8.0 認証方式を変更する(Laravel5) ucan-lab 18/05/29
19/11/17
179
18
41 Laravelのディレクトリ構造について学ぶ shosho 17/04/26
17/04/26
224
26
42 Docker環境でLaravelを構築するまで、わずか15分。 hosono 18/03/14
19/06/01
228
14
43 更新! Laravel6/7「make:Auth」が無くなった 〜Laravel6/7でのLogin機能の実装方法〜MyMemo daisu_yamazaki 19/09/06
20/03/31
154
44
44 $_GET, $_POSTなどを受け取る際の処理 mpyw 13/07/15
18/03/17
1240
0
45 Laradockを使ったLaravel開発環境構築 J_Shell 18/03/10
19/06/23
186
21
46 Laravelでテストコードを書くためのチュートリアル niisan-tokyo 16/08/06
16/08/06
266
22
47 Laravel6 ログイン機能を実装する ucan-lab 19/09/13
20/02/17
115
54
48 商用環境でも使っている Laravel 用 php-fpm イメージの Dockerfile レシピ mpyw 20/03/14
20/03/27
182
182
49 [PHP] Xdebug のリモートデバッグ、理解していますか? castaneai 18/06/27
18/08/29
197
20
50 【PHP7.4】PHP7.4がリリースされたので新機能全部やる rana_kualu 19/12/01
19/12/21
299
23
51 3分でわかるデザインパターン入門(GoF) rch1223 17/02/20
17/02/21
179
19
52 もういい加減覚えよう。php.iniはどこにあるのか ritukiii 17/08/29
17/08/29
140
27
53 【企業サイト構築用】WordPress設計ガイドライン kgsi 16/12/13
19/03/19
442
24
54 新人プログラマですがjQueryのajaxがわからなすぎて勉強したまとめ okumurakengo 16/10/22
18/12/24
291
15
55 Laravelで気持ちよく開発をするための拡張機能のまとめ motuo 18/05/17
19/04/12
133
33
56 Laravelで始める依存性の注入(DI) harunbu 18/11/30
19/09/04
123
27
57 【Laravel サービスコンテナ 中級編】メソッドインジェクションがしたい! kd9951 18/10/09
19/05/22
122
30
58 【実録】WordPressサイトをAWS+Laravel+Nuxtにフルリプレイスした話 mejileben 19/06/17
20/02/26
395
14
59 Laravel5のアーキテクチャから学ぶより良いクラス設計 nunulk 16/08/04
17/04/05
355
14
60 Laravelのルーティングチートシート fagai 15/12/25
19/10/22
217
22
61 Laravel リポジトリパターンの実装 bmf_san 16/12/16
17/12/29
199
21
62 Laravelでコマンドラインアプリケーションを作成する nenokido2000 17/01/25
17/01/30
168
25
63 LaravelでRoute::resourceを使うときに気をつけること sympe 17/08/30
18/05/14
156
17
64 PHPで出来てしまうが控えたほうががいい書き方 shinkuFencer 17/01/10
17/01/23
217
16
65 逆引き!Composer コマンド・ライン一覧(と基本概要) KEINOS 18/06/26
20/03/15
121
23
66 PHPのオートロード(autoload) atwata 16/04/18
19/07/31
175
14
67 PHPができても他言語の学習には役に立たない理由を考えてみた。 raccy 17/05/08
18/12/11
245
12
68 フロー図で理解するLaravelバリデータの仕組みと、チーム開発でのケーススタディ kd9951 18/12/22
18/12/25
106
26
69 ECSのチュートリアル - コンテナ運用を現実のものにする niisan-tokyo 17/03/18
19/04/19
181
14
70 Laravel で Fat Controller を防ぐ 5 つの Tips nunulk 20/02/15
20/02/24
174
174
71 Laravelのバリデーションにはフォームリクエストを使おう sakuraya 16/11/07
18/02/09
161
19
72 Eloquentに惚れちゃう便利な機能 henriquebremenkanp 16/02/20
18/04/20
237
14
73 【Laravel】DBにデータを保存する方法。createとinsertの違いなど katsunory 18/01/30
18/04/04
123
22
74 CentOS7のPHPを5.6/7.0/7.1/7.2/7.3系にバージョンアップする heimaru1231 17/12/29
20/01/18
119
20
75 [Laravel5.1]Fakerチートシート tosite0345 17/10/04
17/10/04
115
17
76 CentOS6/CentOS7にPHP5.6/PHP7をyumでインストール ozawan 16/02/19
17/07/23
506
8
77 P++: 銀河に平和をもたらすための奇策と決着 tadsan 19/08/14
19/08/14
533
3
78 PHPでJSONデータの取得の仕方 fantm21 15/07/29
16/08/15
246
14
79 【PHP8】PHPでJITが使えるようになる rana_kualu 19/03/27
20/01/14
381
20
80 Laravelでプロジェクトを作成したらまずやることメモ ponko2 15/10/09
17/11/23
383
9
81 Laravel5.6入門 基本CRUD操作を体で覚える sayama0402 18/02/16
19/05/26
108
21
82 in_arrayを使うときは黙って第三引数を付けること ritukiii 17/09/07
17/09/07
109
23
83 今時のPHP HTTPクライアントのGuzzleを使ってみた yousan 17/02/01
19/09/24
141
15
84 Laravel Passportの使い方まとめ zaburo 18/10/06
19/02/08
114
16
85 APIなどにfile_get_contents()を使うのはオススメしない理由と代替案 shinkuFencer 17/01/23
17/01/23
234
11
86 [LINE Bot] 位置情報から食べログ3.5以上の優良店を検索するbot作った NARI_Creator 18/07/25
19/07/24
395
7
87 Laravel open source project で参考になりそうなもの acro5piano 17/01/16
18/10/09
183
8
88 2つの座標間の距離を求める chiyoyo 16/11/07
19/04/22
143
19
89 [超簡単]LINE notify を使ってみる iitenkida7 16/10/02
19/08/22
178
11
90 【PHP7.4】ついにPHPにプロパティ型指定がやってくる rana_kualu 18/09/13
19/06/11
361
9
91 Laravel で Service 層を取り入れるときに検討したいこと nunulk 19/05/26
19/05/26
175
20
92 Docker に Composer をインストールするベストプラクティス(と解説) yatsubashi 19/09/29
19/09/29
59
45
93 僕がLaravelのEloquentに$fillableでなく$guardedを指定する理由 toro_ponz 18/07/22
18/07/22
109
16
94 Laravelでウェブアプリケーションをつくるときのベストプラクティスを探る nunulk 16/10/20
17/10/22
251
17
95 脱PHP初心者!インターフェイスを理解しよう KNJ 19/08/11
19/08/13
234
10
96 LaravelでCRUDのAPIをささっと作る sayama0402 18/02/19
18/10/09
101
19
97 第3回 なんでもツッコんで気軽に取り出すLaravelサービスコンテナの核心「結合」 kd9951 19/03/20
19/09/15
91
21
98 Laravel+Nuxt.jsでDocker開発環境構築からHerokuデプロイまで kon_shou 19/07/09
19/07/09
208
19
99 OFFSETを使わない高速なページネーションの実現 mpyw 15/12/22
18/03/12
326
9
100 Laravel5.4以上、MySQL5.7.7未満 でusersテーブルのマイグレーションを実行すると Syntax error が発生する beer_geek 17/02/10
19/01/09
147
16

  1. 1行目が総数。2行目が直近3ヵ月。 

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

【PHP】【短期】Qiitaの今読んでおくべき記事100選【毎日自動更新】

ページ容量を増やさないために、不具合報告やコメントは、説明記事 に記載いただけると助かります。

順位 記事名
________________________________________
ユーザ 投稿日付
更新日付
LGTM1
1 Cookieとセッションをちゃんと理解する hththt 15/08/07
20/01/20
1827
117
2 【Laravel 6 & PHP 7.4 対応】Vue + Vue Router + Vuex + Laravel チュートリアル(全16回)を書きました。 MasahiroHarada 19/01/13
20/01/19
1809
85
3 Laravelの開発環境をDockerを使って構築する ucan-lab 19/02/15
20/01/31
626
134
4 nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する kotarella1110 16/03/17
18/04/09
1452
74
5 DI・DIコンテナ、ちゃんと理解出来てる・・? ritukiii 16/08/02
17/02/03
1368
52
6 【Laravel超入門】開発環境の構築(VirtualBox + Vagrant + Homestead + Composer) 7968 17/03/11
19/12/26
646
64
7 【PHP超入門】Cookieとセッションについて 7968 16/08/21
19/09/25
738
48
8 分岐アンチパターン pakkun 15/12/10
19/02/01
721
51
9 【PHP超入門】HTTP(GET・POST)について 7968 16/07/27
19/12/18
665
57
10 【PHP超入門】名前空間(namespace・use)について 7968 16/10/05
19/09/25
562
48
11 LaravelのORMで初心者から職人へ henriquebremenkanp 16/05/29
18/12/26
587
60
12 PHP isset, empty, is_null の違い早見表 shinichi-takii 16/06/22
16/06/22
490
52
13 Laravel入門 - 使い方チュートリアル - sano1202 18/11/01
20/03/07
265
85
14 初心者向け。覚えておきたい 「ガード節」という書き方。 kouyan 18/03/10
19/05/27
204
123
15 就活のためにWEBサービスを作ったら、転職できた以上の価値をもたらしてくれた話 kd9951 18/05/08
18/05/10
1235
26
16 これで完璧!今さら振り返る CSRF 対策と同一オリジンポリシーの基礎 mpyw 19/08/30
19/09/01
758
43
17 Laravelのバリデーションで指定できる内容をざっくりまとめ直しました。 fagai 15/12/18
19/08/30
457
52
18 【初心者向け】20分でLaravel開発環境を爆速構築するDockerハンズオン ucan-lab 19/07/18
19/10/19
441
57
19 Laravelの標準Authentication(Auth)の動きを調べてみる zaburo 16/02/13
20/01/13
424
39
20 2018年のパスワードハッシュ rana_kualu 18/02/07
20/01/14
623
27
21 【PHP超入門】クラス~例外処理~PDOの基礎 7968 15/04/04
19/09/25
831
0
22 PHP開発でComposerを使わないなんてありえない!基礎編 niisan-tokyo 16/04/30
19/04/17
585
22
23 LINE Messaging API でできることまとめ【送信編】 kakakaori830 17/12/09
18/12/22
363
26
24 Laravelをこれから勉強しようと思っている人へ fagai 17/09/11
19/10/07
342
25
25 「あれ、チュートリアルから始まった」。僕とキャッシュとサイレントリリース。 Canon11 19/12/21
19/12/23
314
6
26 PHPのリリース日とサポート期限 bezeklik 15/12/14
20/03/24
315
29
27 PHPオブジェクト指向入門(前半) mpyw 14/05/25
15/01/09
1463
0
28 Laravel キャッシュクリア系コマンドなど Ping 17/06/08
18/03/22
251
31
29 Laravelのファサードが全然わからなかったので自分なりに色々と調べた事 yousan 17/03/20
17/03/21
261
32
30 エラー画面やAPIエラーから独自エラーまで! フローチャートでちゃんと理解するLaravelの例外処理とケーススタディ kd9951 18/11/18
19/10/04
302
30
31 PHP(Laravel)入門者のための要点まとめ yyokii 18/06/11
19/01/20
197
26
32 第1回 もう怖くない DIだって知らなくていい こんなにカンタンだから今日から Laravelのサービスコンテナ を使ってみて! kd9951 18/06/06
19/10/18
179
30
33 Laravelで実践クリーンアーキテクチャ nrslib 19/03/14
19/03/26
515
26
34 PHPで日付時刻処理を書くならCarbonを使うべき yudsuzuk 16/05/01
16/05/01
336
21
35 [laravel] controllerからviewへの変数の受け渡しとその展開方法 ryo2132 16/08/12
19/12/19
197
35
36 Eloquent をおさらい shosho 17/05/31
19/01/22
178
24
37 PHPを少しでも速く動かしたい kapitan 17/07/13
17/07/13
228
36
38 【Laravel】DB登録値取得時のfind()、get()、first()の返り値早見表 sola-msr 17/12/04
19/06/27
160
26
39 VS CodeでPHPの開発をするのに導入した拡張機能 cflat0528 18/12/05
18/12/05
157
35
40 MySQL8.0 認証方式を変更する(Laravel5) ucan-lab 18/05/29
19/11/17
179
18
41 $_GET, $_POSTなどを受け取る際の処理 mpyw 13/07/15
18/03/17
1240
0
42 Laravelのディレクトリ構造について学ぶ shosho 17/04/26
17/04/26
224
26
43 Docker環境でLaravelを構築するまで、わずか15分。 hosono 18/03/14
19/06/01
228
14
44 更新! Laravel6/7「make:Auth」が無くなった 〜Laravel6/7でのLogin機能の実装方法〜MyMemo daisu_yamazaki 19/09/06
20/03/31
154
44
45 Laradockを使ったLaravel開発環境構築 J_Shell 18/03/10
19/06/23
186
20
46 Laravelでテストコードを書くためのチュートリアル niisan-tokyo 16/08/06
16/08/06
266
20
47 Laravel6 ログイン機能を実装する ucan-lab 19/09/13
20/02/17
115
53
48 商用環境でも使っている Laravel 用 php-fpm イメージの Dockerfile レシピ mpyw 20/03/14
20/03/27
182
182
49 [PHP] Xdebug のリモートデバッグ、理解していますか? castaneai 18/06/27
18/08/29
197
20
50 【PHP7.4】PHP7.4がリリースされたので新機能全部やる rana_kualu 19/12/01
19/12/21
299
21
51 3分でわかるデザインパターン入門(GoF) rch1223 17/02/20
17/02/21
179
18
52 【企業サイト構築用】WordPress設計ガイドライン kgsi 16/12/13
19/03/19
442
23
53 もういい加減覚えよう。php.iniはどこにあるのか ritukiii 17/08/29
17/08/29
140
25
54 【実録】WordPressサイトをAWS+Laravel+Nuxtにフルリプレイスした話 mejileben 19/06/17
20/02/26
398
16
55 Laravelで始める依存性の注入(DI) harunbu 18/11/30
19/09/04
123
27
56 新人プログラマですがjQueryのajaxがわからなすぎて勉強したまとめ okumurakengo 16/10/22
18/12/24
291
14
57 Laravelで気持ちよく開発をするための拡張機能のまとめ motuo 18/05/17
19/04/12
133
32
58 【Laravel サービスコンテナ 中級編】メソッドインジェクションがしたい! kd9951 18/10/09
19/05/22
122
29
59 Laravelのルーティングチートシート fagai 15/12/25
19/10/22
217
22
60 Laravel5のアーキテクチャから学ぶより良いクラス設計 nunulk 16/08/04
17/04/05
355
14
61 Laravel リポジトリパターンの実装 bmf_san 16/12/16
17/12/29
199
21
62 Laravelでコマンドラインアプリケーションを作成する nenokido2000 17/01/25
17/01/30
168
24
63 LaravelでRoute::resourceを使うときに気をつけること sympe 17/08/30
18/05/14
156
17
64 PHPで出来てしまうが控えたほうががいい書き方 shinkuFencer 17/01/10
17/01/23
217
16
65 逆引き!Composer コマンド・ライン一覧(と基本概要) KEINOS 18/06/26
20/03/15
121
23
66 PHPができても他言語の学習には役に立たない理由を考えてみた。 raccy 17/05/08
18/12/11
245
12
67 PHPのオートロード(autoload) atwata 16/04/18
19/07/31
175
14
68 フロー図で理解するLaravelバリデータの仕組みと、チーム開発でのケーススタディ kd9951 18/12/22
18/12/25
106
26
69 Laravel で Fat Controller を防ぐ 5 つの Tips nunulk 20/02/15
20/02/24
175
175
70 ECSのチュートリアル - コンテナ運用を現実のものにする niisan-tokyo 17/03/18
19/04/19
181
14
71 Laravelのバリデーションにはフォームリクエストを使おう sakuraya 16/11/07
18/02/09
161
18
72 Eloquentに惚れちゃう便利な機能 henriquebremenkanp 16/02/20
18/04/20
237
14
73 【Laravel】DBにデータを保存する方法。createとinsertの違いなど katsunory 18/01/30
18/04/04
123
22
74 CentOS7のPHPを5.6/7.0/7.1/7.2/7.3系にバージョンアップする heimaru1231 17/12/29
20/01/18
119
20
75 [Laravel5.1]Fakerチートシート tosite0345 17/10/04
17/10/04
115
17
76 CentOS6/CentOS7にPHP5.6/PHP7をyumでインストール ozawan 16/02/19
17/07/23
506
8
77 P++: 銀河に平和をもたらすための奇策と決着 tadsan 19/08/14
19/08/14
533
3
78 【PHP8】PHPでJITが使えるようになる rana_kualu 19/03/27
20/01/14
381
20
79 PHPでJSONデータの取得の仕方 fantm21 15/07/29
16/08/15
246
14
80 Laravelでプロジェクトを作成したらまずやることメモ ponko2 15/10/09
17/11/23
383
9
81 in_arrayを使うときは黙って第三引数を付けること ritukiii 17/09/07
17/09/07
109
23
82 Laravel5.6入門 基本CRUD操作を体で覚える sayama0402 18/02/16
19/05/26
108
20
83 [LINE Bot] 位置情報から食べログ3.5以上の優良店を検索するbot作った NARI_Creator 18/07/25
19/07/24
395
7
84 今時のPHP HTTPクライアントのGuzzleを使ってみた yousan 17/02/01
19/09/24
141
13
85 【PHP7.4】ついにPHPにプロパティ型指定がやってくる rana_kualu 18/09/13
19/06/11
361
9
86 Laravel Passportの使い方まとめ zaburo 18/10/06
19/02/08
114
15
87 Laravel で Service 層を取り入れるときに検討したいこと nunulk 19/05/26
19/05/26
175
20
88 APIなどにfile_get_contents()を使うのはオススメしない理由と代替案 shinkuFencer 17/01/23
17/01/23
234
10
89 2つの座標間の距離を求める chiyoyo 16/11/07
19/04/22
143
19
90 Laravelでウェブアプリケーションをつくるときのベストプラクティスを探る nunulk 16/10/20
17/10/22
251
17
91 Laravel open source project で参考になりそうなもの acro5piano 17/01/16
18/10/09
183
7
92 [超簡単]LINE notify を使ってみる iitenkida7 16/10/02
19/08/22
178
9
93 開発への異常な愛情 または私は如何にして嫉妬を止めてActive Recordを愛するようになったか KizashiTakata 19/12/04
20/03/13
57
40
94 LaravelでCRUDのAPIをささっと作る sayama0402 18/02/19
18/10/09
101
19
95 僕がLaravelのEloquentに$fillableでなく$guardedを指定する理由 toro_ponz 18/07/22
18/07/22
109
15
96 脱PHP初心者!インターフェイスを理解しよう KNJ 19/08/11
19/08/13
234
9
97 第3回 なんでもツッコんで気軽に取り出すLaravelサービスコンテナの核心「結合」 kd9951 19/03/20
19/09/15
91
21
98 Laravel+Nuxt.jsでDocker開発環境構築からHerokuデプロイまで kon_shou 19/07/09
19/07/09
208
19
99 Docker に Composer をインストールするベストプラクティス(と解説) yatsubashi 19/09/29
19/09/29
59
43
100 Laravelのアセットに関するTips sakuraya 16/11/19
16/11/19
120
16

  1. 1行目が総数。2行目が直近3ヵ月。 

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

【PHP】【長期】Qiitaの読んでおかなければいけない記事100選【毎日自動更新】

ページ容量を増やさないために、不具合報告やコメントは、説明記事 に記載いただけると助かります。

順位 記事名
________________________________________
ユーザ 投稿日付
更新日付
LGTM1
1 Cookieとセッションをちゃんと理解する hththt 15/08/07
20/01/20
1827
505
2 nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する kotarella1110 16/03/17
18/04/09
1452
364
3 DI・DIコンテナ、ちゃんと理解出来てる・・? ritukiii 16/08/02
17/02/03
1368
318
4 【Laravel 6 & PHP 7.4 対応】Vue + Vue Router + Vuex + Laravel チュートリアル(全16回)を書きました。 MasahiroHarada 19/01/13
20/01/19
1809
411
5 分岐アンチパターン pakkun 15/12/10
19/02/01
721
193
6 【PHP超入門】Cookieとセッションについて 7968 16/08/21
19/09/25
738
295
7 【Laravel超入門】開発環境の構築(VirtualBox + Vagrant + Homestead + Composer) 7968 17/03/11
19/12/26
646
306
8 【PHP超入門】HTTP(GET・POST)について 7968 16/07/27
19/12/18
665
245
9 【PHP超入門】名前空間(namespace・use)について 7968 16/10/05
19/09/25
562
274
10 Laravelの開発環境をDockerを使って構築する ucan-lab 19/02/15
20/01/31
626
474
11 LaravelのORMで初心者から職人へ henriquebremenkanp 16/05/29
18/12/26
587
219
12 【PHP超入門】クラス~例外処理~PDOの基礎 7968 15/04/04
19/09/25
831
182
13 PHP isset, empty, is_null の違い早見表 shinichi-takii 16/06/22
16/06/22
490
221
14 Laravelのバリデーションで指定できる内容をざっくりまとめ直しました。 fagai 15/12/18
19/08/30
457
192
15 PHPオブジェクト指向入門(前半) mpyw 14/05/25
15/01/09
1463
140
16 就活のためにWEBサービスを作ったら、転職できた以上の価値をもたらしてくれた話 kd9951 18/05/08
18/05/10
1235
108
17 PHP開発でComposerを使わないなんてありえない!基礎編 niisan-tokyo 16/04/30
19/04/17
585
170
18 Laravelの標準Authentication(Auth)の動きを調べてみる zaburo 16/02/13
20/01/13
424
168
19 $_GET, $_POSTなどを受け取る際の処理 mpyw 13/07/15
18/03/17
1240
118
20 2018年のパスワードハッシュ rana_kualu 18/02/07
20/01/14
623
155
21 Laravel入門 - 使い方チュートリアル - sano1202 18/11/01
20/03/07
265
241
22 LINE Messaging API でできることまとめ【送信編】 kakakaori830 17/12/09
18/12/22
363
134
23 PHPのリリース日とサポート期限 bezeklik 15/12/14
20/03/24
315
120
24 これで完璧!今さら振り返る CSRF 対策と同一オリジンポリシーの基礎 mpyw 19/08/30
19/09/01
758
758
25 初心者向け。覚えておきたい 「ガード節」という書き方。 kouyan 18/03/10
19/05/27
204
166
26 PHPで日付時刻処理を書くならCarbonを使うべき yudsuzuk 16/05/01
16/05/01
336
123
27 Laravelをこれから勉強しようと思っている人へ fagai 17/09/11
19/10/07
342
136
28 【初心者向け】20分でLaravel開発環境を爆速構築するDockerハンズオン ucan-lab 19/07/18
19/10/19
441
441
29 Laravelのファサードが全然わからなかったので自分なりに色々と調べた事 yousan 17/03/20
17/03/21
261
117
30 Laravel キャッシュクリア系コマンドなど Ping 17/06/08
18/03/22
251
113
31 [laravel] controllerからviewへの変数の受け渡しとその展開方法 ryo2132 16/08/12
19/12/19
197
109
32 Laravelでテストコードを書くためのチュートリアル niisan-tokyo 16/08/06
16/08/06
266
95
33 Eloquent をおさらい shosho 17/05/31
19/01/22
178
132
34 新人プログラマですがjQueryのajaxがわからなすぎて勉強したまとめ okumurakengo 16/10/22
18/12/24
291
97
35 Laravel5のアーキテクチャから学ぶより良いクラス設計 nunulk 16/08/04
17/04/05
355
80
36 PHP(Laravel)入門者のための要点まとめ yyokii 18/06/11
19/01/20
197
157
37 Laravelのディレクトリ構造について学ぶ shosho 17/04/26
17/04/26
224
93
38 PHPを少しでも速く動かしたい kapitan 17/07/13
17/07/13
228
96
39 【企業サイト構築用】WordPress設計ガイドライン kgsi 16/12/13
19/03/19
442
67
40 Docker環境でLaravelを構築するまで、わずか15分。 hosono 18/03/14
19/06/01
228
121
41 Laravelで実践クリーンアーキテクチャ nrslib 19/03/14
19/03/26
515
150
42 第1回 もう怖くない DIだって知らなくていい こんなにカンタンだから今日から Laravelのサービスコンテナ を使ってみて! kd9951 18/06/06
19/10/18
179
148
43 3分でわかるデザインパターン入門(GoF) rch1223 17/02/20
17/02/21
179
116
44 エラー画面やAPIエラーから独自エラーまで! フローチャートでちゃんと理解するLaravelの例外処理とケーススタディ kd9951 18/11/18
19/10/04
302
132
45 Laravelのルーティングチートシート fagai 15/12/25
19/10/22
217
72
46 CentOS6/CentOS7にPHP5.6/PHP7をyumでインストール ozawan 16/02/19
17/07/23
506
51
47 【Laravel】DB登録値取得時のfind()、get()、first()の返り値早見表 sola-msr 17/12/04
19/06/27
160
121
48 Laravel リポジトリパターンの実装 bmf_san 16/12/16
17/12/29
199
79
49 Laradockを使ったLaravel開発環境構築 J_Shell 18/03/10
19/06/23
186
109
50 Laravelでプロジェクトを作成したらまずやることメモ ponko2 15/10/09
17/11/23
383
59
51 Eloquentに惚れちゃう便利な機能 henriquebremenkanp 16/02/20
18/04/20
237
62
52 MySQL8.0 認証方式を変更する(Laravel5) ucan-lab 18/05/29
19/11/17
179
123
53 PHPのオートロード(autoload) atwata 16/04/18
19/07/31
175
82
54 PHPで出来てしまうが控えたほうががいい書き方 shinkuFencer 17/01/10
17/01/23
217
70
55 OFFSETを使わない高速なページネーションの実現 mpyw 15/12/22
18/03/12
326
49
56 [PHP] Xdebug のリモートデバッグ、理解していますか? castaneai 18/06/27
18/08/29
197
113
57 PHPができても他言語の学習には役に立たない理由を考えてみた。 raccy 17/05/08
18/12/11
245
74
58 Laravelでコマンドラインアプリケーションを作成する nenokido2000 17/01/25
17/01/30
168
77
59 PHPでJSONデータの取得の仕方 fantm21 15/07/29
16/08/15
246
64
60 もういい加減覚えよう。php.iniはどこにあるのか ritukiii 17/08/29
17/08/29
140
95
61 ECSのチュートリアル - コンテナ運用を現実のものにする niisan-tokyo 17/03/18
19/04/19
181
72
62 LaravelでRoute::resourceを使うときに気をつけること sympe 17/08/30
18/05/14
156
78
63 Laravelのバリデーションにはフォームリクエストを使おう sakuraya 16/11/07
18/02/09
161
70
64 VS CodeでPHPの開発をするのに導入した拡張機能 cflat0528 18/12/05
18/12/05
157
120
65 Laravelのルーティング書き方まとめ michiomochi@github 13/12/17
17/03/21
429
46
66 Laravel open source project で参考になりそうなもの acro5piano 17/01/16
18/10/09
183
77
67 Laravelでの基本的なリレーションシップもしくはJOIN zaburo 15/11/25
19/01/21
178
54
68 PHP初心者は最低限これはやっとけ - 開発に入る前編 rana_kualu 16/07/05
16/07/10
708
41
69 APIなどにfile_get_contents()を使うのはオススメしない理由と代替案 shinkuFencer 17/01/23
17/01/23
234
50
70 三項演算子をもっと使おう rana_kualu 15/10/16
17/11/12
247
61
71 依存性注入(DI)の解説とやり方 1000k 15/06/21
17/11/28
285
48
72 最低限書いておきたいPHPのDocコメント motoyan-qwt 14/09/26
14/10/01
524
49
73 [超簡単]LINE notify を使ってみる iitenkida7 16/10/02
19/08/22
178
64
74 Laravelでウェブアプリケーションをつくるときのベストプラクティスを探る nunulk 16/10/20
17/10/22
251
43
75 Laravelで気持ちよく開発をするための拡張機能のまとめ motuo 18/05/17
19/04/12
133
91
76 PHPによる簡単なログイン認証いろいろ mpyw 16/03/30
18/02/24
394
48
77 【実録】WordPressサイトをAWS+Laravel+Nuxtにフルリプレイスした話 mejileben 19/06/17
20/02/26
395
395
78 Dockerでいい感じにPHP(Laravel)のローカル開発環境を作る igayamaguchi 17/11/08
18/10/09
192
50
79 Macでローカルサーバを立ち上げる方法 shuntaro_tamura 15/09/11
15/10/05
342
39
80 PHPでログイン機能を実装するチュートリアル #1 ShibuyaKosuke 15/07/23
18/09/18
215
56
81 2つの座標間の距離を求める chiyoyo 16/11/07
19/04/22
143
62
82 [PHP] 配列・連想配列の初期化、結合、追加 shuntaro_tamura 15/09/12
15/09/12
221
52
83 今時のPHP HTTPクライアントのGuzzleを使ってみた yousan 17/02/01
19/09/24
141
59
84 PDOを使ったPHPでのデータベース基本操作 mitsuru793 15/12/14
15/12/14
132
60
85 Laravelで始める依存性の注入(DI) harunbu 18/11/30
19/09/04
123
110
86 Laravel5.4以上、MySQL5.7.7未満 でusersテーブルのマイグレーションを実行すると Syntax error が発生する beer_geek 17/02/10
19/01/09
147
55
87 laravel-adminで管理画面を速攻で構築する。 pikonori 16/12/01
16/12/01
208
48
88 Laravel artisanコマンドメモ zaburo 16/01/02
16/01/02
150
56
89 【Laravel サービスコンテナ 中級編】メソッドインジェクションがしたい! kd9951 18/10/09
19/05/22
122
97
90 Markdownで表の記載をするときにイラッとした経験のある人集まれ taruhachi 14/08/12
14/08/13
246
32
91 【PHP】連想配列、配列への追加 kazu56 14/05/28
16/04/13
356
40
92 Google OAuth 2.0 認証を使ったログインの実装 kite_999 17/02/06
17/02/06
141
57
93 Laravelのアセットに関するTips sakuraya 16/11/19
16/11/19
120
57
94 【Laravel】DBにデータを保存する方法。createとinsertの違いなど katsunory 18/01/30
18/04/04
123
74
95 CentOS7のPHPを5.6/7.0/7.1/7.2/7.3系にバージョンアップする heimaru1231 17/12/29
20/01/18
119
79
96 PHPの多次元連想配列のソート shy_azusa 15/08/10
19/03/29
198
43
97 FizzBuzzから始めるコードの再利用性を高めるトレーニング tadsan 16/10/30
16/10/30
167
49
98 [Laravel5.1]Fakerチートシート tosite0345 17/10/04
17/10/04
115
74
99 逆引き!Composer コマンド・ライン一覧(と基本概要) KEINOS 18/06/26
20/03/15
121
90
100 DockerでPHP7.0×Apacheの環境を構築する(更新: 2017/6/27) kurkuru 17/05/26
18/05/28
175
44

  1. 1行目が総数。2行目が直近1年。 

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

【PHP】【長期】Qiitaの今読んでおくべき記事100選【毎日自動更新】

ページ容量を増やさないために、不具合報告やコメントは、説明記事 に記載いただけると助かります。

順位 記事名
________________________________________
ユーザ 投稿日付
更新日付
LGTM1
1 Cookieとセッションをちゃんと理解する hththt 15/08/07
20/01/20
1827
502
2 nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する kotarella1110 16/03/17
18/04/09
1452
361
3 DI・DIコンテナ、ちゃんと理解出来てる・・? ritukiii 16/08/02
17/02/03
1368
314
4 【Laravel 6 & PHP 7.4 対応】Vue + Vue Router + Vuex + Laravel チュートリアル(全16回)を書きました。 MasahiroHarada 19/01/13
20/01/19
1809
410
5 分岐アンチパターン pakkun 15/12/10
19/02/01
721
191
6 【PHP超入門】Cookieとセッションについて 7968 16/08/21
19/09/25
738
293
7 【Laravel超入門】開発環境の構築(VirtualBox + Vagrant + Homestead + Composer) 7968 17/03/11
19/12/26
646
305
8 【PHP超入門】HTTP(GET・POST)について 7968 16/07/27
19/12/18
665
243
9 【PHP超入門】名前空間(namespace・use)について 7968 16/10/05
19/09/25
562
270
10 Laravelの開発環境をDockerを使って構築する ucan-lab 19/02/15
20/01/31
626
473
11 LaravelのORMで初心者から職人へ henriquebremenkanp 16/05/29
18/12/26
587
216
12 【PHP超入門】クラス~例外処理~PDOの基礎 7968 15/04/04
19/09/25
831
181
13 PHP isset, empty, is_null の違い早見表 shinichi-takii 16/06/22
16/06/22
490
220
14 Laravelのバリデーションで指定できる内容をざっくりまとめ直しました。 fagai 15/12/18
19/08/30
457
188
15 PHPオブジェクト指向入門(前半) mpyw 14/05/25
15/01/09
1463
140
16 就活のためにWEBサービスを作ったら、転職できた以上の価値をもたらしてくれた話 kd9951 18/05/08
18/05/10
1235
106
17 PHP開発でComposerを使わないなんてありえない!基礎編 niisan-tokyo 16/04/30
19/04/17
585
168
18 Laravelの標準Authentication(Auth)の動きを調べてみる zaburo 16/02/13
20/01/13
424
168
19 $_GET, $_POSTなどを受け取る際の処理 mpyw 13/07/15
18/03/17
1240
118
20 2018年のパスワードハッシュ rana_kualu 18/02/07
20/01/14
623
154
21 Laravel入門 - 使い方チュートリアル - sano1202 18/11/01
20/03/07
265
241
22 LINE Messaging API でできることまとめ【送信編】 kakakaori830 17/12/09
18/12/22
363
134
23 PHPのリリース日とサポート期限 bezeklik 15/12/14
20/03/24
315
114
24 これで完璧!今さら振り返る CSRF 対策と同一オリジンポリシーの基礎 mpyw 19/08/30
19/09/01
758
758
25 初心者向け。覚えておきたい 「ガード節」という書き方。 kouyan 18/03/10
19/05/27
204
166
26 Laravelをこれから勉強しようと思っている人へ fagai 17/09/11
19/10/07
342
136
27 PHPで日付時刻処理を書くならCarbonを使うべき yudsuzuk 16/05/01
16/05/01
336
121
28 【初心者向け】20分でLaravel開発環境を爆速構築するDockerハンズオン ucan-lab 19/07/18
19/10/19
441
441
29 Laravelのファサードが全然わからなかったので自分なりに色々と調べた事 yousan 17/03/20
17/03/21
261
116
30 Laravel キャッシュクリア系コマンドなど Ping 17/06/08
18/03/22
251
112
31 [laravel] controllerからviewへの変数の受け渡しとその展開方法 ryo2132 16/08/12
19/12/19
197
109
32 Laravelでテストコードを書くためのチュートリアル niisan-tokyo 16/08/06
16/08/06
266
94
33 Eloquent をおさらい shosho 17/05/31
19/01/22
178
131
34 新人プログラマですがjQueryのajaxがわからなすぎて勉強したまとめ okumurakengo 16/10/22
18/12/24
291
95
35 Laravel5のアーキテクチャから学ぶより良いクラス設計 nunulk 16/08/04
17/04/05
355
80
36 PHP(Laravel)入門者のための要点まとめ yyokii 18/06/11
19/01/20
197
157
37 Laravelのディレクトリ構造について学ぶ shosho 17/04/26
17/04/26
224
92
38 【企業サイト構築用】WordPress設計ガイドライン kgsi 16/12/13
19/03/19
442
66
39 PHPを少しでも速く動かしたい kapitan 17/07/13
17/07/13
228
95
40 Docker環境でLaravelを構築するまで、わずか15分。 hosono 18/03/14
19/06/01
228
120
41 Laravelで実践クリーンアーキテクチャ nrslib 19/03/14
19/03/26
515
147
42 第1回 もう怖くない DIだって知らなくていい こんなにカンタンだから今日から Laravelのサービスコンテナ を使ってみて! kd9951 18/06/06
19/10/18
179
146
43 エラー画面やAPIエラーから独自エラーまで! フローチャートでちゃんと理解するLaravelの例外処理とケーススタディ kd9951 18/11/18
19/10/04
302
131
44 3分でわかるデザインパターン入門(GoF) rch1223 17/02/20
17/02/21
179
116
45 Laravelのルーティングチートシート fagai 15/12/25
19/10/22
217
72
46 CentOS6/CentOS7にPHP5.6/PHP7をyumでインストール ozawan 16/02/19
17/07/23
506
51
47 【Laravel】DB登録値取得時のfind()、get()、first()の返り値早見表 sola-msr 17/12/04
19/06/27
160
120
48 Laravel リポジトリパターンの実装 bmf_san 16/12/16
17/12/29
199
79
49 Laradockを使ったLaravel開発環境構築 J_Shell 18/03/10
19/06/23
186
109
50 Laravelでプロジェクトを作成したらまずやることメモ ponko2 15/10/09
17/11/23
383
59
51 Eloquentに惚れちゃう便利な機能 henriquebremenkanp 16/02/20
18/04/20
237
62
52 MySQL8.0 認証方式を変更する(Laravel5) ucan-lab 18/05/29
19/11/17
179
122
53 PHPのオートロード(autoload) atwata 16/04/18
19/07/31
175
81
54 PHPで出来てしまうが控えたほうががいい書き方 shinkuFencer 17/01/10
17/01/23
217
69
55 [PHP] Xdebug のリモートデバッグ、理解していますか? castaneai 18/06/27
18/08/29
197
111
56 PHPができても他言語の学習には役に立たない理由を考えてみた。 raccy 17/05/08
18/12/11
245
74
57 Laravelでコマンドラインアプリケーションを作成する nenokido2000 17/01/25
17/01/30
168
77
58 PHPでJSONデータの取得の仕方 fantm21 15/07/29
16/08/15
246
64
59 もういい加減覚えよう。php.iniはどこにあるのか ritukiii 17/08/29
17/08/29
140
95
60 ECSのチュートリアル - コンテナ運用を現実のものにする niisan-tokyo 17/03/18
19/04/19
181
71
61 LaravelでRoute::resourceを使うときに気をつけること sympe 17/08/30
18/05/14
156
78
62 VS CodeでPHPの開発をするのに導入した拡張機能 cflat0528 18/12/05
18/12/05
157
119
63 Laravelのバリデーションにはフォームリクエストを使おう sakuraya 16/11/07
18/02/09
161
69
64 Laravelでの基本的なリレーションシップもしくはJOIN zaburo 15/11/25
19/01/21
178
54
65 Laravelのルーティング書き方まとめ michiomochi@github 13/12/17
17/03/21
429
44
66 PHP初心者は最低限これはやっとけ - 開発に入る前編 rana_kualu 16/07/05
16/07/10
708
41
67 Laravel open source project で参考になりそうなもの acro5piano 17/01/16
18/10/09
183
76
68 三項演算子をもっと使おう rana_kualu 15/10/16
17/11/12
247
61
69 APIなどにfile_get_contents()を使うのはオススメしない理由と代替案 shinkuFencer 17/01/23
17/01/23
234
49
70 依存性注入(DI)の解説とやり方 1000k 15/06/21
17/11/28
285
47
71 最低限書いておきたいPHPのDocコメント motoyan-qwt 14/09/26
14/10/01
524
49
72 [超簡単]LINE notify を使ってみる iitenkida7 16/10/02
19/08/22
178
63
73 Laravelでウェブアプリケーションをつくるときのベストプラクティスを探る nunulk 16/10/20
17/10/22
251
43
74 【実録】WordPressサイトをAWS+Laravel+Nuxtにフルリプレイスした話 mejileben 19/06/17
20/02/26
398
398
75 Laravelで気持ちよく開発をするための拡張機能のまとめ motuo 18/05/17
19/04/12
133
91
76 PHPによる簡単なログイン認証いろいろ mpyw 16/03/30
18/02/24
394
47
77 PHPでログイン機能を実装するチュートリアル #1 ShibuyaKosuke 15/07/23
18/09/18
215
56
78 Dockerでいい感じにPHP(Laravel)のローカル開発環境を作る igayamaguchi 17/11/08
18/10/09
192
50
79 Macでローカルサーバを立ち上げる方法 shuntaro_tamura 15/09/11
15/10/05
342
39
80 [PHP] 配列・連想配列の初期化、結合、追加 shuntaro_tamura 15/09/12
15/09/12
221
52
81 2つの座標間の距離を求める chiyoyo 16/11/07
19/04/22
143
61
82 PDOを使ったPHPでのデータベース基本操作 mitsuru793 15/12/14
15/12/14
132
60
83 今時のPHP HTTPクライアントのGuzzleを使ってみた yousan 17/02/01
19/09/24
141
59
84 Laravelで始める依存性の注入(DI) harunbu 18/11/30
19/09/04
123
110
85 Laravel5.4以上、MySQL5.7.7未満 でusersテーブルのマイグレーションを実行すると Syntax error が発生する beer_geek 17/02/10
19/01/09
147
54
86 laravel-adminで管理画面を速攻で構築する。 pikonori 16/12/01
16/12/01
208
48
87 Laravel artisanコマンドメモ zaburo 16/01/02
16/01/02
150
56
88 【Laravel サービスコンテナ 中級編】メソッドインジェクションがしたい! kd9951 18/10/09
19/05/22
122
97
89 Markdownで表の記載をするときにイラッとした経験のある人集まれ taruhachi 14/08/12
14/08/13
246
31
90 【PHP】連想配列、配列への追加 kazu56 14/05/28
16/04/13
356
39
91 Google OAuth 2.0 認証を使ったログインの実装 kite_999 17/02/06
17/02/06
141
57
92 Laravelのアセットに関するTips sakuraya 16/11/19
16/11/19
120
57
93 【Laravel】DBにデータを保存する方法。createとinsertの違いなど katsunory 18/01/30
18/04/04
123
74
94 CentOS7のPHPを5.6/7.0/7.1/7.2/7.3系にバージョンアップする heimaru1231 17/12/29
20/01/18
119
79
95 FizzBuzzから始めるコードの再利用性を高めるトレーニング tadsan 16/10/30
16/10/30
167
49
96 [Laravel5.1]Fakerチートシート tosite0345 17/10/04
17/10/04
115
74
97 PHPの多次元連想配列のソート shy_azusa 15/08/10
19/03/29
198
43
98 逆引き!Composer コマンド・ライン一覧(と基本概要) KEINOS 18/06/26
20/03/15
121
88
99 DockerでPHP7.0×Apacheの環境を構築する(更新: 2017/6/27) kurkuru 17/05/26
18/05/28
175
44
100 [LINE Bot] 位置情報から食べログ3.5以上の優良店を検索するbot作った NARI_Creator 18/07/25
19/07/24
395
35

  1. 1行目が総数。2行目が直近1年。 

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

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.yaml

Homestead.yamlファイルの以下の部分を先ほど作成したssh認証鍵がある場所(authorizeは公開鍵、keysは秘密鍵の場所)に指定します。

Homestead.yaml
authorize: ~/.ssh/任意のfile名.pub

keys:
    - ~/.ssh/任意のfile名

再度、以下のコマンドでvagrantを起動させると無事起動します。

$ vagrant up

laravel new app_nameコマンドが失敗する

ターミナル上で、

laravel new app_name

コマンドを打って、app_nameという名前のプロジェクトディレクトリーを作成しようと試みるも失敗した。

この理由は、
Homestead.yamlで指定された場所にディレクトリが作成されておらず、ホスト側とゲスト側で同期できなかったため
である。

Homestead.yaml
folders:
    - map: ~/project/laravel/
      to: /home/vagrant/laravel/

そのため、laravelディレクトリをHomestead.yamlで指定された場所(この場合、ローカル環境では/projectの下、仮想環境では/home/vagrantの下)に作成して、以下のコマンドで設定を反映させた。

$ vagrant reload --provision

その後、vagrant上で以下のコマンドを打ち、laravelディレクトリに移動し、

$ cd laravel

以下のコマンドを実行すると、appプロジェクトフォルダを作成することができた。

$ laravel new app_name

Laravelの初期画面がブラウザで表示されない

Homestead.yamlの設定を終え、laravelのトップ画面にアクセスしようと、
homestead.laravel
をブラウザのurlに打ち込むと、アクセスすることができなかった。

この原因は、

Webサーバーに参照させるパスを、Projectディレクトリの配下にあるpublicディレクトリに指定していなかったため

であった。

webサーバーに参照させるパスは、以下の部分で指定することができます。
以下の変更前の設定では、
homestead.laravel
がクライアントから送信されたときにwebサーバーは
/home/vagrant/laravel/app_name
を参照するように設定していました。

Homestead.yaml
sites:
    - map: homestead.laravel
      to: /home/vagrant/laravel/app_name/public
      php: "7.4"

これを、
homestead.laravel
がクライアントから送信されたときにwebサーバーは
/home/vagrant/laravel/app_name/public
を参照するように変更しました。

Homestead.yaml
sites:
    - map: homestead.laravel
      to: /home/vagrant/laravel/app_name/public
      php: "7.4"

ちなみに、上記の設定でもlaravelの画面が表示されない場合は、以下の手順で解決する場合がありますのでヒントになればなと思います。

まず、ローカル環境で、/etcディレクトリに移動し、hostsファイルを開きます。

$ cd /etc
$ vim hosts

hostsファイルを開くと、以下のような画面がでてきます。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.yaml
ip: "192.168.10.10" ←ipアドレス
…(中略)
sites:
    - map: homestead.laravel ←ドメイン

まとめ

環境構築は、躓くポイントが沢山あるため、自分も含めプログラミング初心者の方はプログラミングに入る前に挫折してしまいがちです。

また、ベテランエンジニアの方でもいざ環境構築を久しぶりにしてみると
「あれ?」
と思うようなポイントが散りばめられていると考えています。

なので、環境構築をする際には、自分がやっている設定や設定過程で発生したエラーが何を意味しているのかをしっかりと理解する必要があると考えています。

最後になりますが、この記事が、Virtualbox+Vagrant+Homesteadでlaravelの開発環境を構築しようと試みている人に少しでも役に立てばと思ってます。

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