リンク先を今は反応させたくない
どんな時使う?
まだ仕様が決まっていなくて一旦見た目だけ作成した時
リンクは作成したけど、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
参考サイト
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をクリックしたら始めることができます。
ユーザー登録をする
[POST] http://project01.test/api/register?name=yamada&email=xxx@mail.com&password=pAssw0rd
http://project01.test/api/register宛にname, email, passwordを含むPOSTリクエストを作成します。パスワードは8文字以上必要です。
ログインする
emailとpasswordを入力し、http://project01.test/api/loginにPOSTリクエストを行います。
[POST] http://project01.test/api/login?email=xxx@mail.com&password=pAssw0rd
仮に間違ったemailやpasswordをパラメーターで渡すと、"message": "User Not Found"
と返ってきます。
/meにアクセスする
ここで返ってきたaccess_tokenをAuth のBearerに入力します。
[GET] http://project01.test/api/me
有効なトークンなため認証されたユーザー情報が返ってきました。
無効なトークンを入力すると500エラーが返ってきます。
参考サイト
Laravel SanctumでPHPのRESTful APIを構築する
おまけ
createToken()で第一引数に名前をつける必要性ってなんだろうと思いました。 軽く調べたところ
ウェブ用とモバイルアプリ用の2種類のトークンがあり、それぞれの種類の有効期限が異なる場合は、「ウェブトークン」や「モバイル」などの特定の名前で各種類をグループ化できます。
だそうです。
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;
コメントアウトすると
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.
hostsファイルの設定
ブラウザからアクセスできるよう設定します。
[~/Homestead]$ sudo vi /etc/hosts
以下を追記
192.168.30.10 project01.test
仮想マシン起動前のプラグインインストール
- vagrant-vbguest
起動時に自動的にホスト(VirtualBox)のバージョンに合わせて、ゲスト(Guest Additions)のバージョンを更新してくれるものです。
- Vagrant host manager
作成した仮想マシンとホストPCの/etc/hostsを自動で書き換えてくれるプラグインです。
[~/Homestead]$ vagrant plugin update [~/Homestead]$ vagrant plugin install vagrant-vbguest [~/Homestead]$ vagrant plugin install vagrant-hostmanager
仮想マシンにログイン
[~/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)