Hello, World!!

むずかしいことはかけません

リンク先を今は反応させたくない

どんな時使う?

まだ仕様が決まっていなくて一旦見た目だけ作成した時

リンクは作成したけど、href="" とするとなんか反応しているように見えてしまって嫌!無効化したい!なとき

コード

aタグのurlの値に、javascript:void(0) を設定する

<a href="{{ 'javascript:void(0)' }}">リンク</a>

マウスオーバーで指カーソルにしたいけれど、リンクは飛ばしたくない! という時、void(0)を使えば実現できる

PHP 演算子 "&="アンパサンドイコールとは

例えば、以下のように関連するデータを全削除するとき
deleteAll()が成功していれば$resultsにtrueが入っている思っていましたが、integer 1が入っていました。

$results = true;
$results &= $this->Work->deleteAll(array('dept_id' => $dept_id));
$results &= $this->Employee->deleteAll(array('dept_id' => $dept_id));

"&="アンパサンドイコールとは?

「ビット演算子」です。
"&=" は $a && $b ではなく、$a = $a & $b を短くした書き方になります。

www.php.net
にあるように

&、| そして ^ 演算子の左右のオペランドが文字列の場合、その演算は、 文字列を構成する文字の ASCII 値を使って行います。その結果は文字列になります。 それ以外の場合は、左右のオペランドを integer に変換 し、結果も integer になります。

そのため、$resultにはintegerの"1"が入ります。

実行例

[~]$ php -a
Interactive shell

php > $result = true;
php > var_dump($result);
bool(true)
php >
php > $result &= true;
php > var_dump($result);
int(1)

数値ではなく、true, falseを入れたいのであれば

$results = true;
$results = $results && $this->Work->deleteAll(array('dept_id' => $dept_id));
$results = $results && $this->Employee->deleteAll(array('dept_id' => $dept_id));

になります。

"=&"イコールアンパサンドは?

「参照渡し」です。
下記の2つはどちらも同じ挙動になります 。

$result =& $value;
$result = &$value;

参照渡しとは

変数bに代入した後に変数aの値を変えたところ、変数bの値も変わります。

$a = 2;
$b =& $a;  // 変数aを&をつけて代入
$a = 10;    // 変数aの値を変更
echo $b;

# 結果
10

参考サイト

PHPで”=&"演算子と"&="演算子は何を意味しますか?

PHP 参照渡しまとめ - Qiita

【PHP超入門】参照(リファレンス)の代入について - Qiita

Laravel8でSanctumを使いAPI認証を実装する

やること

LaravelのSanctumを使用し、API認証を実装します。
/meは認証されているユーザーしかアクセスできないよう実装します。

Sanctumのインストールとセットアップ

Sanctumのインストール

composer require laravel/sanctum

次にSanctum設定ファイルと移行ファイルを公開します。

php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"

データベースのマイグレーションを実行します。
これでAPIトークンを格納するためのテーブルを作成してくれます。

php artisan migrate

デフォルトでLaravelに付属するテーブルに加え、すべてのトークンを格納するpersonal_access_tokensテーブルがデータベースに作成されます。

mysql> show tables;
+------------------------+
| Tables_in_project01    |
+------------------------+
| failed_jobs            |
| migrations             |
| password_resets        |
| personal_access_tokens |
| users                  |
+------------------------+
5 rows in set (0.00 sec)

APIトークンの発行
Sanctumを使用すると、アプリケーションへのAPIリクエストの認証に使用できるAPIトークン/パーソナルアクセストークンを発行できます。 APIトークンを使用してリクエストを行う場合、トークンは「Bearer」トークンとして「Authorization」ヘッダに含める必要があります。

use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;
}

APIの作成

Controllerの作成

php artisan make:controller AuthController

ユーザー登録
ユーザー登録を行うルートを作成します。
routes/api.php

use App\Http\Controllers\AuthController;

// API認証
Route::post('/register', [AuthController::class, 'register']);

ユーザー登録メソッドを作成します。
app/Http/Controllers/AuthController.php

use Illuminate\Support\Facades\Hash;


class AuthController extends Controller
{
    public function register(Request $request)
    {
        $validatedData = $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|min:8',
        ]);
      
        $user = User::create([
            'name' => $validatedData['name'],
            'email' => $validatedData['email'],
            'password' => Hash::make($validatedData['password']),
        ]);
        
        return response()->json('User registration completed');
    }
}

リクエストにバリデーションをかけ、問題なければUserテーブルに格納し、"User registration completed" を返します。

ログイン機能
ログインルートを作成します。 routes/api.php

Route::post('/login', [AuthController::class, 'login']);

AuthControllerの中にlogin()メソッドを追加します。

public function login(Request $request)
{
    if (!Auth::attempt($request->only('email', 'password'))) {
        return response()->json([
            'message' => 'User Not Found'
        ], 401);
    }

    $user = User::where('email', $request['email'])->firstOrFail();

    $user->tokens()->delete();
    $token = $user->createToken('auth_token_userID_'.$user->id)->plainTextToken;

    return response()->json([
        'access_token' => $token,
        'token_type' => 'Bearer',
    ]);
}

POSTできたメールとパスワードが違えば、401 User Not Found を返します。 1ユーザーに対して複数のtokenができてしまうので、delete()で古いtokenは削除します。 createToken()メソッドを使いトークン名を"auth_token_userID_xx" とし、作成されたユーザーに新しいアクセストークンを生成します。
plainTextTokenプロパティを使用してトークンのプレーンテキスト値にアクセスすることができます。 最後に作成されたトークンとトークンタイプを含むJSONレスポンスを返します。

認証済みユーザのみアクセスできる画面の作成
認証済みユーザーの場合、ユーザー情報を返す画面(/me)を作成します。 routes/api.php

Route::get('/me', [AuthController::class, 'me'])->middleware('auth:sanctum');

sanctumガードを使用することでエンドポイントのリクエストのヘッダーに有効なAPIトークンが含まれるようになります。

AuthControllerには以下のメソッドを追加します。

public function me(Request $request)
{
    return $request->user();
}

またAPIをテストする前に、app/Providers/RouteServiceProvider.phpの以下のコメントを解除してください。

protected $namespace = 'App\\Http\\Controllers';

APIをテストする

Laravel+Homesteadで環境構築しており、/etc/hosts でipアドレスを以下のように設定しているため

192.168.30.10    project01.test

APIにはhttp://project01.test/apiからアクセスします。
そこまで構築するのがめんどくさい場合は php artisan serveコマンドでサーバーを起動させ "http://127.0.0.1:8000/api" でアクセスするとよいと思います。

今回はVSCode拡張機能のThunder Client を使用します。
marketplace.visualstudio.com

VSCode にインストール後左に表示されるアイコン -> New Requestをクリックしたら始めることができます。 f:id:eeko-amaryllis:20220207110633p:plain:w500

ユーザー登録をする

[POST] http://project01.test/api/register?name=yamada&email=xxx@mail.com&password=pAssw0rd  

http://project01.test/api/register宛にname, email, passwordを含むPOSTリクエストを作成します。パスワードは8文字以上必要です。 f:id:eeko-amaryllis:20220207183818p:plain

ログインする

emailとpasswordを入力し、http://project01.test/api/loginにPOSTリクエストを行います。

[POST] http://project01.test/api/login?email=xxx@mail.com&password=pAssw0rd

f:id:eeko-amaryllis:20220207184302p:plain

仮に間違ったemailやpasswordをパラメーターで渡すと、"message": "User Not Found"と返ってきます。 f:id:eeko-amaryllis:20220207183931p:plain

/meにアクセスする

ここで返ってきたaccess_tokenをAuth のBearerに入力します。

[GET] http://project01.test/api/me

f:id:eeko-amaryllis:20220207184425p:plain 有効なトークンなため認証されたユーザー情報が返ってきました。

無効なトークンを入力すると500エラーが返ってきます。

参考サイト

Laravel SanctumでPHPのRESTful APIを構築する

おまけ

createToken()で第一引数に名前をつける必要性ってなんだろうと思いました。 軽く調べたところ

ウェブ用とモバイルアプリ用の2種類のトークンがあり、それぞれの種類の有効期限が異なる場合は、「ウェブトークン」や「モバイル」などの特定の名前で各種類をグループ化できます。

だそうです。

php-createTokenメソッドで文字列を渡す必要があるのはなぜですか? | yaoply.com

PHP5.6をCentOS7+docker+CakePHP2 の環境にインストールしたい

Dockerfileで

RUN yum install -y --enablerepo=remi,remi-php56 

としているのにPHP5.4がインストールされてしまう。
以下のサイトにあるように、yum-utilsをインストールしてyum-config-managerコマンドでバージョンを指定したげると良いです。

PHP5.xをCentOS7にインストールする - suzu6の技術ブログ

Dockerfile

FROM centos:centos7.3.1611

## Package
RUN yum install -y \
      deltarpm \
      sudo \
      unzip \
      git \
      iputils \
      procps \
      openssh-server \
      httpd \
      mod_ssl \
      mariadb

## remi
RUN yum install -y epel-release
RUN yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
# デフォルトだと5.4をインストールしてしまう
# php5.6リポジトリの有効化
RUN yum install -y yum-utils
RUN yum-config-manager --enable remi-php56

# php5.6のインストール
RUN yum -y install php \
    php-mbstring \
    php-xml \
    php-pear \
    php-cli \
    php-common \
    php-devel \
    php-fpm \
    php-gd \
    php-intl \
    php-mcrypt \
    php-mysqlnd \
    php-opcache \
    php-pdo \
    php-pecl-igbinary \
    php-pecl-jsonc \
    php-pecl-jsonc \
    php-pecl-redis \
    php-pecl-zip \
    php-process \
    && yum clean all

PHP5.6がインストールできた

[root@project-local /]# php -v
PHP 5.6.40 (cli) (built: Nov 15 2021 11:30:01)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies

CakePHP4 クイックスタート

プロジェクト作成

php composer.phar create-project --prefer-dist cakephp/app:4.1 cms

バージョンを指定せずに app:4.* とするとエラーになる

エラー1

Exception: Argument 1 passed to Cake\Utility\Security::setSalt() must be of the type string, null given, called in /Users/xxxx/cms/config/bootstrap.php on line 164

config/app.php のSecurityのenvの第二引数に32文字以上のランダムな文字を入れておけばよい。

'Security' => [
        'salt' => env('SECURITY_SALT', 'dfc123c6c22d84f4bc12273f3df67c6ae55009696e4126b36ac2f755778faccc'),
    ],

XAMPP環境にCakePHP4インストール時に起きたエラーと解決方法 | 417.Run()

エラー2

PHP Warning:  require(/Users/xxxx/cms/vendor/autoload.php): failed to open stream: No such file or directory in /Users/xxxx/cms/bin/cake.php on line 5

CakePHP プロジェクト内にある vender フォルダに必要なファイルがインストールされていないことが原因です。 composerのアップデートをしましょう。

[~/cms]$ composer update

CakePHP3インストール時によく起こるエラーの解決法まとめ

サーバー起動

[~/cms]$ bin/cake server

Welcome to CakePHP v4.3.4 Console
-------------------------------------------------------------------------------
App : src
Path: /Users/xxxx/cms/src/
DocumentRoot: /Users/xxxx/cms/webroot
Ini Path:
-------------------------------------------------------------------------------
built-in server is running in http://localhost:8765/
You can exit with `CTRL-C`

一番最初の画面で表示されるエラー

Please replace templates/Pages/home.php with your own version or re-enable debug mode.

以下のようなコードがテンプレートファイルに入っていると404エラーになります。

if (!Configure::read('debug')):
    throw new NotFoundException('Please replace src/Template/Pages/home.ctp with your own version.');
endif;

コメントアウトすると f:id:eeko-amaryllis:20220120183711p:plain

Laravel 8.x + Homestead で仮想環境を作る

昨日* 環境構築手順

  • Homesteadは、Laravel が動作する開発環境を簡単に構築できるツールです。
  • VagrantとはVirtualBoxなどを利用した仮想環境を作る便利なソフトウェアです。
  • Laravel Homesteadは、PHP、Webサーバー、その他のサーバーソフトウェアをローカルマシンにインストールしなくても開発環境を構築することができる公式のVagrant Boxです。
  • Vagrant Boxとは、仮想マシンのテンプレートとなるファイルです。
参考サイト

【Laravel 5.5 or latest】Homestead で mac に Laravel 開発環境を構築 - Qiita

Laravel公式でもHomesteadを使用しての環境構築手順を公開しています。
Laravel Homestead - Laravel - The PHP Framework For Web Artisans

virtualbox, vagrantはインストール済みとして進めます。

ディレクトリ構造
/Users/user_name/
 ├ Homestead/
 └ code/  
      └ project01/

laravel/homestead boxをインストール

laravel/homesteadという名前のboxファイルがインストールされます。

[~]$ vagrant box add laravel/homestead
[~]$ vagrant box list                 
laravel/homestead (virtualbox, 11.4.0)

Homesteadをインストール

ユーザーディレクトリの直下にインストールします。

[~]$ git clone https://github.com/laravel/homestead.git ~/Homestead

Homestead.yaml を作成します

[~]$ cd ~/Homestead
[~/Homestead]$ bash init.sh
Homestead initialized!

SSHキーの設定はやっているとみて飛ばします。

Homestead.yaml の設定

---
ip: "192.168.30.10"   <- 書き換えた所
memory: 2048
cpus: 1
provider: virtualbox

authorize: ~/.ssh/id_rsa.pub

keys:
    - ~/.ssh/id_rsa

folders:
    - map: ~/code
      to: /home/vagrant/code

sites:
    - map: project01.test    <- 書き換えた所
      to: /home/vagrant/code/project01/public    <- 書き換えた所

databases:
    - project01    <- 書き換えた所

# ports:
#     - send: 50000
#       to: 5000
#     - send: 7777
#       to: 777
#       protocol: udp

# blackfire:
#     - id: foo
#       token: bar
#       client-id: foo
#       client-token: bar

# zray:
#  If you've already freely registered Z-Ray, you can place the token here.
#     - email: foo@bar.com
#       token: foo
#  Don't forget to ensure that you have 'zray: "true"' for your site.
foldersの設定

mac側と仮想環境側のどのフォルダを共有するか設定します。

  • map

mac 側の共有ディレクトリのことでデフォルトでは ~/code になっており、これはユーザー名直下の code ディレクトリを指しています。
mac側には/codeディレクトリはないので作成しておきましょう。

[~]$ mkdir code

ここにLaravelのソースコードを入れることにします。

  • to

/home/vagrant/code は仮想環境側の共有フォルダのディレクトリになります。

sitesの設定

ホスト名 project01.test でアクセスしたときに to に記載した仮想マシンディレクトリを参照します。
デフォルトでは /home/vagrant/code/public と設定されていますが、Laravel プロジェクト/puroject01のpublicを見て欲しいので
/home/vagrant/code/project01/public
に書き換えます。

hostsファイルの設定

ブラウザからアクセスできるよう設定します。

[~/Homestead]$ sudo vi /etc/hosts

以下を追記

192.168.30.10 project01.test

仮想マシン起動前のプラグインインストール

以下2つのプラグインをインストールします。
参考サイト

起動時に自動的にホスト(VirtualBox)のバージョンに合わせて、ゲスト(Guest Additions)のバージョンを更新してくれるものです。

作成した仮想マシンとホストPCの/etc/hostsを自動で書き換えてくれるプラグインです。

[~/Homestead]$ vagrant plugin update
[~/Homestead]$ vagrant plugin install vagrant-vbguest
[~/Homestead]$ vagrant plugin install vagrant-hostmanager

仮想マシンの起動

[~/Homestead]$ vagrant up

上手くいくと仮想環境に/codeディレクトリが作成されているはずです。

仮想マシンにログイン

[~/Homestead]$ vagrant ssh
Welcome to Ubuntu 20.04.3 LTS (GNU/Linux 5.4.0-88-generic x86_64)

 _                               _                 _
| |                             | |               | |
| |__   ___  _ __ ___   ___  ___| |_ ___  __ _  __| |
| '_ \ / _ \| '_ ` _ \ / _ \/ __| __/ _ \/ _` |/ _` |
| | | | (_) | | | | | |  __/\__ \ ||  __/ (_| | (_| |
|_| |_|\___/|_| |_| |_|\___||___/\__\___|\__,_|\__,_|

* Homestead v12.6.1 | Thanks for using Homestead
* Settler v11.4.0


Last login: Sun Oct 17 09:47:50 2021 from 10.0.2.2
vagrant@homestead:~$

ls で中を見ると/codeディレクトリがありました。

vagrant@homestead:~$ ls
code

仮想マシン上でComposerとLaravel プロジェクトをダウンロードする

vagrant@homestead:~/code$ composer create-project laravel/laravel project01

ローカル環境にもproject01ディレクトリが作成されていれば成功です。

/etc/hosts に記述した、http://project01.test/にアクセスしたらLaravelのwelcomeページが表示されているはずです。

MySQL にログイン

vagrant@homestead:~/code$ mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.26-0ubuntu0.20.04.3 (Ubuntu)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use project01
Database changed

無事MySQLにもログインできました。

マイグレーションファイルを流す

envファイルの設定

DBの設定を以下に変更します。

DB_CONNECTION=mysql
DB_HOST=192.168.30.10    <- 書き換えた所
DB_PORT=3306
DB_DATABASE=project01    <- 書き換えた所
DB_USERNAME=homestead    <- 書き換えた所
DB_PASSWORD=secret    <- 書き換えた所

Homestead.yamlのIP を 192.168.30.10 に変更した場合は、192.168.30.10 としてください。
またDB_USERNAME, DB_PASSWORDを上記のように設定しないと以下のようなエラーが出てしまいます。

SQLSTATE[HY000] [1045] Access denied for user 'root'@'homestead' (using password: YES) (SQL: select * from information_schema.tables where table_schema = project01 and table_name = migrations and table_type = 'BASE TABLE')
マイグレーション実行
vagrant@homestead:~/code/project01$ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (28.45ms)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (30.07ms)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (53.51ms)
Migrating: 2019_12_14_000001_create_personal_access_tokens_table
Migrated:  2019_12_14_000001_create_personal_access_tokens_table (35.37ms)

テーブルが作成されました。

mysql> show tables;
+------------------------+
| Tables_in_project01    |
+------------------------+
| failed_jobs            |
| migrations             |
| password_resets        |
| personal_access_tokens |
| users                  |
+------------------------+
5 rows in set (0.00 sec)