<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Composer  |  takeHo（たけほ）のへなちょこ台帳</title>
	<atom:link href="https://blog.takeho.com/tag/composer/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.takeho.com</link>
	<description>いわゆる自由帳ってところです。</description>
	<lastBuildDate>Fri, 11 Sep 2026 05:53:09 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6</generator>

<image>
	<url>https://blog.takeho.com/wp-content/uploads/2024/08/icon-150x150.png</url>
	<title>Composer  |  takeHo（たけほ）のへなちょこ台帳</title>
	<link>https://blog.takeho.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>PHP 5とPHP 8.2の書き方を徹底比較―最新PHPが分かりにくい人のための読み解き方</title>
		<link>https://blog.takeho.com/f4rx9qxxwawymw7i2pld7hc5bbw6hyh4/</link>
					<comments>https://blog.takeho.com/f4rx9qxxwawymw7i2pld7hc5bbw6hyh4/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Sat, 05 Sep 2026 05:42:55 +0000</pubDate>
				<category><![CDATA[ウェブ・開発]]></category>
		<category><![CDATA[Composer]]></category>
		<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=1985</guid>

					<description><![CDATA[長くPHP 5を使ってきた人がPHP 8.2のコードを見ると、「同じPHPとは思えない」「記号が多く、何をしているのか分からない」と感じることがあります。これは決して理解力の問題ではありません。PHP 5からPHP 8. [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>長くPHP 5を使ってきた人がPHP 8.2のコードを見ると、「同じPHPとは思えない」「記号が多く、何をしているのか分からない」と感じることがあります。これは決して理解力の問題ではありません。PHP 5からPHP 8.2までの間に、言語仕様だけでなく、開発現場で好まれる設計やツールの使い方も大きく変わったためです。</p>



<p>この記事では、PHP 5でよく使われた書き方とPHP 8.2の書き方を、同じ処理ごとに並べて比較します。最新構文を暗記するのではなく、「新しい一行は、昔のどの処理を短くしたものなのか」を理解することが目的です。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2"><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">最初に結論：難しく見える原因は3つ</a></li><li><a href="#toc2" tabindex="0">比較1：関数の引数と戻り値</a><ol><li><a href="#toc3" tabindex="0">PHP 5でよくある書き方</a></li><li><a href="#toc4" tabindex="0">PHP 8.2の書き方</a></li></ol></li><li><a href="#toc5" tabindex="0">比較2：nullを許可する型と複数の型</a></li><li><a href="#toc6" tabindex="0">比較3：値が存在しない場合の処理</a><ol><li><a href="#toc7" tabindex="0">PHP 5の書き方</a></li><li><a href="#toc8" tabindex="0">PHP 8.2でよく使う書き方</a></li></ol></li><li><a href="#toc9" tabindex="0">比較4：null安全演算子 ?-&gt;</a><ol><li><a href="#toc10" tabindex="0">従来の書き方</a></li><li><a href="#toc11" tabindex="0">PHP 8.2の書き方</a></li></ol></li><li><a href="#toc12" tabindex="0">比較5：クラスのプロパティとコンストラクタ</a><ol><li><a href="#toc13" tabindex="0">PHP 5の書き方</a></li><li><a href="#toc14" tabindex="0">PHP 8.2の書き方</a></li></ol></li><li><a href="#toc15" tabindex="0">比較6：readonlyで変更を禁止する</a></li><li><a href="#toc16" tabindex="0">比較7：switchとmatch</a><ol><li><a href="#toc17" tabindex="0">PHP 5のswitch</a></li><li><a href="#toc18" tabindex="0">PHP 8.2のmatch</a></li></ol></li><li><a href="#toc19" tabindex="0">比較8：無名関数とアロー関数</a><ol><li><a href="#toc20" tabindex="0">従来の無名関数</a></li><li><a href="#toc21" tabindex="0">アロー関数</a></li></ol></li><li><a href="#toc22" tabindex="0">比較9：文字列や数値で表していた状態をEnumにする</a><ol><li><a href="#toc23" tabindex="0">PHP 5でよくある状態管理</a></li><li><a href="#toc24" tabindex="0">PHP 8.2のEnum</a></li></ol></li><li><a href="#toc25" tabindex="0">比較10：コメントから属性 #[&#8230;] へ</a><ol><li><a href="#toc26" tabindex="0">コメントで設定を書く例</a></li><li><a href="#toc27" tabindex="0">PHP 8の属性</a></li></ol></li><li><a href="#toc28" tabindex="0">比較11：requireとComposer・名前空間</a><ol><li><a href="#toc29" tabindex="0">PHP 5でよくある書き方</a></li><li><a href="#toc30" tabindex="0">現在よく見る書き方</a></li></ol></li><li><a href="#toc31" tabindex="0">比較12：クラス内で部品を作るか、外から渡すか</a><ol><li><a href="#toc32" tabindex="0">PHP 5時代に多かった形</a></li><li><a href="#toc33" tabindex="0">現代的な依存性注入</a></li></ol></li><li><a href="#toc34" tabindex="0">PHP 8.2では宣言していないプロパティが問題になる</a><ol><li><a href="#toc35" tabindex="0">PHP 5では動いていた書き方</a></li><li><a href="#toc36" tabindex="0">PHP 8.2で明示する</a></li></ol></li><li><a href="#toc37" tabindex="0">PHP 8.2のコードを読む実践手順</a><ol><li><a href="#toc38" tabindex="0">1．記号を日本語に置き換える</a></li><li><a href="#toc39" tabindex="0">2．短い一行を昔のif文へ戻す</a></li><li><a href="#toc40" tabindex="0">3．PHPの文法とフレームワークの機能を分ける</a></li></ol></li><li><a href="#toc41" tabindex="0">おすすめの学習順序</a><ol><li><a href="#toc42" tabindex="0">最初に覚えるもの</a></li><li><a href="#toc43" tabindex="0">次に覚えるもの</a></li></ol></li><li><a href="#toc44" tabindex="0">最新構文を全部使うことが良いコードではない</a></li><li><a href="#toc45" tabindex="0">PHP 5からPHP 8.2へ移行するときの注意</a></li><li><a href="#toc46" tabindex="0">まとめ</a></li><li><a href="#toc47" tabindex="0">参考資料</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">最初に結論：難しく見える原因は3つ</span></h2>



<ol class="wp-block-list"><li>変数や引数、戻り値に型を書くようになった</li><li>長い処理を一行にまとめる省略構文が増えた</li><li>手続き型中心から、クラス、Composer、依存性注入を使う設計へ移った</li></ol>



<p>PHP 8.2がPHP 5より本質的に難解になったというより、以前はコメントや開発者の頭の中にあった決まりを、コード上へ明示するようになったと考えると理解しやすくなります。</p>



<figure class="wp-block-table"><table><thead><tr><th>PHP 5で多かった考え方</th><th>PHP 8.2で多い考え方</th></tr></thead><tbody><tr><td>値の種類は実行時にPHPが判断</td><td>引数や戻り値の型を明示</td></tr><tr><td>配列で多くのデータを表現</td><td>クラスやEnumで意味を表現</td></tr><tr><td>requireでファイルを読み込む</td><td>Composerで自動読み込み</td></tr><tr><td>長いが上から順番に読める</td><td>短いが記号の知識が必要</td></tr><tr><td>曖昧な値を自動変換</td><td>不正な値は早めにエラー</td></tr></tbody></table></figure>



<h2 class="wp-block-heading"><span id="toc2">比較1：関数の引数と戻り値</span></h2>



<h3 class="wp-block-heading"><span id="toc3">PHP 5でよくある書き方</span></h3>



<pre class="wp-block-code"><code>function add($a, $b)
{
    return $a + $b;
}</code></pre>



<p>短くて分かりやすい反面、整数、文字列、nullなど、どの値を渡す前提なのかは関数の中身を読むまで分かりません。</p>



<h3 class="wp-block-heading"><span id="toc4">PHP 8.2の書き方</span></h3>



<pre class="wp-block-code"><code>function add(int $a, int $b): int
{
    return $a + $b;
}</code></pre>



<p><code>int $a</code>と<code>int $b</code>は「整数を受け取る」、最後の<code>: int</code>は「整数を返す」という意味です。型は処理ではなく、この関数の入力と出力を説明する仕様書です。</p>



<p><code>function findUser(int $id): User</code>なら、「整数のIDを渡すとUserオブジェクトが返る関数」と日本語へ置き換えて読めば十分です。</p>



<h2 class="wp-block-heading"><span id="toc5">比較2：nullを許可する型と複数の型</span></h2>



<pre class="wp-block-code"><code>function findUser(int $id): ?User
{
    // 見つかればUser、見つからなければnull
}</code></pre>



<p><code>?User</code>は「Userまたはnull」です。次の<code>User|null</code>と同じ意味になります。</p>



<pre class="wp-block-code"><code>function findUser(int $id): User|null
{
}</code></pre>



<p><code>|</code>は「または」と読みます。例えば<code>int|string</code>なら「整数または文字列」、<code>User|false</code>なら「Userまたはfalse」です。複雑な記号として覚えるより、日本語へ機械的に置き換えるのが近道です。</p>



<h2 class="wp-block-heading"><span id="toc6">比較3：値が存在しない場合の処理</span></h2>



<h3 class="wp-block-heading"><span id="toc7">PHP 5の書き方</span></h3>



<pre class="wp-block-code"><code>if (isset($_POST['name'])) {
    $name = $_POST['name'];
} else {
    $name = '';
}</code></pre>



<h3 class="wp-block-heading"><span id="toc8">PHP 8.2でよく使う書き方</span></h3>



<pre class="wp-block-code"><code>$name = $_POST['name'] ?? '';</code></pre>



<p><code>??</code>は「左側に値があれば使い、なければ右側を使う」という意味です。PHP 7で導入された構文ですが、PHP 8系のコードでは日常的に登場します。短いコードが読みにくい場合は、頭の中で元のif文に戻してみましょう。</p>



<h2 class="wp-block-heading"><span id="toc9">比較4：null安全演算子 ?-&gt;</span></h2>



<h3 class="wp-block-heading"><span id="toc10">従来の書き方</span></h3>



<pre class="wp-block-code"><code>$user = getUser();

if ($user !== null) {
    $company = $user-&gt;getCompany();

    if ($company !== null) {
        $name = $company-&gt;getName();
    } else {
        $name = null;
    }
} else {
    $name = null;
}</code></pre>



<h3 class="wp-block-heading"><span id="toc11">PHP 8.2の書き方</span></h3>



<pre class="wp-block-code"><code>$name = getUser()?-&gt;getCompany()?-&gt;getName();</code></pre>



<p><code>?-&gt;</code>は「左側がnullなら、その先を実行せずnullにする」という記号です。上の一行は、Userが存在するか、Companyが存在するかを順番に確認しています。</p>



<p>さらに次のように書かれていれば、「名前を取得できなければ名称未設定を使う」と読めます。</p>



<pre class="wp-block-code"><code>$name = getUser()?-&gt;getCompany()?-&gt;getName() ?? '名称未設定';</code></pre>



<h2 class="wp-block-heading"><span id="toc12">比較5：クラスのプロパティとコンストラクタ</span></h2>



<h3 class="wp-block-heading"><span id="toc13">PHP 5の書き方</span></h3>



<pre class="wp-block-code"><code>class User
{
    private $name;
    private $email;

    public function __construct($name, $email)
    {
        $this-&gt;name = $name;
        $this-&gt;email = $email;
    }
}</code></pre>



<h3 class="wp-block-heading"><span id="toc14">PHP 8.2の書き方</span></h3>



<pre class="wp-block-code"><code>class User
{
    public function __construct(
        private string $name,
        private string $email
    ) {
    }
}</code></pre>



<p>PHP 8のコンストラクタ・プロパティ・プロモーションでは、プロパティの宣言、コンストラクタ引数、プロパティへの代入を一か所にまとめられます。</p>



<p><code>private string $name</code>を見たら、「文字列型のprivateプロパティを作り、コンストラクタで受け取った値を保存する」と展開します。コード量は減りますが、裏側で行われる処理はPHP 5の例とほぼ同じです。</p>



<h2 class="wp-block-heading"><span id="toc15">比較6：readonlyで変更を禁止する</span></h2>



<pre class="wp-block-code"><code>class User
{
    public function __construct(
        public readonly int $id,
        public readonly string $name
    ) {
    }
}</code></pre>



<p><code>readonly</code>は、最初に設定した値を後から変更できないようにします。</p>



<pre class="wp-block-code"><code>$user = new User(1, '田中');
$user-&gt;id = 2; // エラー</code></pre>



<p>PHP 5では、変更してはいけない値も運用上の約束で守ることがありました。PHP 8.2では、その約束を言語側で強制できます。つまり、<code>readonly</code>は難しい処理ではなく「作成後は変更禁止」という注意書きです。</p>



<h2 class="wp-block-heading"><span id="toc16">比較7：switchとmatch</span></h2>



<h3 class="wp-block-heading"><span id="toc17">PHP 5のswitch</span></h3>



<pre class="wp-block-code"><code>switch ($status) {
    case 1:
        $message = '受付中';
        break;

    case 2:
        $message = '完了';
        break;

    default:
        $message = '不明';
        break;
}</code></pre>



<h3 class="wp-block-heading"><span id="toc18">PHP 8.2のmatch</span></h3>



<pre class="wp-block-code"><code>$message = match ($status) {
    1 =&gt; '受付中',
    2 =&gt; '完了',
    default =&gt; '不明',
};</code></pre>



<p><code>match</code>は「値を返すswitch」と考えると理解できます。<code>$status</code>が1なら「受付中」、2なら「完了」、それ以外なら「不明」を<code>$message</code>へ代入しています。breakが不要で、比較も厳密です。</p>



<h2 class="wp-block-heading"><span id="toc19">比較8：無名関数とアロー関数</span></h2>



<h3 class="wp-block-heading"><span id="toc20">従来の無名関数</span></h3>



<pre class="wp-block-code"><code>$prices = array_map(function ($price) {
    return $price * 1.1;
}, $items);</code></pre>



<h3 class="wp-block-heading"><span id="toc21">アロー関数</span></h3>



<pre class="wp-block-code"><code>$prices = array_map(
    fn($price) =&gt; $price * 1.1,
    $items
);</code></pre>



<p><code>fn($price) =&gt; $price * 1.1</code>は、「$priceを受け取り、$price × 1.1を返す短い関数」です。複数行の処理には通常の無名関数を使ったほうが読みやすくなります。新構文を使うこと自体が目的ではありません。</p>



<h2 class="wp-block-heading"><span id="toc22">比較9：文字列や数値で表していた状態をEnumにする</span></h2>



<h3 class="wp-block-heading"><span id="toc23">PHP 5でよくある状態管理</span></h3>



<pre class="wp-block-code"><code>$status = 'paid';

if ($status === 'paid') {
    // 支払済みの処理
}</code></pre>



<p>単純ですが、<code>padi</code>のようにスペルを間違えても、ただの文字列として成立してしまいます。</p>



<h3 class="wp-block-heading"><span id="toc24">PHP 8.2のEnum</span></h3>



<pre class="wp-block-code"><code>enum PaymentStatus: string
{
    case Pending = 'pending';
    case Paid = 'paid';
    case Cancelled = 'cancelled';
}

$status = PaymentStatus::Paid;</code></pre>



<p>Enumは、「指定された候補以外を入れられない値」です。難しいオブジェクトとして捉えず、入力可能な選択肢を先に決めたものと理解するとよいでしょう。</p>



<h2 class="wp-block-heading"><span id="toc25">比較10：コメントから属性 #[&#8230;] へ</span></h2>



<h3 class="wp-block-heading"><span id="toc26">コメントで設定を書く例</span></h3>



<pre class="wp-block-code"><code>/**
 * @Route("/users", methods={"GET"})
 */
public function index()
{
}</code></pre>



<h3 class="wp-block-heading"><span id="toc27">PHP 8の属性</span></h3>



<pre class="wp-block-code"><code>#[Route('/users', methods: ['GET'])]
public function index(): Response
{
}</code></pre>



<p><code>#[...]</code>は属性（Attribute）です。クラスやメソッドへ、フレームワークなどが読み取れる追加情報を付けます。上の例では「/usersへのGETアクセスをこのメソッドで処理する」という設定です。</p>



<p>属性を見たら、まず「ここは通常の処理本体ではなく、付加設定である」と切り離しましょう。その属性が何をするかはPHP共通ではなく、LaravelやSymfonyなど利用している仕組みによって変わる場合があります。</p>



<h2 class="wp-block-heading"><span id="toc28">比較11：requireとComposer・名前空間</span></h2>



<h3 class="wp-block-heading"><span id="toc29">PHP 5でよくある書き方</span></h3>



<pre class="wp-block-code"><code>require_once 'UserRepository.php';

$repository = new UserRepository();</code></pre>



<h3 class="wp-block-heading"><span id="toc30">現在よく見る書き方</span></h3>



<pre class="wp-block-code"><code>namespace App\Service;

use App\Repository\UserRepository;

$repository = new UserRepository();</code></pre>



<p><code>namespace</code>はクラスの所属先を表し、同名クラスの衝突を防ぎます。<code>use App\Repository\UserRepository;</code>は、その長いクラス名を、このファイル内では<code>UserRepository</code>という短い名前で使う宣言です。</p>



<p>実際のファイル読み込みはComposerのオートローダーが担当することが一般的です。最初は<code>namespace</code>と<code>use</code>を処理本体から外し、「クラス名の住所と略称」として読んでも問題ありません。</p>



<h2 class="wp-block-heading"><span id="toc31">比較12：クラス内で部品を作るか、外から渡すか</span></h2>



<h3 class="wp-block-heading"><span id="toc32">PHP 5時代に多かった形</span></h3>



<pre class="wp-block-code"><code>class UserController
{
    public function show($id)
    {
        $repository = new UserRepository();
        $logger = new Logger();

        $logger-&gt;info('ユーザーを取得します');

        return $repository-&gt;find($id);
    }
}</code></pre>



<h3 class="wp-block-heading"><span id="toc33">現代的な依存性注入</span></h3>



<pre class="wp-block-code"><code>class UserController
{
    public function __construct(
        private UserRepository $repository,
        private LoggerInterface $logger
    ) {
    }

    public function show(int $id): ?User
    {
        $this-&gt;logger-&gt;info('ユーザーを取得します');

        return $this-&gt;repository-&gt;find($id);
    }
}</code></pre>



<p>後者では、必要なRepositoryやLoggerをクラス内で直接作らず、外から渡してもらいます。これが依存性注入です。用語は難しく聞こえますが、「このクラスで使用する道具を外から受け取る」と考えれば十分です。</p>



<p>部品を交換しやすく、テストもしやすくなるため、現在のフレームワークで広く使われています。PHP 8.2の文法というより、現代的な設計方法の違いが、コードを別物に見せている大きな原因です。</p>



<h2 class="wp-block-heading"><span id="toc34">PHP 8.2では宣言していないプロパティが問題になる</span></h2>



<h3 class="wp-block-heading"><span id="toc35">PHP 5では動いていた書き方</span></h3>



<pre class="wp-block-code"><code>class User
{
}

$user = new User();
$user-&gt;name = '田中';</code></pre>



<p>このように、クラスで宣言していないプロパティを後から追加する方法を動的プロパティと呼びます。PHP 8.2では原則として非推奨です。</p>



<h3 class="wp-block-heading"><span id="toc36">PHP 8.2で明示する</span></h3>



<pre class="wp-block-code"><code>class User
{
    public string $name;
}

$user = new User();
$user-&gt;name = '田中';</code></pre>



<p>宣言が必要になったのは、例えば<code>$user-&gt;nmae</code>というスペルミスを新しいプロパティとして見逃さないためです。面倒が増えたように見えますが、不具合を早い段階で発見するための変更です。</p>



<h2 class="wp-block-heading"><span id="toc37">PHP 8.2のコードを読む実践手順</span></h2>



<h3 class="wp-block-heading"><span id="toc38">1．記号を日本語に置き換える</span></h3>



<figure class="wp-block-table"><table><thead><tr><th>記述</th><th>読み替え</th></tr></thead><tbody><tr><td><code>?User</code></td><td>Userまたはnull</td></tr><tr><td><code>User|false</code></td><td>Userまたはfalse</td></tr><tr><td><code>: int</code></td><td>整数を返す</td></tr><tr><td><code>: void</code></td><td>戻り値を使わない</td></tr><tr><td><code>?-&gt;</code></td><td>nullならそこで止める</td></tr><tr><td><code>??</code></td><td>値がなければ右側を使う</td></tr><tr><td><code>fn() =&gt;</code></td><td>一つの式を返す短い関数</td></tr><tr><td><code>#[...]</code></td><td>付加設定</td></tr><tr><td><code>readonly</code></td><td>作成後は変更禁止</td></tr><tr><td><code>match</code></td><td>値を返すswitch</td></tr></tbody></table></figure>



<h3 class="wp-block-heading"><span id="toc39">2．短い一行を昔のif文へ戻す</span></h3>



<pre class="wp-block-code"><code>$name = $user?-&gt;getProfile()?-&gt;getName() ?? '名称未設定';</code></pre>



<p>これを見て分からなければ、Userがnullか、Profileがnullか、名前がnullかを一つずつ確認するif文へ書き戻します。何度か展開すると、短い構文のまま処理を追えるようになります。</p>



<h3 class="wp-block-heading"><span id="toc40">3．PHPの文法とフレームワークの機能を分ける</span></h3>



<ul class="wp-block-list"><li>PHPそのものの文法か</li><li>LaravelやSymfonyなどの機能か</li><li>Composerで入れたライブラリの機能か</li><li>そのシステム独自のクラスか</li></ul>



<p>例えば<code>#[Route(...)]</code>の<code>#[...]</code>はPHPの構文ですが、Routeの具体的な動作はフレームワーク側の機能です。この切り分けができると、何を調べればよいかが明確になります。</p>



<h2 class="wp-block-heading"><span id="toc41">おすすめの学習順序</span></h2>



<h3 class="wp-block-heading"><span id="toc42">最初に覚えるもの</span></h3>



<ol class="wp-block-list"><li>引数と戻り値の型</li><li><code>?</code>、<code>|</code>、null</li><li><code>??</code>と<code>?-&gt;</code></li><li>クラスのプロパティ型</li><li>コンストラクタの短縮記法</li><li><code>namespace</code>と<code>use</code></li></ol>



<h3 class="wp-block-heading"><span id="toc43">次に覚えるもの</span></h3>



<ul class="wp-block-list"><li>Composerと自動読み込み</li><li>例外処理</li><li>依存性注入</li><li><code>match</code></li><li>アロー関数</li><li>Enum</li></ul>



<p>Attributes、Intersection Type、Fibers、Reflectionなどは、必要になってから学べば十分です。通常のWebシステムを読むために、PHP 8.2の全機能を最初から覚える必要はありません。</p>



<h2 class="wp-block-heading"><span id="toc44">最新構文を全部使うことが良いコードではない</span></h2>



<p>PHP 8.2でも、次のような素直なコードは有効です。</p>



<pre class="wp-block-code"><code>function getDisplayName(?User $user): string
{
    if ($user === null) {
        return 'ゲスト';
    }

    $name = $user-&gt;getName();

    if ($name === '') {
        return '名称未設定';
    }

    return $name;
}</code></pre>



<p>型は明示しながらも、処理の流れは上から順番に追えます。一行へ詰め込んで読みにくくするより、適切に改行し、処理を分けるほうが保守しやすいコードになります。</p>



<ul class="wp-block-list"><li>型は積極的に付ける</li><li>省略して分かりにくくなるなら省略しない</li><li>一行に複数の判断を詰め込まない</li><li>目的のない高度な設計パターンを導入しない</li><li>コメントより分かりやすい関数名と変数名を優先する</li></ul>



<h2 class="wp-block-heading"><span id="toc45">PHP 5からPHP 8.2へ移行するときの注意</span></h2>



<p>書き方を新しくすることと、既存プログラムをPHP 8.2で動作させることは別の作業です。古いプログラムでは、削除された関数、引数や戻り値の扱い、警告からエラーへ変わった処理、動的プロパティ、古いライブラリなども確認する必要があります。</p>



<p>いきなり全面的に書き直すより、まずPHP 8.2でエラーや非推奨警告を確認し、動作を維持したまま問題を解消します。その後、型宣言やクラス設計を少しずつ追加するほうが安全です。</p>



<h2 class="wp-block-heading"><span id="toc46">まとめ</span></h2>



<p>PHP 5は、処理を順番に書き、値の解釈をPHPへ任せる柔軟な言語でした。PHP 8.2は、どの値を受け取り、何を返し、何を変更できるのかをコード上で明確にする方向へ進んでいます。</p>



<p>最新のコードに慣れる一番の方法は、構文を丸暗記することではありません。「この短い一行をPHP 5風に書くとどうなるか」と展開してみることです。型は説明書、<code>?</code>はnullの可能性、<code>??</code>は代替値、<code>?-&gt;</code>はnullなら停止、と日本語へ置き換えるだけでも、読める範囲は大きく広がります。</p>



<p>そして何より、PHP 8.2を使うからといって、すべてを短く、複雑に書く必要はありません。新しいPHPの安全性を活かしながら、処理の流れが追いやすい書き方を選ぶことが、実務では最も重要です。</p>



<h2 class="wp-block-heading"><span id="toc47">参考資料</span></h2>



<ul class="wp-block-list"><li><a href="https://www.php.net/manual/ja/migration80.new-features.php">PHP 8.0.xの新機能（PHP公式マニュアル）</a></li><li><a href="https://www.php.net/manual/ja/migration81.new-features.php">PHP 8.1.xの新機能（PHP公式マニュアル）</a></li><li><a href="https://www.php.net/manual/ja/migration82.new-features.php">PHP 8.2.xの新機能（PHP公式マニュアル）</a></li><li><a href="https://www.php.net/manual/ja/language.types.declarations.php">型宣言（PHP公式マニュアル）</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/f4rx9qxxwawymw7i2pld7hc5bbw6hyh4/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>DockerでYii2開発環境を最短構築！初心者でもできるMySQL・phpMyAdmin・Mailpit連携ガイド</title>
		<link>https://blog.takeho.com/build-your-yii2-development-environment-with-docker-in-no-time-a-beginners-guide-to-integrating-mysql-phpmyadmin-and-mailpit/</link>
					<comments>https://blog.takeho.com/build-your-yii2-development-environment-with-docker-in-no-time-a-beginners-guide-to-integrating-mysql-phpmyadmin-and-mailpit/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Fri, 12 Sep 2025 11:24:00 +0000</pubDate>
				<category><![CDATA[Yii2]]></category>
		<category><![CDATA[ウェブ・開発]]></category>
		<category><![CDATA[Composer]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[Mailpit]]></category>
		<category><![CDATA[MySQL]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=1275</guid>

					<description><![CDATA[本記事では、Windows環境で Yii2（Basicテンプレート） を用いたPHPアプリ開発用に、MySQL、phpMyAdmin、そしてテスト用SMTPサーバ Mailpit（メール受信UI付き）を Docker で [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>本記事では、Windows環境で <strong>Yii2（Basicテンプレート）</strong> を用いたPHPアプリ開発用に、<strong>MySQL</strong>、<strong>phpMyAdmin</strong>、そしてテスト用SMTPサーバ <strong>Mailpit</strong>（メール受信UI付き）を <strong>Docker</strong> で一気に構築する手順を解説します。プロジェクトのルートは次のパスに固定します。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>ルート</td><td><code>C:\Work\Workspace\Docker\example.com</code></td></tr><tr><td>フレームワーク本体</td><td><code>C:\Work\Workspace\Docker\example.com\htdocs</code></td></tr><tr><td>ドキュメントルート</td><td> <code>C:\Work\Workspace\Docker\example.com\htdocs\web</code></td></tr><tr><td>Webアクセス</td><td><a href="http://localhost:8080"> http://localhost:8080</a></td></tr><tr><td>phpMyAdmin</td><td><a href="http://localhost:8081">http://localhost:8081</a></td></tr></tbody></table></figure>



<p>この記事は <strong>「そのままコピペで動く」</strong> を重視しています。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4"><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">事前準備とディレクトリ構成</a></li><li><a href="#toc2" tabindex="0">docker-compose.yml の作成</a></li><li><a href="#toc3" tabindex="0">PHP（php-fpm）用 Dockerfile と設定</a></li><li><a href="#toc4" tabindex="0">Nginx の設定</a></li><li><a href="#toc5" tabindex="0">php.ini の最低限の調整</a></li><li><a href="#toc6" tabindex="0">コンテナの起動と初期化</a></li><li><a href="#toc7" tabindex="0">Yii2 のインストール（コンテナ内でComposer実行）</a></li><li><a href="#toc8" tabindex="0">DB接続設定（.env と Yii2設定）</a></li><li><a href="#toc9" tabindex="0">Mailpit（メール送信テスト）設定</a></li><li><a href="#toc10" tabindex="0">動作確認（Web・DB・Mail）</a></li><li><a href="#toc11" tabindex="0">トラブルシューティング</a><ol><ol><li><a href="#toc12" tabindex="0">ポート競合</a></li><li><a href="#toc13" tabindex="0">MySQLへ接続できない</a></li><li><a href="#toc14" tabindex="0">Windows で権限由来の書き込みエラー</a></li><li><a href="#toc15" tabindex="0">ファイルの改行コード</a></li><li><a href="#toc16" tabindex="0">古いコンテナやイメージの削除でエラー</a></li><li><a href="#toc17" tabindex="0">Composerが遅い/タイムアウト</a></li></ol></li></ol></li><li><a href="#toc18" tabindex="0">よく使うコマンド集</a></li><li><a href="#toc19" tabindex="0">あとがき</a><ol><ol><ol><li><a href="#toc20" tabindex="0">引用元</a></li></ol></li></ol></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">事前準備とディレクトリ構成</span></h2>



<p>以下のフォルダを作成します。</p>



<pre class="wp-block-code"><code>C:\Work\Workspace\Docker\example.com\
├─ htdocs\ ← Yii2のアプリ本体が入る（後で自動生成）
├─ docker\
│ ├─ php\
│ │ ├─ Dockerfile
│ │ └─ php.ini
│ └─ nginx\
│ └─ default.conf
└─ docker-compose.yml</code></pre>



<h2 class="wp-block-heading"><span id="toc2">docker-compose.yml の作成</span></h2>



<p><strong>ファイル:</strong> <code>C:\Work\Workspace\Docker\example.com\docker-compose.yml</code></p>



<pre class="wp-block-code"><code>services:
  nginx:
    image: nginx:1.27-alpine
    container_name: example_nginx
    ports:
      - "8080:80" # Web → http://localhost:8080
    volumes:
      - ./htdocs:/var/www/html
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
    depends_on:
      - php
    networks:
      - appnet

  php:
    build:
      context: ./docker/php
      dockerfile: Dockerfile
    container_name: example_php
    volumes:
      - ./htdocs:/var/www/html
    environment:
      PHP_MEMORY_LIMIT: 512M
      PHP_MAX_EXECUTION_TIME: 120
    networks:
      - appnet
  db:
    image: mysql:8.0
    container_name: example_db
    command: &#91;"mysqld", "--default-authentication-plugin=mysql_native_password", "--character-set-server=utf8mb4", "--collation-server=utf8mb4_0900_ai_ci"]
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: example
      MYSQL_USER: app
      MYSQL_PASSWORD: apppass
      TZ: Asia/Tokyo
    ports:
      - "3307:3306" # ローカルMySQLと衝突回避したい場合は3307→3306
    volumes:
      - dbdata:/var/lib/mysql
    networks:
      - appnet

  phpmyadmin:
    image: phpmyadmin:5-apache
    container_name: example_pma
    environment:
      PMA_HOST: db
      PMA_USER: root
      PMA_PASSWORD: root
    ports:
      - "8081:80" # phpMyAdmin → http://localhost:8081
    depends_on:
      - db
    networks:
      - appnet

  mailpit:
    image: axllent/mailpit:latest
    container_name: example_mailpit
    ports:
      - "1025:1025" # SMTP (アプリからの送信先)
      - "8025:8025" # Web UI → http://localhost:8025
    networks:
      - appnet

volumes:
  dbdata:

networks:
  appnet:
    driver: bridge</code></pre>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box not-nested-style cocoon-block-tab-caption-box"><div class="tab-caption-box-label block-box-label box-label"><span class="tab-caption-box-label-text block-box-label-text box-label-text">補足</span></div><div class="tab-caption-box-content block-box-content box-content">
<p>既存でMySQLがWindowsに入っている場合、<code>ports</code> を <code>"3307:3306"</code> のように <strong>ホスト側を3307</strong> にすると衝突しません。</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc3">PHP（php-fpm）用 Dockerfile と設定</span></h2>



<p><strong>ファイル:</strong> <code>C:\Work\Workspace\Docker\example.com\docker\php\Dockerfile</code></p>



<pre class="wp-block-code"><code>FROM php:8.3-fpm-alpine

# 必要拡張の導入
RUN apk add --no-cache \
    git zip unzip icu-dev oniguruma-dev libpng-dev libjpeg-turbo-dev libwebp-dev libzip-dev autoconf build-base \
 &amp;&amp; docker-php-ext-configure gd --with-jpeg --with-webp \
 &amp;&amp; docker-php-ext-install -j$(nproc) pdo_mysql intl mbstring gd zip exif bcmath opcache

# Composer
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer

WORKDIR /var/www/html</code></pre>



<h2 class="wp-block-heading"><span id="toc4">Nginx の設定</span></h2>



<p><strong>ファイル:</strong> <code>C:\Work\Workspace\Docker\example.com\docker\nginx\default.conf</code></p>



<pre class="wp-block-code"><code>server {
  listen 80;
  server_name example.com localhost;

  root /var/www/html/web;
  index index.php index.html;

  location / {
    try_files $uri $uri/ /index.php?$args;
  }

  location ~ \.php$ {
    include       fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass php:9000;
    fastcgi_buffers 16 16k;
    fastcgi_buffer_size 32k;
  }

  location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff2?|ttf)$ {
    expires 7d;
    add_header Cache-Control "public";
  }
}</code></pre>



<h2 class="wp-block-heading"><span id="toc5">php.ini の最低限の調整</span></h2>



<p><strong>ファイル:</strong> <code>C:\Work\Workspace\Docker\example.com\docker\php\php.ini</code></p>



<pre class="wp-block-code"><code>memory_limit = ${PHP_MEMORY_LIMIT}
max_execution_time = ${PHP_MAX_EXECUTION_TIME}
upload_max_filesize = 32M
post_max_size = 32M
date.timezone = Asia/Tokyo</code></pre>



<h2 class="wp-block-heading"><span id="toc6">コンテナの起動と初期化</span></h2>



<p><strong>PowerShell</strong> で次を実行します。</p>



<pre class="wp-block-code"><code>cd C:\Work\Workspace\Docker\example.com
# 初回ビルド＆起動
docker compose up -d --build

# 状態確認
docker compose ps</code></pre>



<ul class="wp-block-list">
<li><code>http://localhost:8080</code> → Nginx（Yii2はまだ未導入なので404/エラー想定）</li>



<li><code>http://localhost:8081</code> → phpMyAdmin（<code>root</code> / <code>root</code>、サーバ: <code>db</code> でログイン可）</li>



<li><code>http://localhost:8025</code> → Mailpit（受信ボックスUI）</li>
</ul>



<h2 class="wp-block-heading"><span id="toc7">Yii2 のインストール（コンテナ内でComposer実行）</span></h2>



<p><code>htdocs</code> に Yii2 Basic を展開します。</p>



<pre class="wp-block-code"><code># PHPコンテナに入る
docker compose exec php sh

# コンテナ内で実行（/var/www/html）
composer create-project yiisoft/yii2-app-basic .
exit</code></pre>



<p>作成後、Windows側では <code>C:\Work\Workspace\Docker\example.com\htdocs</code> にファイルが展開されます。Nginx の <code>root</code> は <code>/web</code> 配下なので、<code>web/index.php</code> が入口になります。</p>



<h2 class="wp-block-heading"><span id="toc8">DB接続設定（.env と Yii2設定）</span></h2>



<p>Yii2 Basic はデフォルトで <code>.env</code> はありませんが、設定を分けたい場合は導入も可能です。ここではシンプルに <code>config/db.php</code> を直接編集します。</p>



<p><strong>ファイル:</strong> <code>htdocs\config\db.php</code></p>



<pre class="wp-block-code"><code>&lt;?php
return &#91;
  'class' => 'yii\db\Connection',
  'dsn' => 'mysql:host=db;port=3306;dbname=example',
  'username' => 'app',
  'password' => 'apppass',
  'charset' => 'utf8mb4',
  'attributes' => &#91;
    PDO::ATTR_EMULATE_PREPARES => false,
    PDO::ATTR_STRINGIFY_FETCHES => false,
  ],
];</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><code>host</code> は <code><strong>db</strong></code>（docker-compose のサービス名）を指定します。ホストOSから直接接続する場合は <code>localhost:3307</code> です。</p>
</blockquote>



<p>初期テーブルを作る例として、マイグレーションを1本作ってみます（任意）。</p>



<pre class="wp-block-code"><code># PHPコンテナに入る
docker compose exec php sh

# マイグレーション作成
php yii migrate/create create_post_table

# 生成されたファイル(例: migrations/mYYYYMMDD_HHMMSS_create_post_table.php)を編集
exit</code></pre>



<p>サンプル（生成ファイルを編集）</p>



<pre class="wp-block-code"><code>public function safeUp()
{
  $this->createTable('{{%post}}', &#91;
    'id' => $this->primaryKey(),
    'title' => $this->string()->notNull(),
    'body' => $this->text(),
    'created_at' => $this->dateTime()->defaultExpression('CURRENT_TIMESTAMP'),
  ]);
}


public function safeDown()
{
  $this->dropTable('{{%post}}');
}</code></pre>



<pre class="wp-block-code"><code># もう一度入って実行
docker compose exec php sh
php yii migrate --interactive=0
exit</code></pre>



<h2 class="wp-block-heading"><span id="toc9">Mailpit（メール送信テスト）設定</span></h2>



<p>開発中のメールは <strong>本当に送らない</strong> のが安全です。Mailpit に流してUIで確認しましょう。</p>



<p><strong>ファイル:</strong> <code>htdocs\config\web.php</code>（<code>components</code> に <code>mailer</code> を追記）</p>



<pre class="wp-block-code"><code>'components' => &#91;
  // ... 既存設定 ...
  'mailer' => &#91;
    'class' => 'yii\swiftmailer\Mailer',
    'useFileTransport' => false, // falseでSMTPへ送信
    'transport' => &#91;
      'class' => 'Swift_SmtpTransport',
      'host' => 'mailpit',
      'port' => 1025,
      'encryption' => null,
    ],
  ],
],</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>もし Yii2 を <code>yiisoft/mailer</code> に置き換える場合は適宜設定を読み替えてください（SwiftMailerは非推奨化済みですが、Yii2 Basic既定の形のままでもMailpit連携は可能です）。</p>
</blockquote>



<p>テスト送信例（コントローラやコンソールから）</p>



<pre class="wp-block-code"><code>Yii::$app->mailer->compose()
         ->setFrom('no-reply@example.com')
         ->setTo('test@example.com')
         ->setSubject('Mailpit送信テスト')
         ->setTextBody('これはテスト本文です')
         ->send();</code></pre>



<p><code>http://localhost:8025</code> を開くと、受信メールが一覧表示されます。</p>



<h2 class="wp-block-heading"><span id="toc10">動作確認（Web・DB・Mail）</span></h2>



<ol class="wp-block-list">
<li><strong>Web</strong><br><code>http://localhost:8080</code> にアクセスして Yii2 のトップが表示されること。</li>



<li><strong>DB</strong><br><code>http://localhost:8081</code> → phpMyAdmin に <code>root/root</code> でログイン。<code>example</code> データベースに <code>post</code> テーブルができていること。</li>



<li><strong>Mail</strong><br>サンプルコードを実行し、<code>http://localhost:8025</code> の受信箱にメールが入ること。</li>
</ol>



<h2 class="wp-block-heading"><span id="toc11">トラブルシューティング</span></h2>



<h4 class="wp-block-heading"><span id="toc12">ポート競合</span></h4>



<p><code>8080</code>/<code>8081</code>/<code>8025</code>/<code>1025</code>/<code>3307</code> が使用中 → <code>docker-compose.yml</code> の <code>ports</code> 左側（ホスト側）を変更。</p>



<h4 class="wp-block-heading"><span id="toc13">MySQLへ接続できない</span></h4>



<ul class="wp-block-list">
<li><code>host</code> は <code><strong>db</strong></code>（Docker内部）か、ホスト接続では <code>localhost:3307</code> を指定。</li>



<li>初回起動直後はDBの立ち上がり待ちが必要。数秒待って再試行。</li>
</ul>



<h4 class="wp-block-heading"><span id="toc14">Windows で権限由来の書き込みエラー</span></h4>



<p><code>htdocs/runtime</code> と <code>htdocs/web/assets</code> の書き込み権限が必要。コンテナ側で <code>chmod -R 777 runtime web/assets</code>（開発用途限定）。</p>



<h4 class="wp-block-heading"><span id="toc15">ファイルの改行コード</span></h4>



<p>Nginxやシェル用ファイルは <strong>LF</strong> を推奨。VS Codeで <code>LF</code> へ変換。</p>



<h4 class="wp-block-heading"><span id="toc16">古いコンテナやイメージの削除でエラー</span></h4>



<p>例: <code>Error response from daemon: conflict: unable to delete ... image is being used by stopped container ...</code></p>



<pre class="wp-block-code"><code>docker ps -a # 停止中を含め一覧
docker rm &lt;CONTAINER_ID> # 停止中コンテナを削除
docker rmi &lt;IMAGE_ID> # 参照がなくなったらイメージ削除
# 一括停止・削除（このプロジェクト内）
docker compose down -v # コンテナ・ネットワーク・ボリューム削除
docker system prune -f # 不要なリソース掃除</code></pre>



<h4 class="wp-block-heading"><span id="toc17">Composerが遅い/タイムアウト</span></h4>



<p>一時的に <code>-vvv</code> で状況確認。社内プロキシ下では環境変数の設定を。</p>



<h2 class="wp-block-heading"><span id="toc18">よく使うコマンド集</span></h2>



<pre class="wp-block-code"><code># 起動・ビルド
cd C:\Work\Workspace\Docker\example.com
docker compose up -d --build

# 停止
docker compose down

# 停止＋ボリュームごと削除（DB初期化したいとき）
docker compose down -v

# ログ参照
docker compose logs -f nginx
docker compose logs -f php
docker compose logs -f db

# コンテナに入る
docker compose exec php sh

# 権限（開発用）
docker compose exec php sh -c "chmod -R 777 runtime web/assets"</code></pre>



<h2 class="wp-block-heading"><span id="toc19">あとがき</span></h2>



<p>ここまでで、<strong>Windows + Docker</strong> 上に <strong>Yii2 + MySQL + phpMyAdmin + Mailpit</strong> の開発環境が整いました。実運用では Mailpit の代わりに本番SMTPを使いますが、開発段階では誤送信防止のため <strong>Mailpit固定</strong> を強くおすすめします。また、MySQLのパスワードや公開ポートは本番用に必ず見直してください。必要に応じて <strong>SSL</strong> や <strong>Xdebug</strong> の導入、<strong>Nginxのキャッシュ/セキュリティヘッダ</strong> の調整などを行うと、より快適で安全な環境になります。</p>



<div class="wp-block-cocoon-blocks-blank-box-1 blank-box block-box">
<h5 class="wp-block-heading"><span id="toc20">引用元</span></h5>



<ul class="wp-block-list">
<li>Yii Framework 公式ドキュメント（Yii2 Basicテンプレート）<br><a rel="noopener" href="https://www.yiiframework.com/doc/guide/2.0/ja" target="_blank">https://www.yiiframework.com/doc/guide/2.0/ja</a></li>



<li>Docker 公式ドキュメント<br><a rel="noopener" href="https://docs.docker.com/" target="_blank">https://docs.docker.com/</a></li>



<li>Docker Compose 公式ドキュメント<br><a rel="noopener" href="https://docs.docker.com/compose/" target="_blank">https://docs.docker.com/compose/</a></li>



<li>MySQL 公式ドキュメント<br><a rel="noopener" href="https://dev.mysql.com/doc/" target="_blank">https://dev.mysql.com/doc/</a></li>



<li>phpMyAdmin 公式サイト<br><a rel="noopener" href="https://www.phpmyadmin.net/" target="_blank">https://www.phpmyadmin.net/</a></li>



<li>Mailpit（開発用SMTP &amp; Web UIツール）公式リポジトリ<br><a rel="noopener" href="https://github.com/axllent/mailpit" target="_blank">https://github.com/axllent/mailpit</a></li>



<li>Nginx 公式ドキュメント<br><a href="https://nginx.org/en/docs/">https://nginx.org/en/docs/</a></li>



<li>PHP 公式マニュアル（Docker Hub版）<br><a rel="noopener" href="https://hub.docker.com/_/php" target="_blank">https://hub.docker.com/_/php</a></li>



<li>Composer 公式サイト<br><a rel="noopener" href="https://getcomposer.org/" target="_blank">https://getcomposer.org/</a></li>
</ul>
</div>



<p></p>



<p></p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/build-your-yii2-development-environment-with-docker-in-no-time-a-beginners-guide-to-integrating-mysql-phpmyadmin-and-mailpit/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>PHP5に慣れ親しんだエンジニアが掲示板をSymfony４で作成してみる</title>
		<link>https://blog.takeho.com/an-engineer-familiar-with-php5-creates-a-bulletin-board-using-symfony-4/</link>
					<comments>https://blog.takeho.com/an-engineer-familiar-with-php5-creates-a-bulletin-board-using-symfony-4/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Sun, 23 Feb 2025 01:05:00 +0000</pubDate>
				<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Composer]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[掲示板]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=666</guid>

					<description><![CDATA[Symfony4はPHP5時代と比べるとモダンな機能やベストプラクティスが多数導入されています。ここでは、ユーザ認証（ログイン・登録）、管理者権限、アクセス制限、データベースの活用といった要素を取り入れた掲示板（BBS） [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Symfony4はPHP5時代と比べるとモダンな機能やベストプラクティスが多数導入されています。ここでは、ユーザ認証（ログイン・登録）、管理者権限、アクセス制限、データベースの活用といった要素を取り入れた掲示板（BBS）を段階的に実装してSymony4を習得していきます。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-6"><label class="toc-title" for="toc-checkbox-6">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">１．必要な環境の準備</a><ol><ol><ol><li><a href="#toc2" tabindex="0">Linuxサーバの前提</a></li><li><a href="#toc3" tabindex="0">ドメイン設定</a></li></ol></li></ol></li></ol></li><li><a href="#toc4" tabindex="0">２．Apacheによるドメイン設定</a></li><li><a href="#toc5" tabindex="0">３．Symfony4プロジェクトの作成と配置</a><ol><li><a href="#toc6" tabindex="0">１．プロジェクトディレクトリの作成</a></li><li><a href="#toc7" tabindex="0">２．Symfony4プロジェクトのインストール</a></li></ol></li><li><a href="#toc8" tabindex="0">４．データベース設定とエンティティ作成</a><ol><li><a href="#toc9" tabindex="0">4.1. データベース接続情報の設定</a></li><li><a href="#toc10" tabindex="0">4.2. ユーザエンティティの作成</a></li><li><a href="#toc11" tabindex="0">4.3. 掲示板投稿（Post）エンティティの作成</a></li><li><a href="#toc12" tabindex="0">4.4. マイグレーションの実行</a></li></ol></li><li><a href="#toc13" tabindex="0">５．ユーザ認証と管理者機能の実装</a><ol><li><a href="#toc14" tabindex="0">5.1. ログイン・登録フォームの作成</a></li><li><a href="#toc15" tabindex="0">5.2. security.yaml の設定</a></li><li><a href="#toc16" tabindex="0">5.3. 管理者権限の付与</a></li></ol></li><li><a href="#toc17" tabindex="0">６．掲示板機能（BBS）の実装</a><ol><li><a href="#toc18" tabindex="0">6.1. コントローラー作成</a></li><li><a href="#toc19" tabindex="0">6.2. Twigテンプレート作成</a></li></ol></li><li><a href="#toc20" tabindex="0">７．アクセス制限とセキュリティ対策</a><ol><ol><ol><li><a href="#toc21" tabindex="0">アクセス制限</a></li><li><a href="#toc22" tabindex="0">セキュリティ対策</a></li></ol></li></ol></li></ol></li><li><a href="#toc23" tabindex="0">８．パーミッション設定と本番環境向け最適化</a><ol><li><a href="#toc24" tabindex="0">8.1. ディレクトリのパーミッション設定</a><ol><li><a href="#toc25" tabindex="0">8.2. 本番環境向け設定の調整</a></li></ol></li></ol></li><li><a href="#toc26" tabindex="0">９．テストと動作確認</a><ol><li><a href="#toc27" tabindex="0">ローカルでの動作確認</a></li><li><a href="#toc28" tabindex="0">本番サーバでの確認</a></li><li><a href="#toc29" tabindex="0">トラブルシューティング</a></li></ol></li><li><a href="#toc30" tabindex="0">１０．まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">１．必要な環境の準備</span></h2>



<h5 class="wp-block-heading"><span id="toc2">Linuxサーバの前提</span></h5>



<ul class="wp-block-list">
<li><strong>OS</strong><br>Ubuntu、CentOS、Debianなど</li>



<li><strong>PHP</strong><br>Symfony4はPHP 7.1以上が必要です<br>※ <code>php -v</code> コマンドでバージョンを確認してください</li>



<li><strong>Composer</strong><br>PHPパッケージ管理ツール</li>



<li>Webサーバ<br>ApacheまたはNginx（ここではApacheの例を示します</li>



<li></li>
</ul>



<h5 class="wp-block-heading"><span id="toc3">ドメイン設定</span></h5>



<ul class="wp-block-list">
<li>DNSで「www.example.com」が対象サーバのIPを指していることを確認してください<br></li>
</ul>



<h2 class="wp-block-heading"><span id="toc4">２．Apacheによるドメイン設定</span></h2>



<p>ApacheでのVirtualHost設定例（/etc/apache2/sites-available/example.com.conf）</p>



<pre class="wp-block-code"><code>&lt;VirtualHost *:80>
    ServerName www.example.com
    DocumentRoot /var/www/example.com/public

    &lt;Directory /var/www/example.com/public>
        AllowOverride All
        Require all granted
    &lt;/Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
&lt;/VirtualHost></code></pre>



<p>設定後、以下のコマンドで有効化と再起動を行います</p>



<pre class="wp-block-code"><code>sudo a2ensite example.com
sudo a2enmod rewrite
sudo systemctl reload apache2</code></pre>



<h2 class="wp-block-heading"><span id="toc5">３．Symfony4プロジェクトの作成と配置</span></h2>



<h3 class="wp-block-heading"><span id="toc6">１．プロジェクトディレクトリの作成</span></h3>



<p>Webサーバのドキュメントルート（例：<code>/var/www/example.com</code>）に移動し、ディレクトリを作成</p>



<pre class="wp-block-code"><code>sudo mkdir -p /var/www/example.com
cd /var/www/example.com
sudo chown $(whoami):$(whoami) .</code></pre>



<h3 class="wp-block-heading"><span id="toc7">２．Symfony4プロジェクトのインストール</span></h3>



<p>Composerを使ってSymfony4プロジェクトを作成します。今回はDoctrineやセキュリティ機能が含まれるスターターキットを利用</p>



<pre class="wp-block-code"><code>composer create-project symfony/website-skeleton board_project</code></pre>



<p>※ プロジェクトディレクトリ（例：<code>board_project</code>）内に<code>public</code>フォルダが作成されます。<br>※ ApacheのDocumentRootは、この<code>public</code>フォルダを指定してください（もしくはVirtualHost設定でパスを調整）。</p>



<h2 class="wp-block-heading"><span id="toc8">４．データベース設定とエンティティ作成</span></h2>



<p>掲示板の情報（ユーザ情報、投稿内容など）をデータベースに保存します。ここではMySQLを例にしています。</p>



<h3 class="wp-block-heading"><span id="toc9">4.1. データベース接続情報の設定</span></h3>



<p>プロジェクトルートの <code>.env</code> ファイルを編集し、<code>DATABASE_URL</code> を設定してください。</p>



<pre class="wp-block-code"><code>DATABASE_URL=mysql://db_user:db_password@127.0.0.1:3306/db_name</code></pre>



<h3 class="wp-block-heading"><span id="toc10">4.2. ユーザエンティティの作成</span></h3>



<p>Symfony MakerBundleを利用してユーザエンティティを作成します。<br></p>



<pre class="wp-block-code"><code>php bin/console make:user</code></pre>



<p>プロンプトに従い、エンティティ名（例：<code>User</code>）や識別子（メールアドレスまたはユーザ名）、パスワードフィールド、既定のロール（通常ユーザには <code>ROLE_USER</code>、管理者には <code>ROLE_ADMIN</code>）を設定します。</p>



<h3 class="wp-block-heading"><span id="toc11">4.3. 掲示板投稿（Post）エンティティの作成</span></h3>



<p>投稿情報を保存するためのエンティティを作成します。</p>



<pre class="wp-block-code"><code>php bin/console make:entity Post</code></pre>



<p>以下のフィールドを追加すると良いでしょう：</p>



<ul class="wp-block-list">
<li><code>title</code> : string</li>



<li><code>content</code> : text</li>



<li><code>createdAt</code> : datetime</li>



<li><code>user</code> : ManyToOne（Userエンティティとの関連付け、投稿者情報）</li>
</ul>



<h3 class="wp-block-heading"><span id="toc12">4.4. マイグレーションの実行</span></h3>



<p>エンティティ作成後、マイグレーションを作成してデータベースに反映させます</p>



<pre class="wp-block-code"><code>php bin/console make:migration
php bin/console doctrine:migrations:migrate</code></pre>



<h2 class="wp-block-heading"><span id="toc13">５．ユーザ認証と管理者機能の実装</span></h2>



<p>Symfonyのセキュリティコンポーネントを利用して、ログイン・登録機能、アクセス制限を実装します。</p>



<h3 class="wp-block-heading"><span id="toc14">5.1. ログイン・登録フォームの作成</span></h3>



<p>Symfony MakerBundleを使用して、ログインフォーム認証を生成します</p>



<pre class="wp-block-code"><code>php bin/console make:auth</code></pre>



<p>また、ユーザ登録フォームも作成する場合は</p>



<pre class="wp-block-code"><code>php bin/console make:registration-form</code></pre>



<p>生成されたコントローラーやフォームクラスを適宜編集し、パスワードエンコーディングやCSRF保護の設定を確認してください。</p>



<h3 class="wp-block-heading"><span id="toc15">5.2. security.yaml の設定</span></h3>



<p>プロジェクトの <code>config/packages/security.yaml</code> を以下のように設定します。必要に応じてプロバイダやファイアウォールの設定を調整してください。</p>



<pre class="wp-block-code"><code>security:
    encoders:
        App\Entity\User:
            algorithm: bcrypt

    providers:
        app_user_provider:
            entity:
                class: App\Entity\User
                property: email

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            anonymous: true
            lazy: true
            provider: app_user_provider
            form_login:
                login_path: login
                check_path: login
                default_target_path: /
            logout:
                path: logout

    access_control:
        # 管理者エリアへのアクセスはROLE_ADMINに制限
        - { path: ^/admin, roles: ROLE_ADMIN }
        # 投稿作成・編集はログインユーザに制限
        - { path: ^/post/new, roles: ROLE_USER }
        - { path: ^/post/edit, roles: ROLE_USER }</code></pre>



<h3 class="wp-block-heading"><span id="toc16">5.3. 管理者権限の付与</span></h3>



<p>ユーザ登録時や管理画面で、管理者ユーザには <code>ROLE_ADMIN</code> を割り当てます。管理エリア用のコントローラー（例：<code>AdminDashboardController</code>）はルートを <code>/admin</code> で始め、上記の access_control により管理者以外はアクセスできないようにします。</p>



<h2 class="wp-block-heading"><span id="toc17">６．掲示板機能（BBS）の実装</span></h2>



<p>掲示板の基本機能として、投稿の一覧表示、投稿詳細、投稿作成、編集、削除などの機能を実装します。</p>



<h3 class="wp-block-heading"><span id="toc18">6.1. コントローラー作成</span></h3>



<p>例として、<code>BoardController</code> を作成し、以下のようなアクションを実装します。</p>



<pre class="wp-block-code"><code>&lt;?php
// src/Controller/BoardController.php
namespace App\Controller;

use App\Entity\Post;
use App\Repository\PostRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class BoardController extends AbstractController
{
    /**
     * @Route("/", name="board_index")
     */
    public function index(PostRepository $postRepository): Response
    {
        $posts = $postRepository->findBy(&#91;], &#91;'createdAt' => 'DESC']);
        return $this->render('board/index.html.twig', &#91;
            'posts' => $posts,
        ]);
    }

    /**
     * @Route("/post/{id}", name="board_view", requirements={"id"="\d+"})
     */
    public function view(Post $post): Response
    {
        return $this->render('board/view.html.twig', &#91;
            'post' => $post,
        ]);
    }

    /**
     * @Route("/post/new", name="board_new")
     */
    public function new(Request $request): Response
    {
        // ログインユーザのみ投稿可能
        $this->denyAccessUnlessGranted('ROLE_USER');

        $post = new Post();
        // フォーム作成、リクエストのハンドリング（例：Symfony Formコンポーネントを利用）
        // ※ ここでは簡易例として、フォーム処理の詳細は省略

        // 保存処理
        // $entityManager = $this->getDoctrine()->getManager();
        // $post->setCreatedAt(new \DateTime());
        // $post->setUser($this->getUser());
        // $entityManager->persist($post);
        // $entityManager->flush();

        return $this->render('board/new.html.twig', &#91;
            'post' => $post,
            // 'form' => $form->createView(),
        ]);
    }

    // 編集・削除アクションも必要に応じて実装
}</code></pre>



<h3 class="wp-block-heading"><span id="toc19">6.2. Twigテンプレート作成</span></h3>



<p><code>templates/board/</code> 配下に各ビュー用テンプレートを作成します。</p>



<p>例：<code>index.html.twig</code>（投稿一覧表示）</p>



<pre class="wp-block-code"><code>{% extends 'base.html.twig' %}

{% block title %}掲示板{% endblock %}

{% block body %}
    &lt;h1>掲示板投稿一覧&lt;/h1>
    {% for post in posts %}
        &lt;div class="post">
            &lt;h2>&lt;a href="{{ path('board_view', {id: post.id}) }}">{{ post.title }}&lt;/a>&lt;/h2>
            &lt;p>{{ post.content|raw }}&lt;/p>
            &lt;small>投稿者: {{ post.user.email }} ・ 投稿日: {{ post.createdAt|date('Y-m-d H:i') }}&lt;/small>
        &lt;/div>
        &lt;hr>
    {% else %}
        &lt;p>まだ投稿がありません。&lt;/p>
    {% endfor %}
    {% if is_granted('ROLE_USER') %}
        &lt;a href="{{ path('board_new') }}">新規投稿&lt;/a>
    {% else %}
        &lt;p>&lt;a href="{{ path('login') }}">ログイン&lt;/a>して投稿しましょう。&lt;/p>
    {% endif %}
{% endblock %}</code></pre>



<p>※ 各テンプレートは必要に応じてデザインやレイアウトを調整してください。</p>



<h2 class="wp-block-heading"><span id="toc20">７．アクセス制限とセキュリティ対策</span></h2>



<h5 class="wp-block-heading"><span id="toc21">アクセス制限</span></h5>



<ul class="wp-block-list">
<li><code>/admin</code> 以下のルートは <code>ROLE_ADMIN</code> のみアクセス可能とし、<code>security.yaml</code> の <code>access_control</code> で管理</li>



<li>投稿作成編集はログインユーザ（<code>ROLE_USER</code>）に限定するため、コントローラー内で <code>denyAccessUnlessGranted()</code> を利用</li>
</ul>



<h5 class="wp-block-heading"><span id="toc22">セキュリティ対策</span></h5>



<ul class="wp-block-list">
<li>フォームにCSRF保護を設定</li>



<li>ユーザ入力のバリデーションとサニタイズを実施</li>



<li>パスワードはエンコーダー（例：bcrypt）で暗号化</li>
</ul>



<h2 class="wp-block-heading"><span id="toc23">８．パーミッション設定と本番環境向け最適化</span></h2>



<h3 class="wp-block-heading"><span id="toc24">8.1. ディレクトリのパーミッション設定</span></h3>



<p>Symfonyはキャッシュやログを書き込むため、Apache（例：ユーザ www-data）が書き込めるようACLを設定します。</p>



<pre class="wp-block-code"><code>sudo setfacl -R -m u:www-data:rwX -m u:$(whoami):rwX var
sudo setfacl -dR -m u:www-data:rwX -m u:$(whoami):rwX var</code></pre>



<h4 class="wp-block-heading"><span id="toc25">8.2. 本番環境向け設定の調整</span></h4>



<p><code>.env</code> で環境変数を設定（例：<code>APP_ENV=prod</code>, <code>APP_DEBUG=0</code>）</p>



<p>キャッシュのウォームアップ</p>



<pre class="wp-block-code"><code>php bin/console cache:warmup --env=prod</code></pre>



<h2 class="wp-block-heading"><span id="toc26">９．テストと動作確認</span></h2>



<h3 class="wp-block-heading"><span id="toc27">ローカルでの動作確認</span></h3>



<p>ビルトインサーバを使ってローカルテスト</p>



<pre class="wp-block-code"><code>php bin/console server:run</code></pre>



<p>ブラウザで <code>http://127.0.0.1:8000</code> にアクセスし、投稿一覧やログイン・登録、投稿作成など各機能を確認してください。</p>



<h3 class="wp-block-heading"><span id="toc28">本番サーバでの確認</span></h3>



<p>DNS設定が完了していることを確認した上で、<code>http://www.example.com</code> へアクセスし、各機能が正しく動作するかテストします。</p>



<h3 class="wp-block-heading"><span id="toc29">トラブルシューティング</span></h3>



<p>エラーが発生した場合は、<code>var/log/</code> 内のログファイル（例：<code>prod.log</code> や <code>dev.log</code>）を確認し、エラーメッセージに基づいて対処してください。</p>



<h2 class="wp-block-heading"><span id="toc30">１０．まとめ</span></h2>



<p>今回のマニュアルでは、Symfony4を用いた掲示板アプリケーションの作成手順を、以下の要素を中心に解説しました</p>



<ul class="wp-block-list">
<li><strong>ユーザ認証・登録</strong><br>ログインフォームの生成とユーザエンティティ作成</li>



<li><strong>管理者権限</strong><br><code>ROLE_ADMIN</code> による管理エリアの制限</li>



<li><strong>アクセス制限</strong><br>各アクションへのアクセスをセキュリティコンポーネントで制御</li>



<li><strong>データベース連携</strong><br>Doctrineを利用したユーザ・投稿エンティティの管理</li>



<li><strong>掲示板機能</strong><br>投稿の一覧表示、詳細表示、投稿作成・編集機能の実装</li>
</ul>



<p>PHP5時代と比べ、Symfony4は構造化された設計や豊富なコンポーネントにより、拡張性・保守性に優れたアプリケーション開発が可能です。まずは本マニュアルの手順に沿って基本機能を実装し、そこからさらにカスタマイズや機能追加に挑戦してみてください。</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/an-engineer-familiar-with-php5-creates-a-bulletin-board-using-symfony-4/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>CodeIgniter3の環境を整える</title>
		<link>https://blog.takeho.com/qqohbx58gvay17fg1915s5b5z137q331/</link>
					<comments>https://blog.takeho.com/qqohbx58gvay17fg1915s5b5z137q331/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Sun, 01 Sep 2024 04:11:00 +0000</pubDate>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Composer]]></category>
		<category><![CDATA[インストール]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=304</guid>

					<description><![CDATA[CodeIgniter3は、4に比べcomposerやミドルウェア、名前空間に対応しておりませんが軽量で扱いやすく少ないリソースで高速に動作するフレームワークとして現在も人気があります。 ここではLinux環境へCode [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>CodeIgniter3は、4に比べcomposerやミドルウェア、名前空間に対応しておりませんが軽量で扱いやすく少ないリソースで高速に動作するフレームワークとして現在も人気があります。</p>



<p>ここではLinux環境へCodeIgniter3のフレームワークをセットアップする方法について説明します。</p>



<div class="wp-block-cocoon-blocks-caption-box-1 caption-box block-box not-nested-style cocoon-block-caption-box"><div class="caption-box-label block-box-label box-label"><span class="caption-box-label-text block-box-label-text box-label-text">補足</span></div><div class="caption-box-content block-box-content box-content">
<p>既にウェブサーバ・MｙSQLサーバのインストールやドキュメントルートが設定済である事を前提とします。</p>
</div></div>



<p>またドキュメントルートは</p>



<pre class="wp-block-code"><code>/var/www/html/codeigniter3/public</code></pre>



<p>とし、ホスト名はwww.example.comとします。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-8"><label class="toc-title" for="toc-checkbox-8">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">フレームワークの取得・設置</a></li><li><a href="#toc2" tabindex="0">ファイル構造の変更</a><ol><li><a href="#toc3" tabindex="0">ディレクトリの作成・ファイルの移動</a></li><li><a href="#toc4" tabindex="0">ディレクトリ設定の変更</a></li></ol></li><li><a href="#toc5" tabindex="0">設定ファイルの変更</a></li><li><a href="#toc6" tabindex="0">データベースの設定</a></li><li><a href="#toc7" tabindex="0">綺麗なURLにする</a></li><li><a href="#toc8" tabindex="0">ライブラリ・ヘルパーの自動読み込み</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">フレームワークの取得・設置</span></h2>



<p>サーバへターミナル等でログイン後、次のコマンドでディレクトリ移動します。</p>



<pre class="wp-block-code"><code># cd /var/www/html/</code></pre>



<p>　次のダウンロードサイトからCodeIgniter v3.2.0-dev (Current version)のリンクURLを取得します。</p>





<a rel="noopener" href="https://codeigniter.jp/user_guide/3/installation/downloads.html" title="CodeIgniter &#12398;&#12480;&#12454;&#12531;&#12525;&#12540;&#12489; &mdash; CodeIgniter 3.2.0-dev &#12489;&#12461;&#12517;&#12513;&#12531;&#12488;" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Fcodeigniter.jp%2Fuser_guide%2F3%2Finstallation%2Fdownloads.html?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">CodeIgniter &#12398;&#12480;&#12454;&#12531;&#12525;&#12540;&#12489; &mdash; CodeIgniter 3.2.0-dev &#12489;&#12461;&#12517;&#12513;&#12531;&#12488;</div><div class="blogcard-snippet external-blogcard-snippet"></div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://codeigniter.jp/user_guide/3/installation/downloads.html" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">codeigniter.jp</div></div></div></div></a>




<p>次のようにURLを指定してコマンドを実行します。</p>



<pre class="wp-block-code"><code># wget https://codeload.github.com/bcit-ci/CodeIgniter/zip/develop</code></pre>



<p>コマンド実行後developというファイルが取得されますが、このファイル名では何のファイルが不明なので次のように名前変更します。</p>



<pre class="wp-block-code"><code># mv develop develop.zip</code></pre>



<p>次にこのファイルを解凍します。</p>



<pre class="wp-block-code"><code># unzip develop.zip</code></pre>



<p>解凍後、<strong>CodeIgniter-develop</strong>のファイルの存在が確認できますが更に次のコマンドで名前変更します。</p>



<pre class="wp-block-code"><code># mv CodeIgniter-develop codeigniter3</code></pre>



<h2 class="wp-block-heading"><span id="toc2">ファイル構造の変更</span></h2>



<p>Codeigniter3内のファイル構造は次の通りです。</p>



<pre class="wp-block-preformatted">/var/www/html<br>└ codeigniter3<br>　├application(ディレクトリ)<br>　├build-release.sh<br>　├composer.json<br>　├contributing.md<br>　├DCO.txt<br>　├.editorconfig<br>　├.github(ディレクトリ)<br>　├.gitignore<br>　├index.php<br>　├license.txt<br>　├readme.rst<br>　├system(ディレクトリ)<br>　└tests(ディレクトリ)</pre>



<p>上記構造のうちドキュメントルートに設置する予定のindex.phpを起点とするとsystemディレクトリとapplicationディレクトリは公開する必要のないディレクトリになりキー情報やこの後設定するデータベースの接続情報など、外部に漏れてはいけない状況がドキュメントルート配下に配置環境の為、セキュアではありません。</p>



<p>尚、systemディレクトリやapplicationディレクトリ内のファイルは全て</p>



<pre class="wp-block-code"><code>&lt;?php
defined('BASEPATH') OR exit('No direct script access allowed');</code></pre>



<p>のように定数によるアクセス制限を掛けている為、直接アクセスする事はできない意味では安全ですが、これはPHPが正常に動作した場合に限り安全というには根本的な対策にはなっていません。</p>



<p>この対策としてsystemディレクトリとapplicationディレクトリをドキュメントルート配下でなない上位ディレクトリへ設置するように変更します。</p>



<h3 class="wp-block-heading"><span id="toc3">ディレクトリの作成・ファイルの移動</span></h3>



<pre class="wp-block-code"><code># mkdir public</code></pre>



<p><strong>public</strong>ディレクトリを作成します。</p>



<pre class="wp-block-code"><code>mv index.php ./public/</code></pre>



<p><strong>index.php</strong>を<strong>public</strong>ディレクトリ内へ移動します。</p>



<h3 class="wp-block-heading"><span id="toc4">ディレクトリ設定の変更</span></h3>



<p><strong>index.php</strong>を次のように変更します。</p>



<pre class="wp-block-code"><code>        // 93行目付近
	$system_path = '../system'; 

        // 110行目付近
	$application_folder = '../application';</code></pre>



<p>上記の更新にてドキュメントルート配下からその上位ディレクトリへの変更が完了となります。</p>



<h2 class="wp-block-heading"><span id="toc5">設定ファイルの変更</span></h2>



<p>ホスト名の指定など次のファイルを編集します。</p>



<pre class="wp-block-code"><code>application/config/config.php</code></pre>



<p>設定内容は次のようにキー名と値の構成になります。</p>



<pre class="wp-block-code"><code>$config&#91;キー名] = '値’</code></pre>



<p>次の表は初期設定の際に必要となる主要な設定情報の一覧になります。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>キー名</td><td>内容</td><td>設定値・例</td><td>説明</td></tr><tr><td>base_url</td><td>ベースURL</td><td>http://www.example.com/</td><td>インデックス名を省いたアクセスURLを記載します。</td></tr><tr><td>index_page</td><td>インデックス名</td><td>index.php<br>※表記させない場合は値は指定しない</td><td>インデックスページへのアクセス名（ベースURLは除く）</td></tr><tr><td>url_suffix</td><td>サフィックス</td><td>.html</td><td>URLの最後に付加する固定文字列</td></tr><tr><td>language</td><td>言語</td><td>japanese</td><td>言語名を指定</td></tr><tr><td>charset</td><td>文字コード</td><td>utf-8</td><td>出力するリソースの文字コード</td></tr><tr><td>composer_autoload</td><td>リソースのオートロード</td><td>TRUE / FALSE</td><td>composerパッケージの自動用読み込み</td></tr><tr><td>log_threshold</td><td>ログ出力設定</td><td>1～４</td><td>0：ロギングを無効にする、エラーロギングをオフにする<br>1：エラーメッセージ(PHPエラーを含む)<br>2：デバッグメッセージ<br>3：情報メッセージ<br>4：すべてのメッセージ</td></tr><tr><td>encryption_key</td><td>暗号キー</td><td>一意なる複雑な文字列</td><td>セッションやセキュリティクラスで使用する暗号・複合で使用するキー</td></tr><tr><td>sess_driver</td><td>セッションドライバ</td><td>files / database / redis / memcached</td><td>セッションの保存方法</td></tr><tr><td>csrf_protection</td><td>CSRF 保護</td><td>TRUE / FALSE</td><td>CSRFの脆弱性対策機能の有効・無効</td></tr></tbody></table></figure>



<h2 class="wp-block-heading"><span id="toc6">データベースの設定</span></h2>



<p>以下のファイルを編集しデータベース<strong>MySQL</strong>の接続情報を設定します。</p>



<pre class="wp-block-code"><code>application/config/database.php</code></pre>



<pre class="wp-block-code"><code>$db&#91;'default'] = array(
	'dsn'	=> '',
	'hostname' => 'ホスト名',
	'username' => 'DBユーザー名',
	'password' => 'パスワード',
	'database' => 'データ',
	'dbdriver' => 'mysqli',
	'dbprefix' => '',
	'pconnect' => FALSE,
	'db_debug' => (ENVIRONMENT !== 'production'),
	'cache_on' => FALSE,
	'cachedir' => '',
	'char_set' => 'utf8',
	'dbcollat' => 'utf8_general_ci',
	'swap_pre' => '',
	'encrypt' => FALSE,
	'compress' => FALSE,
	'stricton' => FALSE,
	'failover' => array(),
	'save_queries' => TRUE
);</code></pre>



<h2 class="wp-block-heading"><span id="toc7">綺麗なURLにする</span></h2>



<p>例えば複数の会員情報の一覧から特定の会員IDが5番のプロフィール詳細ページは一般的に次のようになります。</p>



<pre class="wp-block-code"><code>http:&#47;&#47;www.example.com/index.php/profile/view/id/5</code></pre>



<p>上記URLでは<strong>index.php</strong>のインデックスファイルの後にパラメータがスラッシュ区切りで構成される為、綺麗ではないので<strong>index.php</strong>を削除して綺麗にURLにする為、次のファイルを作成・編集します。</p>



<pre class="wp-block-code"><code>public/.htaccess</code></pre>



<pre class="wp-block-code"><code>RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 &#91;L]</code></pre>



<h2 class="wp-block-heading"><span id="toc8">ライブラリ・ヘルパーの自動読み込み</span></h2>



<p>常に使用するライブラリや頻繁に使用するヘルパーなどは自動読み込み設定する事でコントローラー内で都度読み込み宣言を記載する手間を省く事ができます。</p>



<p>次のファイルを編集します。</p>



<pre class="wp-block-code"><code>application/config/autoload.php</code></pre>



<pre class="wp-block-code"><code>// ライブラリ自動読み込み
$autoload&#91;'libraries'] = &#91;
  'database',
  'session',
];

// ヘルパー自動読み込み
$autoload&#91;'helper'] = &#91;
  'url',
  'form',
];</code></pre>



<p>これで環境の用意はひとまず完了です。</p>



<p>これ以外に必要な情報は別途ドキュメントを参照して編集してください。</p>





<a rel="noopener" href="https://codeigniter.jp/user_guide/3" title="CodeIgniter &#12518;&#12540;&#12470;&#12460;&#12452;&#12489; &mdash; CodeIgniter 3.2.0-dev &#12489;&#12461;&#12517;&#12513;&#12531;&#12488;" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Fcodeigniter.jp%2Fuser_guide%2F3?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">CodeIgniter &#12518;&#12540;&#12470;&#12460;&#12452;&#12489; &mdash; CodeIgniter 3.2.0-dev &#12489;&#12461;&#12517;&#12513;&#12531;&#12488;</div><div class="blogcard-snippet external-blogcard-snippet"></div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://codeigniter.jp/user_guide/3" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">codeigniter.jp</div></div></div></div></a>

]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/qqohbx58gvay17fg1915s5b5z137q331/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>CI4でソーシャルメディアログインを実装する</title>
		<link>https://blog.takeho.com/6yrfjcpbn2uicg2g9mlolhi84qccjt3w/</link>
					<comments>https://blog.takeho.com/6yrfjcpbn2uicg2g9mlolhi84qccjt3w/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Fri, 26 Jul 2024 04:59:55 +0000</pubDate>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Composer]]></category>
		<category><![CDATA[Social]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=86</guid>

					<description><![CDATA[Codeigniter4でfacebookやtwitterなどのソーシャルメディアログイン機能を実装する方法について説明します。 ソーシャルメディアログイン機能の実装にはHybridauthのライブラリを使用します。 H [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Codeigniter4でfacebookやtwitterなどのソーシャルメディアログイン機能を実装する方法について説明します。</p>



<p>ソーシャルメディアログイン機能の実装にはHybridauthのライブラリを使用します。</p>



<h3 class="wp-block-heading"><span id="toc1">Hybridauthライブラリのインストール</span></h3>



<p>次のコマンドを実行してHybridauthライブラリをインストールします。</p>



<pre class="wp-block-code"><code># composer require hybridauth/hybridauth</code></pre>



<h3 class="wp-block-heading"><span id="toc2">設定ファイルの作成</span></h3>



<p>Configディレクトリ内にProvider.phpを以下の内容で作成します。</p>



<pre class="wp-block-code"><code>&lt;?php
 
namespace App\Config;

use CodeIgniter\Config\BaseConfig;

class Provider extends BaseConfig
{
  public $configure = &#91;
    // callback
    'callback' => 'https://www.example.com/auth/authenticate',
    'providers' => &#91;
      // facebook.
      'Facebook' => &#91;
        'enabled' => true,
        'keys' => &#91;
          'id' => '&lt;アプリID>',
          'secret' => '&lt;秘密キー>',
        ],
      ],
      // twitter
      'Twitter' => &#91;
        'enabled' => true,
        'keys' => &#91;
          'key' => '&lt;キー>',
          'secret' => '&lt;秘密キー>',
        ],
      ],
    ],
  ];
}</code></pre>



<p>アプリID、キー、秘密キーは各SNSのデベロッパーサイトで発行された値を指定します。</p>



<h3 class="wp-block-heading"><span id="toc3">コントローラーの作成</span></h3>



<p>Authコントローラーを作成します。</p>



<pre class="wp-block-code"><code>&lt;?php

namespace App\Controllers;

use Hybridauth\Hybridauth;
use Hybridauth\HttpClient;

class Auth extends BaseController
{
  public function index()
  {
    return view('auth');
  } 
  
  public function authenticate($provider = false)
  {
    $userProfile = &#91;];
    $config = new \App\Config\Provider();
    try {
      $auth = new Hybridauth($config->configure);
      $adapter = $auth->authenticate($provider);
      $tokens = $adapter->getAccessToken();
      $userProfile = $adapter->getUserProfile();
      $adapter->disconnect();
      
    } catch (\Exception $e) {
      echo $e->getMessage();
    }

    return view('result', &#91;'userProfile' => $userProfile]);
  }</code></pre>



<h3 class="wp-block-heading"><span id="toc4">ビューの作成</span></h3>



<p>ビューはログインとログイン後の画面を用意します。</p>



<h4 class="wp-block-heading"><span id="toc5">auth.phpの作成</span></h4>



<p>Viewsディレクトリにauth.phpを以下の内容で作成します。</p>



<pre class="wp-block-code"><code>&lt;html>
&lt;head>
&lt;title>ソーシャルメディアログインテスト&lt;/title>

&lt;meta charset="utf-8">
&lt;meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">
&lt;/head>
&lt;body>
&lt;a href="&lt;?php echo base_url('auth/authenticate/Facebook') ?>">Facebookアカウントでログイン&lt;/a>&lt;br>
&lt;a href="&lt;?php echo base_url('auth/authenticate/Twitter') ?>">Twitterアカウントでログイン&lt;/a>
&lt;/body>
&lt;/html></code></pre>



<h4 class="wp-block-heading"><span id="toc6">result.phpの作成</span></h4>



<p>Viewsディレクトリにresult.phpを以下の内容で作成します。</p>



<pre class="wp-block-code"><code>&lt;html>
&lt;head>
&lt;title>ソーシャルメディアログインテスト&lt;/title>

&lt;meta charset="utf-8">
&lt;meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8">
&lt;/head>
&lt;body>
&lt;?php var_dump($userProfile) ?>
&lt;/body>
&lt;/html></code></pre>



<h3 class="wp-block-heading"><span id="toc7">動作確認</span></h3>



<p>次のURLへアクセスしてログインできるか確認します。</p>



<pre class="wp-block-code"><code>https:&#47;&#47;www.example.com/auth</code></pre>



<p>正常に動作していればソーシャルメディア上の登録ID、プロフィール名、サブネイル画像URLの表示が確認できます。</p>





<a rel="noopener" href="https://hybridauth.github.io" title="Hybridauth Social Login PHP Library" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Fhybridauth.github.io?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">Hybridauth Social Login PHP Library</div><div class="blogcard-snippet external-blogcard-snippet"></div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://hybridauth.github.io" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">hybridauth.github.io</div></div></div></div></a>

]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/6yrfjcpbn2uicg2g9mlolhi84qccjt3w/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ComposerでCodeigniter3とIon-Authライブラリを導入する方法</title>
		<link>https://blog.takeho.com/xxn7myyoarcxbmzhq3uzlkxour81aryh/</link>
					<comments>https://blog.takeho.com/xxn7myyoarcxbmzhq3uzlkxour81aryh/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Tue, 23 Jul 2024 08:30:37 +0000</pubDate>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Composer]]></category>
		<category><![CDATA[Ion-Auth]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=81</guid>

					<description><![CDATA[パッケージ管理ツールのComposerを使用してCodeigniter3のインストールした上で認証ライブラリであるIon-Authのセットアップ方法を説明しています。 目次 インストールCodeigniterのインストー [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>パッケージ管理ツールのComposerを使用してCodeigniter3のインストールした上で認証ライブラリであるIon-Authのセットアップ方法を説明しています。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-12"><label class="toc-title" for="toc-checkbox-12">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">インストール</a><ol><li><a href="#toc2" tabindex="0">Codeigniterのインストール</a></li><li><a href="#toc3" tabindex="0">Ion-Authのインストール</a></li></ol></li><li><a href="#toc4" tabindex="0">データベースの設定</a><ol><li><a href="#toc5" tabindex="0">コマンド実行ファイルの作成</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">インストール</span></h2>



<h3 class="wp-block-heading"><span id="toc2">Codeigniterのインストール</span></h3>



<p>次のComposerコマンドでCodeigniter3をインストールします、</p>



<pre class="wp-block-code"><code># composer create-project kenjis/codeigniter-composer-installer ＜インストール先ディレクトリ名＞</code></pre>



<h3 class="wp-block-heading"><span id="toc3">Ion-Authのインストール</span></h3>



<p>次のComposerコマンドでIon-Authをインストールします。</p>



<pre class="wp-block-code"><code># cd ＜インストール先ディレクトリ名＞
# php bin/install.php ion-auth 2</code></pre>



<h2 class="wp-block-heading"><span id="toc4">データベースの設定</span></h2>



<p>データベースのスキーマを管理する機能を追加します。</p>



<h3 class="wp-block-heading"><span id="toc5">コマンド実行ファイルの作成</span></h3>



<p>以下のファイルを/application/controllers/内に設置します。</p>



<pre class="wp-block-code"><code>Migrate.php
&lt;?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Migrate extends CI_Controller {

    function __construct()
    {   
        parent::__construct();
        if(! $this->input->is_cli_request()) {
            show_404();
            exit;
        }   
        $this->load->library('migration');
    }   

    function current()
    {   
        if ($this->migration->current()) {
            log_message('error', 'Migration Success.');
        } else {
            log_message('error', $this->migration->error_string());
        }   
    }   

    function rollback($version)
    {   
        if ($this->migration->version($version)) {
            log_message('error', 'Migration Success.');
        } else {
            log_message('error', $this->migration->error_string());
        }   
    }   

    function latest()
    {   
        if ($this->migration->latest()) {
            log_message('error', 'Migration Success.');
        } else {
            log_message('error', $this->migration->error_string());
        }   
    }

}
マイグレーションの設定
application/config/migration.phpを次のように編集します。

&lt;?
// マイグレーションを有効化
$config&#91;'migration_enabled'] = TRUE;
// シーケンス番号で管理
$config&#91;'migration_type'] = 'sequential';</code></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/xxn7myyoarcxbmzhq3uzlkxour81aryh/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Yii2のインストール・初期設定方法</title>
		<link>https://blog.takeho.com/y96x9r38o0zq6jvjcvs3znskqu59mymz/</link>
					<comments>https://blog.takeho.com/y96x9r38o0zq6jvjcvs3znskqu59mymz/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Thu, 18 Jul 2024 05:49:55 +0000</pubDate>
				<category><![CDATA[Yii2]]></category>
		<category><![CDATA[Composer]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=47</guid>

					<description><![CDATA[日本国では人気の無いフレームワークYii2 充実したライブラリと機能性の高さの割に大規模なウェブアプリケーションだけでなく小規模なウェブアプリケーションでも開発しやすいようディレクトリの構成変更が簡単にできる便利なフレー [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>日本国では人気の無いフレームワークYii2</p>



<p>充実したライブラリと機能性の高さの割に大規模なウェブアプリケーションだけでなく小規模なウェブアプリケーションでも開発しやすいようディレクトリの構成変更が簡単にできる便利なフレームワークです。</p>



<p>この記事ではYii2のインストールと開発開始までの初期設定方法を説明します。</p>



<h3 class="wp-block-heading"><span id="toc1">Yii2のインストール</span></h3>



<p>次のcomposerコマンドでYii2をインストールします</p>



<pre class="wp-block-code"><code># cd ＜インストールするディレクトリ＞
# composer create-project --prefer-dist yiisoft/yii2-app-basic ＜プロジェクト名＞</code></pre>



<h3 class="wp-block-heading"><span id="toc2">コード生成ツールGiiの許可設定</span></h3>



<p>Yii2にはGUI上で次のファイルを自動生成する機能があります。</p>



<ul class="wp-block-list">
<li><strong>Model Generator</strong><br>このジェネレータは、指定されたデータベーステーブルのActiveRecordクラスを生成します。</li>



<li><strong>CRUD Generator</strong><br>このジェネレータは、指定されたデータモデルのCRUD(作成、読み取り、更新、削除)操作を実装するコントローラとビューを生成します。</li>



<li><strong>Controller Generator</strong><br>このジェネレータは、1つまたは複数のコントローラアクションと対応するビューを持つ新しいコントローラクラスをすばやく生成するのに役立ちます。</li>



<li><strong>Form Generator</strong><br>このジェネレータは、指定されたモデルクラスの入力を収集するフォームを表示するビュースクリプトファイルを生成します。</li>



<li><strong>Module Generator</strong><br>このジェネレータは、Yiiモジュールに必要なスケルトンコードを生成するのに役立ちます。</li>



<li><strong>Extension Generator</strong><br>このジェネレータは、Yii拡張に必要なファイルを生成するのに役立ちます。</li>
</ul>



<p>Giiの使用は開発環境でのみ利用できるようIP制限を掛けて特定のアクセス元IPのみ許可する必要があります。</p>



<pre class="wp-block-code"><code>/config/web.php

    $config&#91;'bootstrap']&#91;] = 'gii';
    $config&#91;'modules']&#91;'gii'] = &#91;
        'class' => 'yii\gii\Module',
        // uncomment the following to add your IP if you are not connecting from localhost.
        'allowedIPs' => &#91;'127.0.0.1', '::1'], // ⇦コメントアウトを外しアクセス元IPを設定
    ];</code></pre>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box not-nested-style cocoon-block-tab-caption-box"><div class="tab-caption-box-label block-box-label box-label"><span class="tab-caption-box-label-text block-box-label-text box-label-text">注意</span></div><div class="tab-caption-box-content block-box-content box-content">
<p>Giiでのコード生成はローカルでの開発環境を前提としています。</p>



<p>別途外部サーバ等でGiiを使用する場合、コード生成先ディレクトリの権限の影響によりファイル生成が失敗しますのでご注意ください。</p>
</div></div>



<h3 class="wp-block-heading"><span id="toc3">デバックツールバーの許可設定</span></h3>



<p>デバックツールバーもGiiと同様にアクセス元IPの許可設定をします。</p>



<pre class="wp-block-code"><code>/config/web.php

    $config&#91;'bootstrap']&#91;] = 'debug';
    $config&#91;'modules']&#91;'debug'] = &#91;
        'class' => 'yii\debug\Module',
        // uncomment the following to add your IP if you are not connecting from localhost.
        'allowedIPs' => &#91;'127.0.0.1', '::1'], // ⇦コメントアウトを外しアクセス元IPを設定
    ];</code></pre>



<h3 class="wp-block-heading"><span id="toc4">データベース接続設定</span></h3>



<p>データベースの接続設定をします。</p>



<pre class="wp-block-code"><code>config/db.php

return &#91;
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=＜データベース名＞',
    'username' => '＜ユーザ名＞',
    'password' => '＜パスワード＞',
    'charset' => 'utf8',</code></pre>



<p>以上で完了です。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/y96x9r38o0zq6jvjcvs3znskqu59mymz/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
