クマのブログ

つまづいたところ、学びを書いていきます

【Laravel】Error Class 'App\User' not found

前提

Windows 10

・Laravel 8.0

背景

Laravel入門書進めていく中で参考書通り進めたがつまづく。 模索した結果、解決したのでメモ

事象

LaravelのAuth機能を実装しようと以下コードを実装

<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
​
class CreateUsersTable extends Migration
{
   public function up()
   {
       Schema::create('users', function (Blueprint $table) {
           $table->increments('id');
           $table->string('name');
           $table->string('email')->unique();
           $table->string('password');
           $table->rememberToken();
           $table->timestamps();
       });
   }
​
   public function down()
   {
       Schema::dropIfExists('users');
   }
}
<?php
​
namespace App\Http\Controllers;
​
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use App\Http\Requests\HelloRequest;
use Validator;
use Illuminate\Support\Facades\DB;
use App\Person;
use Illuminate\Support\Facades\Auth;
use App\Models\User;
use Illuminate\Support\Facades\Storage;
use App\MyClasses\MyService;
​
class HelloController extends Controller
{
    public function index(Request $request)
    {
        $user = Auth::user();
        $sort = $request->sort;
        $items = Person::orderBy($sort, 'asc')->simplePaginate(5);
        $param = [
            'items' => $items,
            'sort' => $sort,
            'user' => $user
        ];
        return view('hello.index', $param);
    }
}
<!DOCTYPE html>
<html lang="ja">
<head>
    <title>Hello/Index</title>
</head>
<body>
<h1>Hello/Index</h1>
@if(Auth::check())
<p>USER:{{$user->name . '(' . $user->email . ')'}}</p>
@else
<p>not login(<a href="/login">login</a>|<a href="/register">register</a> )</p>
@endif
</body>

実行、以下エラーが発生

Error Class 'App\User' not found

ん?

なんのエラーだ?

試したこと

try1

stackoverflowtetatailを参考にエラー原因を特定。

どうやらApp/User.phpのクラス宣言がうまくいっていないっぽい。

実はこの手順でAuth機能を作ってからなにもいじってなかったや。

ということで、Controllerファイルを確認すると

(中略)
use App/Models/Person;  
(中略)

あ、クラス呼べてないですね。

今回モデルファイルPerson.phpはAppファイル直下にあるので、以下に変更が必要だ。

(中略)
use App/Person;   // App直下のPerson.phpを呼び出す
(中略)

結果

解決!無事、Auth機能が実装できた!

結論

エラーの要因は ただ、指定するクラスのパスが違っただけでした。

所見

Laravel6.0以降から

php artisan make:auth

が使えなくなったため、Auth機能の実装は以前より手間が増えた。

まだ学んでいないところで、メリットはあるのかな?

上記の'php artisan meke:auth'が使えないときのAuth機能の実装もつまづいたので、こちらに掲載します。

参考記事

【Laravel】Class hogeSeeder does not exist.

前提

Windows 10

・Laravel 8.0

背景

Laravel入門書進めていく中で参考書通り進めたが進まず、模索した結果解決したのでメモ

事象

任意のSeederファイル"PeopleTableSeeder.php"を作成後、DBにテストカラムを作成するにあたり

php artisan serve:db seed

を実行した。

結果、以下エラー発生。

Class PeopleTableSeeder does not exist.

試したこと

try1

Qiitaを参考に

composer dump-autoload

実行後、再度

php artisan serve:db seed // ①
or
php artisan serve:db seed --class=PeopleTableSeeder // ②

を実行

結果

①、②で同じエラー発生

try2

次に

php artisan migration:fresh

を実行後

composer dump-autoload
php artisan serve:db seed // ①

を実行(先述の②をやり忘れる)

結果

①で同じエラー発生…

try3

php artisan cache:clear

実行後

composer dump-autoload
php artisan serve:db seed // ①
or
php artisan serve:db seed --class=PeopleTableSeeder // ②

結果

①:エラー発生 ②:シーディング完了!

結論

エラーの要因は

・migrationのfreshが必要だった=悪さをするカラムがあったため(try2より) ・キャッシュが残っていたこと(try3より) ・php artisan serve:db seed --class=PeopleTableSeederのようにクラスを指定する必要がある(try2,3より)

のどれか。

所見

エラー文でググると、Qiitaのように

composer dump-autoload

だけで治る、とあるが、恐らくこれは6.x系までの話。

8.xでは先述の3つの要因が影響していると思われる。

参考記事

一般的な解決方法。 恐らくLaravel6.x系まではこれだけで解決したが8.x系ではダメっぽい

  • stackoverflow この人は色々やってもダメだったみたい… 僕の解決策以外にも
 php artisan optimize

とかやってみたらしい

オンラインコミュニティ「転職クエスト」の効率的な使い方

はじめに

先日、オンラインコミュニティ「転職クエスト」のメリットについて記事を書きましたが、今回は

「入ったはいいけど、実際に何すりゃいいの?」

という疑問に答えていきます。

※あくまで僕の実体験をもとに内定獲得までにやってきたことです。

「絶対にこうしなきゃダメ!」

とか

「こうしないと内定とれない!」

ってことではないので、ご承知おきを。

簡単な自己紹介

僕の簡単なプロフィールです。

  • 前職は大手自動車部品メーカーの営業(完全異業種)

  • 20/7~ プログラミング学習開始

    • 学習言語:主にPHP/Laravel
  • 20/10~ 「転職クエスト」へ参加

  • 20/3中旬 現在の就職先に内定を頂く

  • 21/5~ 都内の自社開発企業に就職

    • 職種:バックエンドエンジニア

    • 使用言語:PHP/Laravel

いわゆる「駆け出しエンジニア」 です。

本題。手順は3つ!

大きく分けて3つかと思います。

1. まずは、コミュニティの雰囲気を知る

 

「入ってみたもののどんな人がいるんだろ...どんな雰囲気なんだろ...」

「転職クエスト」へ入会し、専用のslackワークスペースへ入って思うのは多分これだと思います。

slackを初めて触る方でしたら、尚不安ですよね。

 

とはいえ、せっかくお金払って入会したんだし、動かねば欲しい情報は手に入らないのが現実というもの...(世知辛い…)

なので、小手始めに

  • いろんなチャンネルに参加して、スレッドを読み漁ってみる

  • イベントに参加してみる(※)

  • もくもく部屋でもくもく作業してみる

あたりから始めるのが無難かと思います。

 

※中には

「イベントに参加するの勇気いるな~...」

という方も大丈夫。

マイクOFF/カメラOFFで、内容を聞くだけの「聞き専」OKのイベントも多々あるので、気軽に参加してみてください!

 

後は、slack内のチャンネルの一つにもくもく部屋があり、コミュニティ生がよくもくもく作業しています。 (僕もよくここにいます。)

ここではたまに雑談会が始まり、コミュニティメンバーの雰囲気や悩み・不安の相談ができちゃいます!

 

僕自身、このもくもく会で、たくさんの人と触れ合ってたくさんの転職活動に関係する情報を収集できました

入会当初にもくもく会にたくさん足を運んでよかったと改めて思います。

 

2. コミュニティ内でイベントを主催してみる

ある程度イベントに参加してどんなイベントがあるか分かったら自分でイベントを主催することをオススメします!

これをするメリットは2つあります。

①コミュニティ生とよりつながることができる

②イベントを主催したという実積が就職活動での「行動力」を示すエビデンスになる

なによりも②が非常に大きなメリットです。

多くのエンジニア志望者の中で、自らイベントを主催する方ってかなり少数派ですから、他の就職活動者との圧倒的な差別化が図れます。

 

コミュニティメンバーによって主催されているイベントは

  • 勉強会(オフライン)
  • もくもく会(オンライン)
  • 面接練習会(オンライン)

などなど。

このうち、もくもく会は比較的準備も少なく、初めての主催には個人的にオススメです!

 

ちなみに、内定者の方々のお話を聞いていると、イベント主催実績のある方はほぼ確実に、その実績について選考企業からかなりの高評価を得た、と聞いています。 (ちなみに、僕もその一人です!)

 

3. 添削で「キラキラ職務経歴書」を作成

職務経歴書は履歴書の他に選考に必要な書類の一つで、求人サイトであるWantedlyやGreenのプロフィールのベースにしたり、エントリー時に企業から提出を求められる書類です。

この職務経歴書の内容によって書類選考の合否が変わるため、その質が高ければ高いほど選考通過率が上がるのは必然。

 

そして、この非常に重要な職務経歴書をより強い武器にしてくれるのが職務経歴書添削サービスです。

転職クエストのLPにも記載がありますが、これを使えば

  • メンターさんとのコミュニケーションの中で、自分が書いた職務経歴書が、より自分の魅力が企業に伝わりやすい、差別化したキラキラ職務経歴書(=要は「質のいい職務経歴書」)に生まれ変わる!
  • 一個一個の記載内容を深堀していくので、面接対策にもなる!

というメリットが得られます!

 

一般のエージェント等でも同じようなサービスはありますが、「転職クエスト」ではエンジニア経験のある or 現役エンジニアのメンターさんによる添削なので、内定が欲しいWEB開発企業目線での添削が受けられる点は大きなメリットです!

もちろん、2. で紹介したイベント主催実績があれば、アピールポイントが増え、具体的なアピール方法などの相談もできます!

最後に

いかがでしたでしょうか。

本記事を読んで頂いた方には少しでも「『転職クエスト』の使い方」についてイメージがつけば幸いです。

もし、この記事を見られた方が「転職クエスト」に入会されたらもくもく部屋でお待ちしています(笑) 気軽にお声掛けください!


「『転職クエスト』ってそもそもなんなのさ?」

という方につきましては別記事でまとめようかなあ、と思っていますが、専用LPもかなり見やすいので、少しでも興味があれば、こちらも参考にしていただければと思います。

転職クエストLP

最後までご覧頂きありがとうございました。

!isset()とemptyの違い

始めに

会社の研修で、PHPの基礎問題を解いているときにふと思った疑問

実例

以下の演習問題を解いていた時の話。


ユーザーがテキストボックスに入力した0~9の数字について ・入力して送信ボタンを押した時⇒「OK」を出力 ・入力がなく送信ボタンを押した時⇒「NG」を出力

というプログラムを完成せよ

とのことだったので

当初回答

<form action="answer.php" method="POST">
        数字を入力してください。<input type="text" name="num">
        <input type="submit" value="送信">
</form>

// 上記テキストボックスに数字の入力があったか否かの条件分岐
if (empty($_POST['num'])) {
   // 入力がなかった時、"NG"の表示
   echo "NG";
   }else{
   // 入力があった時、"OK"の表示
   echo "OK";
    }

で「入力されたか否か」をempty関数を使っての条件分岐させています。

「これで完璧!」

と思ったんですが、不正解...

なぜか。

解説

結論

結論はempty関数を使っていることがここでの不正解の原因

正解はisset関数もしくはis_null関数を使わなくてはいけませんでした。

if (isset($_POST['num'])) {
    (中略)
    }

もしくは

if (is_null($_POST['num'])) {
    (中略。但し"OK"と"NG"を入れ替える必要あり)
    }

理由

以下テーブルの通り、今回の変数$=0の時に返す結果が異なる。

関数 $num = 0の時
empty False
is_null False
isset True

なので、当初回答の問題点は

$=0を入力したとき⇒"OK"が出力

となってしまう点が仕様未達で不正解となってしまいました…

参考記事

所見

・「値があるか否か」という条件分岐はよくあるもので、なんでも!emptyで済ませていたため、改めてこれらの違いについて深くしるきっかけがあってよかったと思う

参考記事

`isset() is_null() empty()` の違い と 変数の理解 と · 学習B5デスノート

公式マニュアル isset()

公式マニュアル empty()

"==="ってどこで使うんだ…(PHP)

始めに

・会社の研修で、PHPの基礎問題を解いているときにふと思った疑問

・たとえば独学時は「もし文字列$hogeが"1"である場合は~」という条件分岐で比較演算式"=="を使い

<?php
if( $hoge == 1 ){
処理
}
?>

みたいなコードを書いていた。

・でももう一度基礎に振り替えると、比較演算子"==="もあるよねとなって学び直し。

学習したこと

"=="と"==="の違い

まずはマニュアル。これによると、

==(イコール2つ)

例:$a == $b

名前:等しい

結果:型の相互変換をした後で $a が $b に等しい時に true。

===(イコール3つ)

例:$a === $b

名前:等しい

結果:$a が $b に等しく、および同じ型である場合に true 。

2つの違いは「型まで一緒か否か」ということになる

例えば、これ。

$num1 = 1 ;
$num2 = "1";

$num3 = $num1 + $num2 ; 
echo $num3 ; //   結果:2
var_dump($num3); //   結果:int(2)

$num1と$num2の加算式の結果$num3は2で、$num3自体もint型の状態で一見$num1と$num2は全く同じものに見えるが、

var_dump($num1 == $num2);  // 結果:true
var_dump($num1 === $num2);  // 結果:false

となる。

PHP 8.0.0から要注意!

サーバーサイド言語をPHPしか知らない僕にとっては型の概念が非常に弱い。。。

PHPはその型の制約が非常にゆるい点で学習コストが低いこともあるが、PHP8.0.0からこの型について知っておかねばエラーが発生するようになった。

マニュアルにも「警告」が出ているが、例えば

var_dump(0 == "a"); 

これはPHP8.0.0以前は"false"を返していたが、8.0.0以降は"true"を返すようになってしまった等、型の概念を知っておかねば予期せぬ挙動をするようになった。

所見

今後PHP8.0.0の環境下で開発する際や、そもそも他の言語を学ぶ際には型の概念は必須なので、抑えておこうと思った。

また、マニュアルを読むと「このコードもこんな挙動をするんだ…」など、学びが多い。

例)

var_dump("10" == "1e1"); // 10 == 10 -> true

⇒なんで、"1e1"が10として処理されるのか??

参考記事

PHPマニュアル

【「転職クエスト」って何?】どんなメリット?

始めに

SNSで「未経験からエンジニア転職」を目指している方の発信を拝見すると

Aさん:書類選考が100社エントリーしたのに、全然通らない…

とか

Bさん:予想外の質問ばかりで面接がうまくいかなかった…

とかの胸が痛くなるような悲痛の叫びをよく見かけました。。。

そんな書類対策や面接対策で悩んでいる、もしくは不安を持っている多くのエンジニア志望者の方々に「転職クエスト」を知るきっかけになれば…と思い、慣れないブログ執筆に至った、というわけです。

簡単な自己紹介

僕の簡単なプロフィールです。

  • 前職は大手自動車部品メーカーの営業(完全異業種)

  • 20/7~ プログラミング学習開始

    • 学習言語:主にPHP/Laravel
  • 20/10~ 「転職クエスト」へ参加

  • 20/3中旬 現在の就職先に内定を頂く

  • 21/5~ 都内の自社開発企業に就職

    • 職種:バックエンドエンジニア

    • 使用言語:PHP/Laravel

いわゆる「駆け出しエンジニア」 です。

このブログについて

僕は「転職クエスト」のいちユーザーとして書きたいことは他にもあるので、今後も小出し小出しで記事を書いていこうと思います。

「転職クエスト」の

  • 効率的な活用方法

  • オススメプラン

  • 逆にデメリットに思った点

等々、公開できる範囲で公開しようと思います。

他に気になる点あればお気軽にコメント等下さいませ。

本題の前に…「転職クエスト」って何?

そもそも

「『転職クエスト』とは何ぞや?」

という方につきましては、簡単に言うと

運営代表のゆーきさんと数人のメンターさんによって運営されている

業界未経験からエンジニア転職への挑戦される方をサポートするオンラインコミュニティ

です。

詳細は特設LPがわかりやすいので、ご参照ください。

「転職クエスト」特設LP

「転職クエスト」のメリット

では本題です。

僕が実際に「転職クエスト」を利用して感じたメリットは以下3つです。

  1. ホットな転職情報が手に入る

  2. 現役エンジニアの方やメンターさんに就活の質問ができる

  3. 横のつながりが手に入る

それぞれ補足していきます。

1. 転職活動に役立つイベントが頻繁に用意されている

「転職クエスト」ではほぼ毎日何かしらイベントが開催されます。

以下にその一部をご紹介。

就職相談会

メンターさんからや内定獲得者へインタビュー形式で役立つ就職経験談を聞けます。

参加者からの質問タイムも確保されています。

面接練習会

実際の面接を模擬して、頻出質問に面接形式で回答します。

練習終了後には見学者やメンターさんからフィードバックも受けられます。

ポートフォリオ品評会

自分で作ったポートフォリオを第三者目線で評価してもらいます。

思わぬバグや挙動が見つかったり、UI/UX上の意見をメンターさんからもらえたりまします。

 

などなど、これらはほんの一部です。

他にも僕もコミュニティ内でもくもく会を主催しているもくもく会などもあり非常に活発なコミュニティです。

※ちなみにもくもく会は毎回Twitterにてこんな感じで告知なんかもしてます。

2. 現役エンジニアの方々の情報が手に入る

「転職クエスト」内には転職活動を終えて現役のエンジニアとして働かれているメンターさんやメンバーが多数います。

なので、現場目線で

「今どんな人材がエンジニアとして必要とされているか」

という生の声を聞くことができます。

様々な情報があふれる現在、こういった新鮮かつ現場の生の情報が流れてくるのもメリットの一つです。

3. 同じ志を持つ仲間が見つかる

転職活動中に課題となるのはやはり最大の課題は「モチベ―ション維持」ですよね…

「プログラミング学習中やポートフォリオ開発中のエラーが解決できない…」

「書類選考で返事が来ない…」

「志望度高い企業との面接でうまく話せず撃沈…」

これらの苦痛はエンジニア転職活動を経験した僕も痛いほどわかります…

最悪、エンジニアへの道を自ら閉ざしてしまう方もいらっしゃるほどですから…

 

しかし、「転職クエスト」には

  • 自分と同じような苦しい状況でも日々エンジニア転職に向けて努力されている方々

  • これらの修羅場を乗り越え、エンジニア転職を果たした方々

がたくさんいます。

そして、イベントやもくもく会へ参加すれば、お悩み相談や話を聞いてくれる方がいらっしゃいます。

そういう「挫折しない環境が用意されている」というのも「転職クエスト」の大きなメリットです。

僕個人としては、これが最大のメリットかな、と思っています。

最後に

いかがでしたか。

少しでも「転職クエスト」のメリットが伝われば、と思います。

「もっと詳細が知りたい」

という方は特設LPで詳細を確認頂ければと思います。

「転職クエスト」特設LP

道を切り開くのは自分自身

もちろんコミュニティに入ったから絶対に内定が取れる、ってことではないので、ご理解お願いします。

とはいえ、個人的には

コミュニティ内でイベントに参加することで情報をかき集め、コンテンツを使い倒すこと

が内定への近道かな、と僕は思います。

「転職クエスト」は月額制のサービスなので、貧乏性の僕は特に使い倒しました(笑)

 


 

とにもかくにも、本記事が「業界未経験からエンジニア」を目指す方々のお役に立てれれば幸いです。

もし、ご縁あって「転職クエスト」に参加される方がいらっしゃれば、コミュニティ内に僕はいるので、不明点・不安点等あれば気軽に僕に声かけてください!

最後までご拝読頂き誠にありがとうございました!

【何が違うの?】PHPの"echo"と"print"

初めに

きっかけ

・業務のPHP研修中に

"echo"と"print"は厳密にいうと違いがある。

と恥ずかしながら初めて知ったのでメモ。

・元々PHPを使った個人開発経験はあったが、当時の成果物レベルでは"echo"を使おうが"print"を使おうが、どちらでもよかった。

・当時サボった分をここで取り戻そうということで、色々調べました。 (さすがに先人の方々がたくさん記事を書いておられました。)

公式マニュアルによると…

公式マニュアル:echo

・echo — 1 つ以上の文字列を出力する

・print との主な違いは、 echo がリスト形式の引数を受け付け、返り値を持たないことです。

公式マニュアル:print

・print — 文字列を出力する

・echo との主な違いは、 print が単一の引数のみ受け付け、常に 1 を返すことです。

実例①

例えば研修の教材で見たのは以下のような例。

<?php

echo "(1)私の趣味は" . "(2)テニスです。"; // ← syntax error ではない

print "(1)私の趣味は" . "(2)テニスです。"; // ← これは syntax error

?>

これは上記マニュアルに書いてある通り

"echo"は 1 つ以上の文字列を出力するのに対し、

"print"は単一の文字列しか出力しない

という違いがあるためです。

上記の例文は(1), (2)の2つの文字列がありますよね。

実例②

もう一つ"echo"と"print"の違いがわかる例文が後述する参考記事に記載がありました。

<?php

echo print "こんにちは" ; // ← syntax error ではない

print echo "こんにちは" ; // ← これは syntax error

?>

これは正直理解しきれているか不安ですが、

"echo"は複数の引数を受け付けるのに対して

"print"は単一の引数しか受け受けないことに起因しているのかな、と思います。

※記事を見ても僕が理解しきれなかったため、理解したタイミングでブレストしますm(__)m

↑こちらはもう少し理解できたので、まとめます。

ココで違いが生じる原因はズバリ、文章であるか、式であるかという違いに起因します。

echo:「~を出力する」という文=返り値を持たない

print:「~を出力する」という文=返り値を持つ

この知識を踏まえてもう一度先ほどのコードを見ると

<?php (1)echo (2)print "こんにちは" ; ?>  // ← syntax error ではない

コチラは

「(2) printの式の結果"こんにちは"を、(1) 出力する」

という文です。もっと短くすると

「(2) 式を、(1) 出力する」

となり、日本語的にも意味が通る。

<?php (3) print (4) echo "こんにちは" ; ?>  // ← これは syntax error

一方、こちら。

「(4) echoで"こんにちは"を出力し、(3) (4)の式(?)の結果を出力する」

という文になり、もっと短くすると

「(4) 出力し、(3) 式を出力する(?)」

と何とも無理やりな感じがする。

突っ込みどころとしては

そもそも(4)は出力することで、「文」として一区切りしている。

にもかかわらず、それを「式」として出力しようとしている点で矛盾が生じる。

ということで、エラーが生じるということになります。

参考資料

参考(Qiita)

所見

僕が2つの実例を知って思ったのは

「ただ、出力するだけなら変なsyntax error出ない"echo"のがいいじゃん」

でした。

参考記事の執筆者さん(PHPの記事でよく見かけるつよつよのお方…)も"echo"推しなので、基本"echo"使おうと思います。

以上、ご拝読ありがとうございました!