Blade ではデフォルトでカスタムクラスを呼び出すことができないため、別途設定する必要があります。
Laravel ではデフォルトでクラスをオートロードしていますが、その設定は app.php に記述されています。
'School' => App\School::class,
'aliases' => [
'App' => Illuminate\Support\Facades\App::class,
'Arr' => Illuminate\Support\Arr::class,
'Artisan' => Illuminate\Support\Facades\Artisan::class,
'Auth' => Illuminate\Support\Facades\Auth::class,
'Blade' => Illuminate\Support\Facades\Blade::class,
'Broadcast' => Illuminate\Support\Facades\Broadcast::class,
'Bus' => Illuminate\Support\Facades\Bus::class,
'Cache' => Illuminate\Support\Facades\Cache::class,
'Config' => Illuminate\Support\Facades\Config::class,
'Cookie' => Illuminate\Support\Facades\Cookie::class,
'Crypt' => Illuminate\Support\Facades\Crypt::class,
'DB' => Illuminate\Support\Facades\DB::class,
'Eloquent' => Illuminate\Database\Eloquent\Model::class,
'Event' => Illuminate\Support\Facades\Event::class,
'File' => Illuminate\Support\Facades\File::class,
'Gate' => Illuminate\Support\Facades\Gate::class,
'Hash' => Illuminate\Support\Facades\Hash::class,
'Lang' => Illuminate\Support\Facades\Lang::class,
'Log' => Illuminate\Support\Facades\Log::class,
'Mail' => Illuminate\Support\Facades\Mail::class,
'Notification' => Illuminate\Support\Facades\Notification::class,
'Password' => Illuminate\Support\Facades\Password::class,
'Queue' => Illuminate\Support\Facades\Queue::class,
'Redirect' => Illuminate\Support\Facades\Redirect::class,
'Redis' => Illuminate\Support\Facades\Redis::class,
'Request' => Illuminate\Support\Facades\Request::class,
'Response' => Illuminate\Support\Facades\Response::class,
'Route' => Illuminate\Support\Facades\Route::class,
'Schema' => Illuminate\Support\Facades\Schema::class,
'Session' => Illuminate\Support\Facades\Session::class,
'Storage' => Illuminate\Support\Facades\Storage::class,
'Str' => Illuminate\Support\Str::class,
'URL' => Illuminate\Support\Facades\URL::class,
'Validator' => Illuminate\Support\Facades\Validator::class,
'View' => Illuminate\Support\Facades\View::class,
],
Laravel で Facade でよく利用される名称に気づくでしょう。
カスタムクラスをアプリ全体で利用する場合は、 app.php の 「aliases」
に追加します。
例えば、app/Item.php クラスファイルが以下のように税込計算の static 関数が定義してあるとします。
class Item {
public static function taxPrice($price, $tax) {
return $price * (1 + $tax);
}
}
この Item.php を app.php にネームスペース記述で追加します。
'aliases' => [
....
'Item' => App\Item::class,
],
これで、アプリ全体で利用可能になり Blade ファイルからも利用することができます。
{{ Item::taxPrice(100, 0.1) }}
アプリ全体で利用できるのは便利ですが毎回ローディングされるため、たくさんのカスタムファイルや大きなファイルはメモリ消費や負荷を念頭においた方がよいでしょう。
さほど利用しない機能のクラスは、コントローラーで都度呼び出したりミドルウェアなどで処理することが基本となります。 また、Blade でクラスを多用しすぎると MVC の分離ができなるなるのも注意が必要です。
通常 Git でブランチの変更を行うような管理の場合、リモートとブランチ名を指定します。
$ git push -u origin master
ただ、一人で開発する場合、大規模でない限りブランチを利用することはあまりないと思うので、
$ git push
のようにブランチ指定せずに実行もよいかも知れません。
これは、現在のブランチ名がリモートと同じという条件でなりたちます。
現在の状態をデフォルトとする設定をします。
$ git config --global push.default current
$ git config --global pull.default current
config を確認すると、 push.default が current に設定されます。
$ git config -l
...
push.default=current
pull.default=current
...
これで、ブランチ指定せずに現在の状態で pull、 push できるようになりました。
ただしグループ開発するような時は、省略はしない方がよいでしょう。
git pull や git push できなくなったとき、ブランチの間違いやファイルがコンフリクトしている可能性があります。
$ git pull origin master
warning: Pulling without specifying how to reconcile divergent branches is
discouraged. You can squelch this message by running one of the following
commands sometime before your next pull:
...
git pull は fetch と merge を両方実行しているので、コンフリクトが発生するとエラーになります。
$ git fetch
$ git merge origin/master
$ git push origin master
...
fatal: refusing to merge unrelated histories
...
マージを実行するとコンフリクトしています
$ git merge --allow-unrelated-histories origin/master
CONFLICT (add/add): Merge conflict in README.md
Auto-merging README.md
CONFLICT (add/add): Merge conflict in .gitignore
Auto-merging .gitignore
Automatic merge failed; fix conflicts and then commit the result.
コンフリクトファイルを修正して、 commit & push します。
$ git add.
$ git commit -m 'confrict'
$ git push -u origin master
-u は --set-upstream の短縮形です。
Docker のコンテナからホストOSに接続するのに「host.docker.internal」というホストが用意されています。
Docker for Mac Stable release notes
Docker For Mac での機能なので、Linux ベースでは利用できないかと思います。
mysql コマンドで Dockerコンテナから、ホストOS(Mac)の MySQL に接続する場合、ホスト名に「host.docker.internal」を指定します。
# mysql -u ユーザ名 -h host.docker.internal -p
mysql>
よって、開発のプログラム上でも「host.docker.internal」をホストで設定して利用できます。
$db_name = 'DB名';
$user_name = 'ユーザ名';
$password = 'パスワード';
$host = 'host.docker.internal';
$dsn = "mysql:dbname={$db_name};host={$host}";
try {
$pdo = new PDO($dsn, $user_name, $password);
echo "接続成功" . PHP_EOL;
} catch (PDOException $e) {
echo "接続失敗: " . $e->getMessage() . PHP_EOL;
exit;
}
# psql -l -h host.docker.internal -U ユーザ名
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+-------+----------+---------+-------+-------------------
postgres | yoo | UTF8 | C | C |
sample | yoo | UTF8 | C | C |
template0 | yoo | UTF8 | C | C | =c/yoo +
| | | | | yoo=CTc/yoo
template1 | yoo | UTF8 | C | C | =c/yoo +
| | | | | yoo=CTc/yoo
Mac でそのまま ifconfig を利用すると、IP アドレスがすぐに見つけられません。
$ ifconfig
lo0: flags=8049 up,loopback,running,multicast mtu 16384
options=1203 rxcsum,txcsum,txstatus,sw_timestamp
inet 127.0.0.1 netmask 0xff000000
...
ネットワークインターフェイスを指定すると比較的見やすくなります。
$ ifconfig en0
en0: flags=xxxxxxxxxx mtu 1500
ether xx:xx:xx:xx:xx:xx
inet6 xx:xx:xx:xx:xx:xx%en0 prefixlen 64 secured scopeid 0x7
inet 192.168.1.6 netmask 0xffffff00 broadcast 192.168.1.255
....
「en0」は PC のネットワークボードによってことなりますが、デフォルトはだいたい「en0」です。
更に awk で inet の欄をフィルタリングします。
$ ifconfig en0 | awk '/inet / { print $2 }'
192.168.1.6
フィルタリングのコマンドを打つのも面倒なので、.bashrc に ip というエイリアスを作成します。
※エイリアス名の ip は簡略化しているので自己責任で
vi などで .bashrc を編集します。
$ vi ~/.bashrc
.bashrc に追加しますが、「'」(シングルクォート)は「'\''」とエスケープする必要があります。
alias ipconfig='ifconfig en0 | awk '\''/inet / { print $2 }'\'''
.bashrc を再読み込みします。
$ source ~/.bashrc
ip と入力すると IPアドレスが表示されます。
$ ip
192.168.1.6
ホストOS から Docker の MySQLコンテナにログインする場合、以下の方法があります。
他のコンテナ同様、docker-compose で MySQL コンテナに直接ログインします。
$ docker-compose exec コンテナ名 bash
コンテナ名が mysql だった場合
$ docker-compose exec mysql bash
Docker コンテナにログインしたら、MySQL にログインします。
# mysql -u root -p
この方法は、docker-compose が動作するパスで実行する必要があり、MySQL コンテナ内でも mysql でログインします。
次にホスト OS から mysql コマンドでログインしてみます。
つまりは、Docker の MySQL を外部ホストでログインする方法です。
$ mysql -u root -p -h localhost -P 3306 --protocol=tcp
mysql で localhost を指定すると自分の PC を指すため、--protocol で TCP ソケットを指定する必要があります。
MySQL 8 から認証方式がデフォルトで caching_sha2_password に変更されました。
これにより、caching_sha2_password 認証プラグインに対応していないクライアントは接続できません。(phpMyAdmin の最新版は接続できるはずです)
本番環境では推奨されませんが、root ユーザの認証方式を旧方式 mysql_native_password に変更する SQL を実行します。
mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| validate_password.check_user_name | ON |
| validate_password.dictionary_file | |
| validate_password.length | 8 |
| validate_password.mixed_case_count | 1 |
| validate_password.number_count | 1 |
| validate_password.policy | MEDIUM |
| validate_password.special_char_count | 1 |
+--------------------------------------+--------+
mysql> set global validate_password.policy=LOW;
mysql> set global validate_password.length=4;
mysql> set global validate_password.mixed_case_count=0;
mysql> set global validate_password.number_count=0;
mysql> set global validate_password.special_char_count=0;
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
root ユーザの認証プラグインが mysql_native_password に変更されました。
mysql> SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | mysql_native_password |
| yoo | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
開発環境のため、パスワードの制約もゆるい設定に変更しましたが、本番では厳しめに設定しましょう。
node-config は Node.js で設定ファイル(config)を扱うモジュールです。
設定ファイルを JSON、YAML などの形式で記述して、プログラム上でオブジェクトとして利用できます。
process.env でサーバの環境変数を取得することができます。Node.js の本番、開発などの環境変数は NODE_ENV を利用しますが、デフォルトは何も設定されていません。
process.env.NODE_ENV
$ npm install config
プロジェクト
|- config + default.json
|- development.json
|- node_modules/
|- package-lock.json
|- package.json
|- index.js
JSON 形式でサーバ設定を記述します。
{
"server": {
"host": "127.0.0.1",
"port": 3000
}
}
{
"test": 1
}
const config = require('config');
config.env = process.env.NODE_ENV || 'development';
console.log(config.server.host);
console.log(config.server.port);
console.log(config.test);
NODE_ENV をターミナルで設定すればそのまま node コマンドで実行できます。
$ export NODE_ENV=development
$ node app.js
明示的に NODE_ENV=develpment でもファイルを実行できます。
$ NODE_ENV=development node app.js
その他プログラムで環境変数の設定や「cross-env」モジュールを利用することもできます。
MySQL サーバを停止します。
//CentOS
$ sudo mysql.server stop
//Ubuntu/Debian
$ sudo service mysql stop
セーフモードで起動します。
$ sudo mysqld_safe --skip-grant-tables &
MySQLのインストール方法によって、以下のエラーでセーフモードで起動しない場合があります。
mysqld_safe Directory '/var/run/mysqld' for UNIX socket file don't exists
mysqld フォルダがないのが原因を作成します。
$ sudo mkdir -p /var/run/mysqld
$ sudo chown mysql:mysql /var/run/mysqld
root でログインできるか確認してみましょう。
$ mysql -u root
またアプリの MySQL ユーザが root の場合は、設定も変更しておきましょう。
root でログインします。
$ mysql -u root
root ユーザーのパスワードを空に設定します。 もしパスワードを設定したい場合は、null の部分を文字列で入力してください。
mysql>
UPDATE user SET authentication_string=password('新しいパスワード') WHERE user='root';
MySQL からログアウトします。
mysql> exit
セーフモードのMySQL を終了し、MySQL を起動します。
//CentOS
$ sudo mysql.server restart
//Ubuntu
$ sudo service mysql restart
Laravel のプロジェクトはコアライブラリの vender/ や環境設定ファイル .env など必要のないものは Git で管理しません。
当然 Laravel ライブラリがなければ Laravel の機能が利用できず、artisan コマンドでもエラーになります。
PHP Warning: require(/Users/yoo/projects/techboost/sample_laravel/vendor/autoload.php): failed to open stream: No such file or directory in /Users/yoo/projects/techboost/sample_laravel/artisan on line 18
Laravel のライブラリ(vender/) をインストールします。
$ composer install
※Laravel 用の composer.json が存在しないと、実行できません。
インストールが完了したら、artisan の動作を確認します。
$ cd プロジェクトフォルダ
$ php artisan --version
.env を作成します。
$ cp .env.example .env
DB の設定などがあれば修正しておきます。
Laravel のアプリケーションキーを再生成します。
$ php artisan key:generate
Web サーバが書き込みエラーにならないようにアクセス権限を変更します。
$ chmod 777 storage
$ chmod 777 bootstrap/cache/
DB を利用している場合は、マイグレーションもしておきましょう。
$ php artisan migrate
Laravel の動作確認をしましょう。 Web サーバ経由の場合はそのままブラウザで、Laravel のサーバを利用する場合は Laravel サーバを起動して確認します。
$ php artisan serve