エンジニアのひよこ_level10

毎日更新してた人。たまに記事書きます。

【Docker】phpでPDOにmysqlを使うと、could not find driverと出る【186日目】

Dockerfile

FROM php:7.1-fpm

phpファイル

$dbh = new PDO('mysql:host=mysqlaaa;dbname=dbname',
                'username',
                'password);

エラー

could not find driver

対処法

RUN docker-php-ext-install pdo_mysqlの一文をDockerfileに付け足す

FROM php:7.1-fpm
RUN docker-php-ext-install pdo_mysql

なぜか

PDOのプラグインmysqlが入っていないから。

phpinfo();でPDOを検索するとわかりやすい。

おまけ:初心者がDockerを勉強した本

■対象の人:環境構築わからない・・・インフラ用語わからない・・・

プログラム書けるけど、インフラ用語わからない、環境構築してみたいけどできない。

私がそうでしたが、以下の本で勉強しました。

インフラの用語を一から説明してくれて、その後にDockerの話をしてくれるので初心者向けです。
Laravelの環境くらいなら、一人で書けるようになりました。

アフィリエイトリンク貼ると、胡散臭くなるけど、単純におすすめしたい本(`・ω・´)ゞ

【Laravel】パスワード入力時に、確認の入力をバリデーションする。【185日目】

こんな時に使う

よく新規会員登録とかで見かける、

  • パスワード入力
  • パスワードの確認

とかで、同じパスワード入れないと通らないあれ。

こう書く

  1. id='xxx'のバリデーションに、 confirmedを設定
  2. id='xxx__confirmation'を、確認用のformとして用意する
  3. id='xxx'とid='xxx__confirmation'が一致しなかったらエラーが出る

例)App\Http\Requests\XxxRequest.php

/**
 * リクエストに適用するバリデーションルールを取得
 *
 * @return array
 */
public function rules()
{
    return [
        'password' => 'required|confirmed',
        'password_confirmation' => 'required',
    ];
}

/**
 * 定義済みバリデーションルールのエラーメッセージ取得
 *
 * @return array
 */
public function messages()
{
    return [
        'password.confirmed' => 'パスワードが異なります',
    ];
}

公式ドキュメント

バリデーション 5.3 Laravel

【日記】ブログ毎日更新が半年続いたので、次にやりたいこと。【184日目】

気づけば半年

毎日習慣となっていったブログ更新、とうとう半年になりました。

本当にあっという間でした。三日坊主にならなくてよかった。

良かったこと

知識の整理が出来る時間が出来たのは良いこと。

形として残ってるから、自分が忘れたものも、自分のブログを読めば思い出せる。

また、ブログ更新について会社の方と話す話題が手に入ったこと、
twitter等から、他の方との交流が増えたことは本当に良かった。

最近のブログが省エネになっている理由

突然ですが、実は最近のブログは短いものが多かったと思います。

どれくらい短い時間で書き続けれるかちょっと挑戦していたりします。
人工知能とか、どうしても長く書きたいものは時間かけて書いてますが・・・

それは、次にやりたいことのために、ブログにかける時間を最小限に効率化したいみたいな背景もあります。

ただ、まだ読みやすい、書きやすい構成が見つかっていないです・・・

次こうしたいこと①

togetter.com

今、知識を手に入れたまではいいけど、
プログラムとか形にしてない、実行していない。

上のまとめにあった図を見ると、プログラムとして書いたものを貼り付けるとか、
もう少し次のステップに行きたい。

出来れば、作ったものを動かせる環境用意したい。

となると、ブログ書く+コード上げるの2つの時間が必要なので、
なかなか続けるの大変そうではあります。がんばる。

次こうしたいこと②

いろんな方ともっと交流していきたい。

Twitterfacebook等のSNSも活用して、
あとは勉強会交流会にももっと参加して、
ちゃんとLTとかもしてきたい。

外部との人脈広げていきたいね!

【Laravel】データベースから取り出したデータを、型変換してから取り出したい【183日目】

値を取り出す時に、事前キャストしたい

ユーザーが管理者のときに○○したいという時に、以下のようにコードを書きたい

$user = new User('uiro');
if($user->is_admin === true) {
    ....
}

でも、データベースから取得した$userは0,1で is_adminが入ってる・・・そんなとき

$castで事前にキャスト

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * ネイティブなタイプへキャストする属性
     *
     * @var array
     */
    protected $casts = [
        'is_admin' => 'boolean',
    ];
}

$castにキー配列で、キャストしたい型を書いておけば、データ取得時にキャストしてからデータを取り出すことができる

公式ドキュメント

Eloquent:ミューテター 5.1 Laravel

【Laravel】コレクション内の多重配列を合体させて、一次配列に【182日目】

こんな時に使える

コレクション内に、[1,2,3]、[4,5,6]とかの配列を、一個にくっつけたい。

普段なら、foreachで取り出して、一個一個結合させる必要がある。

使うもの

collapse()

コード

$collection = collect([[1, 2, 3], [4, 5, 6], [7, 8, 9]]);

$collapsed = $collection->collapse();

$collapsed->all();

// [1, 2, 3, 4, 5, 6, 7, 8, 9]

公式ドキュメント

コレクション 5.3 Laravel

【Laravel】Formファサードのpasswordのoptionがきかないのは【181日目】

Formファサード

Form::text('email', null, ['id' => 'email', 'class' => 'mail', 'tabindex' => 1])

こんなやつ

これだと上手く動かない

Form::password('password', null, ['id' => 'password', 'class' => 'pass', 'tabindex' => 1])

この時、formタグにidやclassとかつかない。なぜだ

第二引数が初期値じゃない

textの場合、第二引数は初期状態に入ってる文字列になる

Form::text('email', null, ['id' => 'email', 'class' => 'mail', 'tabindex' => 1])

ただ、passwordに初期値はないので、第二引数がoptionになる。

Laravelの実装見てみる

public function text($name, $value = null, $options = [])
{
    return $this->input('text', $name, $value, $options);
}
public function password($name, $options = [])
{
    return $this->input('password', $name, '', $options);
}

ってことで、textと同じだろーって思ってると痛い目見ますし、
書くコードは使い方間違ってないか確認しよー

【Laravel】route.phpの書き順で動かなくなるパターン。例題あり。【180日目】

書き方間違えてないはず、なぜか反応しない

// ①
Route::get('/', 'TopController@index')->name('top');
// ②
Route::get('/{name}', 'ProfileController@detail)->name('profile_detail');
// ③
Route::get('/list', 'ProfileController@list')->name('profile_list');

どれが反応しないのか

原因はこれ

// ①
Route::get('/', 'TopController@index')->name('top');
// ②
Route::get('/{name}', 'ProfileController@detail)->name('profile_detail'); //←こいつのせい
// ③
Route::get('/list', 'ProfileController@list')->name('profile_list'); //←これ反応しない

なぜ反応しないのか

https://domain.co.jp/
https://domain.co.jp/user_name
https://domain.co.jp/list

この時、3番目のURLは③のルートになりそうだけれども、②のルートが反応する。

書き順のせいで、②が優先されて、nameにlistが代入されたと判断されて、②が動いてしまう。

route.phpの書き順も意外と重要

ということで、何も考えずにrouteを書いていると、思わぬところでハマるので気をつけましょう。

私はこれで1時間ハマりました|||orz

【Laravel】routeに名前空間(namespace)を使って、見やすい構成に【179日目】

こんな書き方あるよ

Route::group(['namespace' => 'Admin'], function () {
    // "App\Http\Controllers\Admin"名前空間下のコントローラ
});

何が嬉しいの?

App\Http\Controllers\Admin\SomeController.php
App\Http\Controllers\Admin\AnyController.php
App\Http\Controllers\User\SomeController.php
App\Http\Controllers\User\AnyController.php

こんな構成なら、下のように
■同じコントローラー名でも見やすく書ける
ディレクトリに分けてルートが書ける

Route::group(['namespace' => 'Admin'], function () {
    Route::get('admin/some', 'SomeController@show');
    Route::get('admin/any', 'AnyController@show');
});

Route::group(['namespace' => 'User'], function () {
    Route::get('some', 'SomeController@show');
    Route::get('any', 'AnyController@show');
});

参考ページ

ルーティング 5.3 Laravel