20200515のPHPに関する記事は12件です。

MacでのLaravel6の環境構築でエラーが起こった件

Laravelのインストールコマンドでエラーが起こった

Composerの準備をこちらの記事の手順で完了した後、
下記のLaravelのインストールをコマンドを実行。

$ composer global require laravel/installer

すると、下記のエラーが発生しました。

Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - laravel/installer v3.0.0 requires ext-zip * -> it is missing from your system. Install or enable PHP's zip extension.
    - laravel/installer v3.0.1 requires ext-zip * -> it is missing from your system. Install or enable PHP's zip extension.
    - Root composer.json requires laravel/installer ^3.0 -> satisfiable by laravel/installer[v3.0.1, v3.0.0].

You are using a snapshot build of Composer 2, which may be the cause of the problem. Run `composer self-update --stable` and then try again. In case it solves the problem, please report an issue mentioning Composer 2.

Installation failed, deleting ./composer.json.

スクリーンショット 2020-05-15 20.44.15.jpg

原因

エラー文から「ext-zip」というものが足りていないということがわかった。
試行錯誤して調べるうちに、HomebrewでPHPがインストールできていない可能性が浮上した。

試したこと

そこで、下記のコマンドでHomebrewでのPHP7.4のインストールを実行。

$ brew install php@7.4

このコマンド完了は5分程かかりました。
その後、再度下記のLaravelのインストールをコマンドを実行。

$ composer global require laravel/installer

すると、以下のようにうまくインストールできました。
この前後の環境構築に関してはこちらの記事をにまとめてあるので是非参考にしてください。

スクリーンショット 2020-05-15 21.28.22.jpg

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

MacでのLaravel6の環境構築の手順

目的

  • 学習の記録のため。
  • 環境構築で少し苦戦したため。

環境構築の手順

  1. PHPのパッケージ管理プログラム「Composer」のインストール
  2. Laravelをインストールする(ここで少し苦戦した)
  3. プロジェクトを作成する

PHPのパッケージ管理プログラム「Composer」のインストール

Laraveではプログラミングをダウンロードしてインストールするのではなく
PHPのパッケージ管理プログラム「Composer」というものを利用する。

以下のリンクからcomposerのファイルを直接ダウンロードして配置する。
https://getcomposer.org/download/

Latest Snapshot をクリックすると
「ダウンロード」フォルダに「composer.phar」というファイルがダウンロードされる。

スクリーンショット 2020-05-15 16.07.25.jpg

スクリーンショット 2020-05-15 16.33.07.jpg

次にターミナルを起動。
ダウンロードフォルダに移動し/user/local/binに配置する。

$ cd ~/Downloads
$ sudo mv composer.phar /usr/local/bin/composer

パスワードを求められるので入力する。
composer.pharが/usr/local/bin/内にcomposerという名前で移動するコマンド。
これでいつでもcomposerが呼び出し可能になる。

最後にcomposerのパーミション(アクセス権)を設定する。

$ chmod a+x /usr/local/bin/composer

これで、composerが実行できるようになり、composerの準備は完了。

$ composer -V
Composer version 2.0-dev

上記のようになっていれば正常にインストールできている。

Laravelをインストールする

ターミナルを起動し以下を実行する。

$ composer global require laravel/installer

うまくいけばこれでLaravelがインストールされる。
下記エラーが出た場合はこちらの記事を参考にしてください。
スクリーンショット 2020-05-15 20.44.15.jpg

環境変数PATHの設定

環境変数PATHにインストールの場所を追記しないとLaravelのコマンドが使えない。
そこで、以下のコマンドを実行。

$ echo "export PATH=~/.composer/vendor/bin:$PATH" >> ~/.bash_profile
$ source ~/.bash_profile

すると、Laravelがコマンドとして認識されるようになる。

プロジェクトを作成する

アプリを作成するディレクトリに移動し以下のコマンドを実行する。

$ laravel new プロジェクト名

その後、以下のように作成したプロジェクトに移動しサーバーを起動するコマンドを実行。

$ cd プロジェクト名/
$ php artisan serve
Laravel development server started: http://127.0.0.1:8000

ここまで完了して、
http://localhost:8000/
にアクセスすると以下のようにLaravelのトップページが表示される。

Ctrlキー + 「C」 を押すとサーバーを停止できる。
以上で環境構築は完了です。
スクリーンショット 2020-05-15 22.02.52.jpg

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

コードから読み解くautoloadの仕組み ~第一層 大雑把にautoloaderの仕組みを理解しよう~

初めに

 皆さんcomposerから利用できるautoloadはご存じでしょうか?PHPのFWであるLaravelなどを使用される方の多くは使用されたことがあるかと思います。自分がautoloadと出会ったのはLaravelを触れたあたりで、初めて見たときは、
「いちいちrequireしなくてもほかのファイルの機能が使えるのは便利だな~。」
と思っていました。そして使っていくうちに、
「自分が勝手に追加したファイルもちゃんと読み込んでくれている!怖っ!!(謎の恐怖)」
と思うようになり、だんだんその恐怖心が強まってきたのである日気が済むまでautoloadの仕組みを調べました。そして調べた内容を自分のうちにとどめておいても仕方ないし、共有することで自分の考えがよりまとまったり、指摘による考えの修正が起こるかもしれないと思ったのでここへ書いてみました。
 もしautoloadの仕組みに興味があったり、自分と同じような恐怖感に覚えがあれば見てみてください。

この記事の流れ

autoloadの仕組みはこの記事を含めて3回に分けて紹介していこうと思っています。
ちなみにこの表の深さの欄が下に行けば行くほど扱う内容がニッチで複雑なものになっていきます。もしautoloadの仕組みをを軽く知りたいのであれば、一層だけでも十分だと思います。

深さ タイトル 内容
第一層 大雑把にautoloaderの仕組みを理解しよう autoloadで使用するファイルの働きからautoloadの仕組みを理解する
第二層 より深くautoloadの仕組みを理解しよう 第一層で扱ったファイルのコードからautoloadの仕組みを理解する
第三層 autoloadの完全理解を目指せ! 第一層、二層で扱えなかった事柄の補足

※第二層、三層は後日公開予定(2020/05/15時点)

扱うツールついて

第一~三層で扱うツールは以下の通りです。

ツール バージョン
Laravel 7.11.0
Composer 1.10.5

また、今回解説するComposerはLaravelインストール時に自動でインストールされたものであるので、Composerからautoloadを単体でインストールした場合と異なる点があるかもしれません。

第一層 大雑把にautoloadの仕組みを理解しよう

※タイトル詐欺のようで申し訳ないのですが、この記事ではファイル内のコードの説明をあまりしません。コードの説明は第二層で説明するので、第二層が公開されるまでしばしお待ちください。

aoutloadの構造

autoloadのファイル構造は以下のようになっています。//以降はファイルごとの役割を表しています。

autoload
▾ vendor/                  ※読み込むファイルのデータを格納
  ▾ composer/
      autoload_classmap.php //※
      autoload_files.php //※
      autoload_namespaces.php //※
      autoload_psr4.php //※
      autoload_real.php //autoloadの実行
      autoload_static.php //※
      ClassLoader.php //autoloadの実態
      installed.json
      LICENSE
  autoload.php //autoloadの入り口

ファイルごとの役割

次は役割ごとにファイルを分けて、ファイルの中で何が行われているか見てみます。あと実際のコードも載せておきます。

autoloadの入り口

autoloadの入り口はautoload.phpが担います。詳しく説明すると、phpの実行が行われる同時にautoloadの実行を行うautoload_real.phpのある関数へ処理を行うよう命令し、その結果を返します。コードを見るとこんな感じ

autoload.php
// autoload.php @generated by Composer
require_once __DIR__ . '/composer/autoload_real.php';
//autoload_real.phpのgetLoader()へautoloadの処理を実行するように命令し、結果を返す
return ComposerAutoloaderInit35d447dc237e2326be89407c57b5ca8b::getLoader(); 

ちなみにLaravelでautoload.phpはこんなところに書かれています。

/public/index.php
//ここへ読み込むことで、Laravelの処理のすべてでautloadが使用できるようになる
require __DIR__.'/../vendor/autoload.php'; 

autoloadの実行

autoload.phpで処理を命令されたgetLoader()は大きく分けて3つのことを行います。
1. 読み込むファイルのデータが格納されたファイル(autoload_static.phpなど)に、autoloadの実態があるファイル(ClassLoader.php)へデータを渡すよう命令。
2. autoloadを実行させる
3. その他必要なファイル(これらがどう必要かあまりわかっていません)を読み込み
実際のコードはこちら

autoload_real.php
public static function getLoader()
    {
        if (null !== self::$loader) {
            return self::$loader;
        }

        spl_autoload_register(array('ComposerAutoloaderInit35d447dc237e2326be89407c57b5ca8b', 'loadClassLoader'), true, true);
        self::$loader = $loader = new \Composer\Autoload\ClassLoader();
        spl_autoload_unregister(array('ComposerAutoloaderInit35d447dc237e2326be89407c57b5ca8b', 'loadClassLoader'));

        $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
        if ($useStaticLoader) {
            require_once __DIR__ . '/autoload_static.php';

//1. 読み込むファイルのデータが格納されたファイル(autoload_static.phpなど)に、`autoload`の実態があるファイル(ClassLoader.php)へデータを渡すよう命令 
          call_user_func(\Composer\Autoload\ComposerStaticInit35d447dc237e2326be89407c57b5ca8b::getInitializer($loader));
        } else {
            $map = require __DIR__ . '/autoload_namespaces.php';
            foreach ($map as $namespace => $path) {
                $loader->set($namespace, $path);
            }

            $map = require __DIR__ . '/autoload_psr4.php';
            foreach ($map as $namespace => $path) {
                $loader->setPsr4($namespace, $path);
            }

            $classMap = require __DIR__ . '/autoload_classmap.php';
            if ($classMap) {
                $loader->addClassMap($classMap);
            }
        }
//2. `autoload`を実行させる
        $loader->register(true);

        if ($useStaticLoader) {
            $includeFiles = Composer\Autoload\ComposerStaticInit35d447dc237e2326be89407c57b5ca8b::$files;
        } else {
            $includeFiles = require __DIR__ . '/autoload_files.php';
        }
//3. その他必要なファイル(これらがどう必要かあまりわかっていません)を読み込み
        foreach ($includeFiles as $fileIdentifier => $file) {
            composerRequire35d447dc237e2326be89407c57b5ca8b($fileIdentifier, $file);
        }

        return $loader;
    }
}

読み込むファイルのデータを格納

この役割を担うファイルは複数ありますが、開発環境によって使用するファイルが異なるので一度にすべてのファイルが実行されるわけではありません。また、ファイルごとに格納されたデータを紹介すると、

  • autoload_classmap.php ⇒ Laravelで使用するファイルの名前空間+クラス名をキー、そのファイルの絶対パスを値とした連想配列が格納されている。
  • autoload_files.php ⇒ Laravelを使用するうえで重要であろうファイル(自分はよくわかっていない)の配列が格納されている
  • autoload_namespaces.php ⇒ Laravelで使用するファイルの名前空間をキー、そのファイルの絶対パスを値とした連想配列が格納されている。
  • autoload_psr4.php ⇒ Laravelで使用するファイルの名前空間をキー、そのファイルの絶対パスを値とした連想配列が格納されている。
  • autoload_static.php ⇒ autoload_classmap.php +autoload_files.php+ autoload_namespaces.php + autoload_psr4.phpのデータが格納されている。現在のPHPのバージョンの関係上、autoloadではこれらの4つのファイルの代わりにこのファイルが実行される。

読み込むファイルのデータのされ方と、どのようにしてそのデータをautoloadの実態であるClassLoader.phpへ送っているのかを確認するために、autoload_static.phpのコードを見てみましょう。

autoload_static.php
//名前空間+クラス名をキー、絶対パスを値とした連想配列でデータを格納
public static $classMap = array (
        'App\\Console\\Kernel' => __DIR__ . '/../..' . '/app/Console/Kernel.php',
        'App\\Eloquent\\Contribute' => __DIR__ . '/../..' . '/app/Eloquent/Contribute.php',
        'App\\Exceptions\\Handler' => __DIR__ . '/../..' . '/app/Exceptions/Handler.php',
        'App\\Http\\Controllers\\Contribute' => __DIR__ . '/../..' .  '/app/Http/Controllers/Controller.php',
        'App\\Http\\Kernel' => __DIR__ . '/../..' . '/app/Http/Kernel.php',
        'App\\Http\\Middleware\\Authenticate' => __DIR__ . '/../..' . '/app/Http/Middleware/Authenticate.php',
        'App\\Http\\Middleware\\CheckForMaintenanceMode' => __DIR__ . '/../..' . '/app/Http/Middleware/CheckForMaintenanceMode.php',
        'App\\Http\\Middleware\\EncryptCookies' => __DIR__ . '/../..' . '/app/Http/Middleware/EncryptCookies.php',
        'App\\Http\\Middleware\\RedirectIfAuthenticated' => __DIR__ . '/../..' . '/app/Http/Middleware/RedirectIfAuthenticated.php',
        'App\\Http\\Middleware\\TrimStrings' => __DIR__ . '/../..' . '/app/Http/Middleware/TrimStrings.php',
        'App\\Http\\Middleware\\TrustProxies' => __DIR__ . '/../..' . '/app/Http/Middleware/TrustProxies.php',
        'App\\Http\\Middleware\\VerifyCsrfToken' => __DIR__ . '/../..' . '/app/Http/Middleware/VerifyCsrfToken.php',
        'App\\Model\\Contribute\\Input' => __DIR__ . '/../..' . '/app/Model/Contribute/Input.php',
        'App\\Providers\\AppServiceProvider' => __DIR__ . '/../..' . '/app/Providers/AppServiceProvider.php',
        'App\\Providers\\AuthServiceProvider' => __DIR__ . '/../..' . '/app/Providers/AuthServiceProvider.php',
        'App\\Providers\\BroadcastServiceProvider' => __DIR__ . '/../..' . '/app/Providers/BroadcastServiceProvider.php',
        'App\\Providers\\EventServiceProvider' => __DIR__ . '/../..' . '/app/Providers/EventServiceProvider.php',
        'App\\Providers\\RouteServiceProvider' => __DIR__ . '/../..' . '/app/Providers/RouteServiceProvider.php',
        'App\\TestModel' => __DIR__ . '/../..' . '/app/TestModel.php',
        'App\\User' => __DIR__ . '/../..' . '/app/User.php',
//省略

//ClassLoader.phpへデータを送信
public static function getInitializer(ClassLoader $loader)
    {
        return \Closure::bind(function () use ($loader) {
            $loader->prefixLengthsPsr4 = ComposerStaticInit35d447dc237e2326be89407c57b5ca8b::$prefixLengthsPsr4;
            $loader->prefixDirsPsr4 = ComposerStaticInit35d447dc237e2326be89407c57b5ca8b::$prefixDirsPsr4;
            $loader->prefixesPsr0 = ComposerStaticInit35d447dc237e2326be89407c57b5ca8b::$prefixesPsr0;
            $loader->classMap = ComposerStaticInit35d447dc237e2326be89407c57b5ca8b::$classMap;

        }, null, ClassLoader::class);
    }

autoloadの実態

ClassLoader.phpautoloaの実態ということもあって、やることは送られてきたデータをただ読み込むだけです。コードはこちら

ClassLoader.php
//ファイルを読み込む関数の呼び出し
public function register($prepend = false)
    {
        spl_autoload_register(array($this, 'loadClass'), true, $prepend);
    }

//データの読み込みとデータに基づくファイルの読み込み
public function loadClass($class)
    {
        if ($file = $this->findFile($class)) {
            includeFile($file); //ここはただ include $file してるだけ。

            return true;
        }
    }

//送られてきたデータを取得
public function findFile($class)
    {
        // class map lookup
        if (isset($this->classMap[$class])) {
            return $this->classMap[$class];
        }
        if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
            return false;
        }
        if (null !== $this->apcuPrefix) {
            $file = apcu_fetch($this->apcuPrefix.$class, $hit);
            if ($hit) {
                return $file;
            }
        }

        $file = $this->findFileWithExtension($class, '.php');

        // Search for Hack files if we are running on HHVM
        if (false === $file && defined('HHVM_VERSION')) {
            $file = $this->findFileWithExtension($class, '.hh');
        }

        if (null !== $this->apcuPrefix) {
            apcu_add($this->apcuPrefix.$class, $file);
        }

        if (false === $file) {
            // Remember that this class does not exist.
            $this->missingClasses[$class] = true;
        }

        return $file;
    }

終わりに

 今回の記事は以上となります。autoloadのファイルに書かれたコードはPHPのマジックメソッドを使って作られているので、解読は自力でもやりやすかったです。(それでも構造の理解は結構大変だった...)
この関数はどう使われているのか疑問に思った方は、後日公開される第二層の記事を楽しみにしてください。こちらほうは今回あっさりとしか紹介しなかった関数などについてじっくり紹介していきます。

あとLaravelに関しての記事もいくつか書いているので、こちらも読んでいただけるとありがたいです!!
Laravelのサービスコンテナのバインドと解決の仕組みが知りたい!
Laravelのsingletonメソッドの機能とその仕組みについて

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

[PHP] Composer のユーザーコマンドを対話式で実行したい(Scripts, TTY and Interactive Shell)

composerscripts 設定で、composer dev と打ったら PHP の Docker コンテナを起動して触りたい。
しかし、Interactive shell と表示され終了してしまう。Docker に限らず、他の対話式のシェル・スクリプトでも同じ。

「composer ユーザーコマンド 対話式 実行 tty interactive shell」でググってもドンピシャの Qiita 記事が出てこなかったので、自分のググラビリティとして。

TL; DR

[コマンド] < /dev/ttytty をコマンドとつなげる。
その際、Composer\\Config::disableProcessTimeout も設定しないと、composer制限で 300 秒で接続が切れてしまう

TS; DR

以下は composer test で PHPUnit を使ってユニット・テストの実行、composer compileBox3 を使って ./bin ディレクトリ設置用の Phar アーカイブの作成、そして composer dev で Docker の PHP7 コンテナを起動して対話式(bash シェル)で触れるようにしている例です。

composer.json
{
    ...
    "scripts" :{
        "test": [
            "./vendor/bin/phpunit --configuration=./config/phpunit.xml"
        ],
        "compile": [
            "./vendor/bin/box compile --config=./config/box.json"
        ],
        "dev": [
            "Composer\\Config::disableProcessTimeout",
            "docker run --rm --entrypoint='/bin/bash' --workdir='/app' -v $(pwd):/app php:7-cli < /dev/tty"
        ]
    }
}

参考文献

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

Laravelで多言語処理を行う

前提条件

eclipseでLaravel開発環境を構築する。デバッグでブレークポイントをつけて止める。(WindowsもVagrantもdockerも)
本記事は上記が完了している前提で書かれています
プロジェクトの作成もapacheの設定も上記で行っています

メッセージファイル作成

(1) /sample/resources/lang/en/messages.phpを作成

en/messages.php
<?php

return [
    'sample' => 'sample message'
];

(2) /sample/resources/lang/jaフォルダを作成
(3) /sample/resources/lang/ja/messages.phpを作成

ja/messages.php
<?php

return [
    'sample' => 'サンプルメッセージ'
];

Controllerにメソッド追加

(1) /sample/app/Http/Controllers/SampleController.phpに下記を追記
use Illuminate\Support\Facades\App;

(2) /sample/app/Http/Controllers/SampleController.phpにmultiLangメソッドを追記

    public function multiLang(Request $request)
    {
        if ($request->query('lang') === 'ja') {
            App::setLocale('ja');
        } else {
            App::setLocale('en');
        }
        $data = [
            'msg' => __('messages.sample'),
        ];
        return view('sample.multiLang', $data);
    }

App::setLocaleメソッドを使うことによってresources/langフォルダ内のどのフォルダを使うか設定することができます
App::setLocaleメソッドを呼ばなかった場合、config/app.php内のlocaleが使われます
__('messages.sample')でmessages.php内のsample要素の値を取得できます

(3) /sample/routes/web.phpに下記を追記
Route::get('sample/multi-lang', 'SampleController@multiLang');

viewの作成

/sample/resources/views/sample/multiLang.blade.phpファイル作成

multiLang.blade.php
<html>
    <head>
        <title>sample</title>
    </head>
    <body>
        <div>{{ $msg }}</div>
        <div>@lang('messages.sample')</div>
    </body>
</html>

bladeでは@lang('messages.sample')でmessages.php内のsample要素の値を取得できます
{{ __('messages.welcome') }}と書いても取得できます

動作確認

http://localhost/laravelSample/sample/multi-lang

sample message
sample message

http://localhost/laravelSample/sample/multi-lang?lang=ja

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

【Laravel】artisanコマンドで作成するファイルと手動で作成していいファイルのまとめ

はじめに

初Qiitaです。皆さん、Laravel使ってますか?

Webアプリを開発する時に、不慣れだとどのファイルがコマンドで作成すべきで、
どのファイルが手動で作っても大丈夫というのを確認しつつ進めたりして、
手間取ってしまいませんか?

Laravel初心者の私がちょうどそんな状態で、
こういう切り口で説明してくれるページがあるといいなぁ、と思い。
探したんですが見つからなかったので、今回は自分でまとめてみたいと思います。

artisanコマンドで作るファイル

  • マイグレーションファイル (2020_05_XX_XXXXXX_create_hoge_table.php)
  • コントローラーファイル (HogeController.php)

マイグレーションファイル

DBにテーブルを追加(モデルを追加)する時に作成します。

hogeがモデル名です。

php artisan make:model hoge --migration

/database/migrations/内にマイグレーションファイルができるので編集します。
終わったらマイグレーションを実行します。

php artisan migration

これでDBにテーブルが追加されます。

ちなみに、使うモデルはコントローラー内で呼び出してから使うと幸せになれます。(必須ではないですが)

use App\Hoge;

コントローラーファイル

このファイルにアクション(メソッド)を追加していきます。
HogeControllerがコントローラー名です。

php artisan make:controller HogeController

/Http/Controllers/内にコントローラーファイルができるので編集します。

artisanコマンドは不要なファイル

こちらはコマンド操作がいらない、最初からある or 手動で作成してもよいファイルです。

  • ルーティングファイル(/routes/web.php)
  • ビューファイル(index.blade.php)

ルーティングの追加

インストール時から存在している /routes/web.php に追記していきましょう。

ビューファイル

htmlを記載するためのファイルですね。
/resources/views/内に好きに作ってOKです。
階層も深くできるので、機能ごとにディレクトリにまとめるのがよいでしょう。

ちなみに私はSmartyの名残でテンプレートファイルと読んでいますが、ビューファイルと呼ぶ方が今どきっぽいですね。

おまけ 個人的によく使うartisanコマンド

サーバーの起動。

php artisan serve

そして、コマンドラインでDBの内容確認できて便利なtinker。

php artisan tinker

おわりに

以上です。
ここちゃうやんけ!的なツッコミ大歓迎です。

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

『HTTP ERROR 500』が出た時の対処法(さくらインターネット)

WordPressをインストールしようとした時に・・・
このページは動作していません.jpg
こいつで時間を浪費したので僕が試した解決策をご紹介します。

やること

さくらのサーバーにアクセスして、PHP設定の編集→php.ini設定ファイルの編集に「error_reporting 8191」と入力だけ。
c9087e46604c619a0013ad4b8fba8d9a-550x489.png
(めんどくさいと思ってもやらないとかいけつできない)

そして再度アクセスすると・・・
エラー文が表示されているのでそれに対処するだけ!

ちなみに僕は

PHP Parse error: syntax error, unexpected 'DB_HOST' (T_STRING), expecting ")' in /home/xxxxxxxxx/xxxxxxxxx/wp-config.php on line 38でした。

調べてみると・・・「'」(シングルクォーテーション)の入れ忘れ。笑

僕はこれで無事に解決できました。
Image 2020-05-15 at 4.28.30 PM.png

是非試してみてください。

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

Laravelでプロジェクトの作成フロー

新規プロジェクト

ターミナル
# バージョン指定なし (最新版をインストール, 初期値でmysqlを利用する)
$ composer create-project --prefer-dist laravel/laravel プロジェクト名

# バージョン指定あり (初期値でmysqlを利用する)
$ composer create-project --prefer-dist "laravel/laravel=5.5.*" sampleproject

#書き方はいろいろ
$ composer create-project laravel/laravel sampleproject --prefer-dist "6.0.*"

初期設定

タイムゾーンを日本に変更

タイムゾーンの変更

config/app.php
'timezone' => 'UTC',
#UTCをAsia/Tokyoに変更
'timezone' => 'Asia/Tokyo',

言語を日本に変更

config/app.php
'locale' => 'en',
#enをjaに変更
'locale' => 'ja',

DBの文字設定

config/database.php
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',

#mb4を消す(顔文字を不要)
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',

デバックバーのインストール

ターミナル
$ composer require barryvdh/laravel-debugbar

画面上に非表示にするために、.envファイルを変更する

.env
APP_DEBUG=true
#falseに変更する
APP_DEBUG=false

これでも画面に残っている場合は、キャッシュを消す

ターミナル
$php artisan cache:clear
$php artisan config:clear

DBの設定変更

.envファイルの下記のDB設定における、DATABASE名、USERNAM名、PWを設定していく

.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=

MAMPでDBの作成

Image from Gyazo

MAMPでUSERを作成

Image from Gyazo

作成した情報を記述する

.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_task
DB_USERNAME=laravel_user
DB_PASSWORD=password

接続できるか確認

ターミナル
$php artisan migrate

成功した場合は、無事にDBに接続できている。

MAMPのDBをSeaquel Proで確認する場合

ユーザー名:root
パスワード:root
データベース:
ソケット:/Applications/MAMP/tmp/mysql/mysql.sock
スクリーンショット 2020-05-14 12.31.00.png

これで接続すれば、確認ができる

Laravel-ui認証

マニュアルページを開く

laravel/uiパッケージをインストール
$composer require laravel/ui:^1.0 --dev
フロントエンドのスカフォールドをインストール
// 基本的なスカフォールドを生成
php artisan ui bootstrap
php artisan ui vue
php artisan ui react

// ログイン/ユーザー登録スカフォールドを生成
php artisan ui bootstrap --auth
php artisan ui vue --auth
php artisan ui react --auth
依存パッケージのインストール
$ npm install && npm run dev

エラーメッセージを日本語化

下記リンクを開く
https://github.com/minoryorg/laravel-resources-lang-ja

ファイルをダウンロード
Image from Gyazo

ダウンロードしたフォルダを開くと、jaというフォルダが存在する
スクリーンショット 2020-05-15 11.05.12.png

resources/langフォルダに、ダウンロードしたjaフォルダを追加
スクリーンショット 2020-05-15 11.10.13.png

これで日本語されています
passwordなど英語表記のものを日本語にするには、

validation.php
'attributes' => [],
//最下部のattributesにパスワードの項目を追加する

'attributes' => [
        'password'=>'パスワード'
    ],

ターミナルで開いておきたい

ターミナル(タブ1)
$ npm run development -- --watch
ターミナル(タブ2):ローカルサーバー
$ php artisan serve
ターミナル(タブ3):コマンド実行用
$ 何かターミナルコマンド入力する際に利用する

MVCの操作

ここからMVCコントローラーの操作を進めていく

ルーティング

web.php
#型
Route::get('url', 'コントローラー@アクション');

#例
Route::get('tests/test', 'TestController@index');

#リソースを利用して、記述短縮
Route::resource('photos', 'PhotoController');

マニュアル:
https://readouble.com/laravel/6.x/ja/controllers.html

TestController@indexでコントローラーを紐づけている。

routingの一覧を確認
//ターミナルで確認
$ php artisan route:list

//ファイルで確認
$ php artisan route:list > route.text

コントローラー

コントローラーとモデルの作成

ターミナル
#モデル単体を作成
$php artisan make:model Models/Test

# モデル、マイグレーションファイル、コントローラーを同時に作成
$ php artisan make:model Models/Test -mc

#コントローラーの作成(基本的なアクション含む)
php artisan make:controller PhotoController --resource

Models/Test Modelsフォルダの中で、Test.phpを作成
-mcはマイグレーションファイルとコントローラーを同時に作成するオプション

マイグレーションファイルの作成

ターミナル
$php artisan make:migration create_tests_table

マイグレーションの記述

マニュアル
https://readouble.com/laravel/6.x/ja/migrations.html
マニュアルを参考に、カラム型、制限をかけて、カラム修飾子で詳細に設定する

マイグレーションを実行

マイグレーションを実行
$ php artisan migrate
マイグレーションの履歴を確認
$php artisan migrate:status
マイグレーションをロールバックする
$php artisan migrate:rollback --step:5

コントローラーの作成

ターミナル
$ php artisan make:controller TestController

コントローラーの記述

TestController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Test; #モデルとコントローラーを紐づける

class TestController extends Controller
{
    //
    public function index() #railsの場合はdef indexだが、 laravelの場合はpublic function index() 
    {
        $values = Test::all(); #モデルを介して、DBから情報を取得
        dd($values); #railsのbinding.pryのように取得した内容を確認できる。
        return view('tests.index', compact('values')); #ここでどのviewなのか指定して紐づける
        #つまり、最後にどのviewにどの値を持っていくか指定する。
    }
}

View

ログインしているか、していないで表示切り替え

マニュアル
https://readouble.com/laravel/6.x/ja/blade.html

認証によって表示切り替え
@auth
    // ユーザーは認証済み
@else 
    // 
@endauth

@guest
    // ユーザーは認証されていない
@endguest

aタグにrouteのリンクを埋め込む

routeのnameを記述することで、リンク先のURLを簡単に指定できる

<a href={{ route(contacts.index) }}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaravelでDatabaseTransactionsを利用してDBにアクセスするテストを高速に実行する。

概要

タイトルでほぼ終わってる感がありますが、DatabaseTransactionsトレイトを利用すると、DBへの書き込みテストを高速に行うことができます。

説明

DBに対するテストをする場合にRefreshDatabaseを利用する例をよく見ますが、
RefreshDatabaseは内部的にphp artisan migrate:freshが行われており、データベースの作り直しから始まるので、Migrationが増えてくるとかなり時間が掛かるようになってきます。

DatabaseTransactionsを利用するとテストのsetup時点でbeginTransactionして、tearDown時にrollbackしてくれるので、データベースを作り直すことが無く、高速に実行できます。

デメリットは?

データベースを作り直すわけではないので、完全に実行前に戻るわけではありません。
例えばautoIncrementなidを持つtableなどに対してテストを行った場合は、たとえrollbackしても自動採番の数字は戻りません。そこら辺を理解した上で利用できる状況であれば、とても高速です。

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

PHP - Lighttpdでのファイルのアップロードサイズ変更

はじめに

PHPはPHPでもphp-cgiを使用した時のメモ

Apache向けが多いのでLighttpd向けに
組み込みLinuxで軽量・簡単にWEBアプリケーションを作る人の選択肢が多いと思われます。
スタンドアロンな製品に簡易操作メニューを作りたい場合とか

調べた時の一生忘れていけない覚書

※ 次の製品を作るころには忘れてる、ので書いておく

・lighttpdでは.htaccessは使えない
・lighttpd.confではphp.iniで設定する内容を記述できない

環境・条件

事前にLighttpdでPHP(php-cgi)が動いていること
(phpコマンドが入っていなくてもよい)

WEBサーバー
lighttpdを使用

PHP version
ver 5.6

php.iniを修正

php.iniは5.6デフォルトから必要なパラメータだけを修正しました。

デフォルトのphp.ini(5.4~5.6、7.0~7.3まであります)
ここのページの下あたりにあります。
https://webhost.ai/download-default-php-ini-files/
たくさんあるので、ローカルに保存しておけば、いつの日か役に立つかも

デフォルト128Mから256Mに変更
ファイルサイズが大きいと時間がかかるのでタイムアウト時間を変更

以下のパラメターで変更可能

php.ini
memory_limit = 256M
post_max_size = 256M
upload_max_filesize = 256M
default_socket_timeout = 180

ただし変更する場合は以下の条件を満たすこと
イコールでもOK

memory_limit >= post_max_size >= upload_max_filesize

修正した個所の解説

php.ini
; L411 (default 128M
; メモリ使用量の上限 単位をつけること
memory_limit = 256M

L679 (default 128M
; POSTデータの最大サイズ 単位をつけること
post_max_size = 256M

L811(default 128M
; 1ファイルあたりの最大アップロードサイズ 単位をつけること
upload_max_filesize = 256M

L839 (default 60
; タイムアウト時間の変更 単位は秒何もつけない
; 大きいデータは時間掛かるのでデフォルト60だと短い場合が発生してしまうことがある
default_socket_timeout = 180
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MacでのLaravel6の環境構築

目的


  • 学習の記録のため。
  • 環境構築で少し苦戦したため。

環境構築の手順


  1. PHPのパッケージ管理プログラム「Composer」のインストール
  2. Laravelをインストールする
  3. アプリケーションを作成する

1. PHPのパッケージ管理プログラム「Composer」のインストール


Laraveではプログラミングをダウンロードしてインストールするのではなく
PHPのパッケージ管理プログラム「Composer」というものを利用する。

以下のリンクからcomposerのファイルを直接ダウンロードして配置する。
https://getcomposer.org/download/

Latest Snapshot をクリックすると
「ダウンロード」フォルダに「composer.phar」というファイルがダウンロードされる。

スクリーンショット 2020-05-15 16.07.25.jpg

スクリーンショット 2020-05-15 16.13.40.jpg

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

MacでLaravel6の環境構築で苦戦したのでまとめます。

少しエラーもでて苦戦したのでまとめます


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