月: 2021年11月

  • LaravelのFormでmethodを変える方法

    LaravelのFormでmethodを変える方法

    表題の通り。

    HTTPメソッドは本来11種類あって、用途に応じてこれらを使い分ける。

    しかしHTMLのformタグでは「get」「post」の2種類のメソッドしか取り扱っていない。

    デフォルト以外のでやりとりするために、Laravelでは(?、他でも使えるかも)以下の方法でメソッドを変更することができる。

    Laravel固有の方法

    Laravel固有のタグ(?)を使う方法。

    多くの教材はこちらの方法を紹介してると思われる。

    書き方を以下に示す。

    <form action="/somewhere" method="post">
        @csrf
        @method('DELETE')
        <input type="text" name="name" id="">
        <input type="email" name="email" id="">
        <input type="password" name="password" id="">
        <button type="submit">送信する</button>
    </form>

    3行目の「@method(‘DELETE’)」のようにメソッドを@methodのあとに書くと、formタグのmethod=”xxx”を無視して、そちらが優先される。

    inputタグを使う

    自分が対応した仕事では上記の方法では何故か期待通りに動作しなかった。

    そのときに知った方法。

    Laravel以外でも動作するのかは未確認。

    <form action="/somewhere" method="post">
        @csrf
        <input type="text" name="name" id="">
        <input type="email" name="email" id="">
        <input type="password" name="password" id="">
        <button type="submit">送信する</button>
        <input type="hidden" name="_method" value="delete">
    </form>

    下から2行目にtype=”hidden”のinputタグが追加されていうのが分かるだろうか。

    この書き方でも大丈夫らしい👍

  • 新しく始めたプロジェクトをGitHubで開始する方法

    新しく始めたプロジェクトをGitHubで開始する方法

    表題通り。
    いつも忘れる、忘備録です。

    1. GitHubで新しいリポジトリを作成する
    2. GitHubでトークンを発行する
    3. ローカルでアプリケーションの雛形を作成する(Laravelとか)
    4. GitHubの1番上の要領に従って操作する
      1. git init
      2. git add .
      3. git commit -m “最初のコミット”
      4. git branch -M master
      5. git remote add origin https://(トークン)@github.com/~~~/~~~.git
      6. git push origin master

    これでローカルのアプリケーションをGitHubに登録(?)できる。

    後はSourceTreeで操作すれば完璧!!!

  • 【Laravel】EventとListenerについて

    【Laravel】EventとListenerについて

    仕事で既存の機能に新しい機能を追加しようと思っていた時に、既存の機能に「Event」などとこうものがあった。

    初めて聞いた用語だったので、どのようなものなのか調べてみた。

    Eventに対してListener

    僕が見たコードはEventしかなかったが、実はこのEventというのはListenerというヤツとセットになっている。

    一心同体である。

    簡単に言うと、Eventはイベント発火の「合図」の役割を担っている。

    それに対して、Listenerはその合図を実際に感知してイベントを「実行」する役割を担っている。

    Eventの長所の1つは、1つのEventが複数のListenerを実行させることができる点である。

    それを紐づけるEventServiceProvider

    先ほど紹介したEventとListenerは勝手に連動してイベントを実行するわけではない。

    これらは今紹介している「EventServiceProvider」によって紐づけられ、特定にEventには特定の Listenerが実行されるようになっている。

    Eventの書き方

    通常Eventはapp/Eventsディレクトリに書く。

    デフォルトの状態ではEventsディレクトリは存在しないかも知れないが、Atrisanコマンドによって簡単に生成できる。

    <?php
    use App\User;
    // 以下略
    
    class UserRegistered
    {
        use Dispatchable, InteractsWithSockets, SerializesModels;
        public $user;
        public function __construct(User $user)
        {
            $this->user = $user;
        }
    }

    正直よく分からん。

    Listenerの書き方

    一方でListenerは通常app/Listenersディレクトリに書く。

    artisanによって生成されるListenerファイルはhandleメソッドがデフォルトで用意されている。

    このhandleメソッドにはEventによって実際に実行される内容を書く。

    <?php
    namespace App\Listeners;
    
    use App\Events\UserRegistered;
    use Illuminate\Queue\InteractsWithQueue;
    use Illuminate\Contracts\Queue\ShouldQueue;
    
    use Mail;
    use App\Mail\WelcomeMail;
    
    class SendWelcomeEmail
    {
        public function __contruct()
        {
            //
        }
    
        public function handle(UserRegistered $event)
        {
            Mail::to($event->user->email)->send(new WelcomeMail());
        }
    }

    EventServiceProviderに書き方

    EventServiceProviderファイルはApp\Providersディレクトリに書く。

    ここにlistenプロパティに、実際に紐づけたEventとListenerを書いていく。

    <?php
    namespace App\Providers;
    
    use App\Events\UserRegistered;
    use App\Events\SendWelcomeEmail;
    use App\Events\RegisterMailMagazine;
    
    class EventServideProvider extends ServiceProvider
    {
        protected $listen = [
            UserRegisterd::class => [
                SendWelcomeEmail::class,
                RegisterMailMagazine::class,
            ],
            // 続く
        ];
    
        public function boot()
        {
            parent::boot();
            //
        }
    }

    Eventを発火させる

    • Event(発火)
    • Listener(実行)
    • EventServiceProvider(紐付け)

    の3つを完了したから、あとは最初の発火をさせるコードを書くだけ。

    例えばRegisterController.phpのcreateメソッドの中でeventヘルパー関数を使って、イベントを発火させるとする。

    <?php
    use App\Events\UserRegistered;
    
    protected function create(array $data)
    {
        $user = User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => Hash::make($data['password'])
        ]);
    
        event(new UserRegister($user));
    
        return $user;
    }

    こんな感じでEventを実行させたいタイミングでeventヘルパー関数を用いると、Eventが発火して、Listenerが内容を実行してくれる。

  • 間違えた内容をcommitしちゃった(泣)特定のcommitだけ取り消す方法

    間違えた内容をcommitしちゃった(泣)特定のcommitだけ取り消す方法

    タイトルの通りです。

    そうです。

    僕がこの記事を書いてるということは、仕事で誤った内容をcommitしちゃいました(泣)

    git周りは大かたsourcetreeに操作を任せているので、GitHubを使って管理をしていながら僕自身はあまりgitが得意ではありません。

    そんな恐らく五万といるであろう(希望論)僕みたいな人たちに向けて、今回は一度commitしてしまった特定のcommitのみを取り消す方法をご紹介します。

    revertコマンド

    見出しの通りです。

    今回はこのrevertコマンドを使います。

    これは「特定のコミットを取り消す」コミットを作成します。

    「復元する」というコミットを上書きをするって感じですね。

    ちなみに、調べていると頻出だったrevertに似たコマンドにresetがあります。

    resetは「コミット自体を履歴から取り消す」操作っぽいので、gitに履歴が残りません(たぶん)。

    個人的には保守運用の観点から、「コミットを取り消した」という履歴も残した方が良いと思うので、resetは使わずにrevertを使った方が良いと思います。

    Sourcetreeの場合

    1. Sourcetreeの「履歴」から取り消したいcommitを見つける
    2. 右クリックでメニューを開いて「コミット適用前に戻す…」をクリック
    3. 確認のダイアログが表示されますが、「はい」で続行

    これで完了です。現在のcommitに「commitを取り消した」というcommitが生成されます。

    この状態でcommit&pushすると、GitHubには「Revert “〜〜〜〜”」というcommitが加わります。

    Gitで操作する場合

    僕が慣れていないのであまりしたくありませんが、Gitコマンドのみで操作する場合もご紹介しておきます。

    1. GitHubで取り消したいcommitのid番号を控える
    2. 以下のコマンドを実行
      1. git revert xxx (xxxはcommitのid番号)
    3. commitメッセージは「:q」でそのまま保存

    以上が手順になります!

    皆さんはrevertしなくてもいいようにきちんと指示を聞いてからcommit&pushしましょう、、、(トホホ)

  • MAMP/XAMPPをインストールしたときに入っている機能

    MAMP/XAMPPをインストールしたときに入っている機能

    タイトルの通りです。

    先日、コーチングでプログラミングについてお教えしている生徒さんとのやり取りでXAMPPを扱うタイミングがありました。

    そのときに「MAMP(or XAMPP)って何が入っているんだろ🤔」と疑問に思いました。

    今回はMAMP/XAMPPに何が入っているかを調べました!

    含まれているコンポーネント

    MAMP/XAMPPのインストーラーで表示されるウィンドウを元にまとめました。

    • サーバー
      • Apache
      • MySQL
      • FileZilla FTP Server
      • Mercury Mail Server
      • Tomcat
    • プログラミング言語
      • PHP
      • Perl
    • プログラミング言語(?)
      • phpMyAdmin
      • Webalizer
      • Fake Sendmail

    こんな感じでした。

    感じたこと

    いろいろ入っていることが分かりました!

    正直メインで使うのはApache、MySQL、PHP、phpMyAdminくらいだと思います。

    FTPの1つであるFileZillaも入ってるんですね、知らなかったです😌

    知らないコンポーネントもたくさん入っていて、TomcatやWebalizerは聞いたことがありませんでした。

    3つ目の項目にも「Program languages」が重複していたのは何かの問題だと思います汗

  • 【Laravel】migrationでtableを削除する

    【Laravel】migrationでtableを削除する

    LaravelにはmigrationというDBを管理できる、DBのバージョン管理のようなサポート(≒機能)があります。

    これはLaravelのSchemaファサードに属しており、(Laravelが対応する)全てのDBシステムに対してtableを作成・操作するため、特定のDBに依存しないサポートを提供します。

    migrationは通常このFacadeを使用して、DBのtableとcolumnを作成・変更します。

    この機能を使えば、全てのエンジニアが同じDBを揃えることが可能になり、わざわざ手動でDBを変更する作業を行わなくてもよくなります。

    tableを削除する方法

    Laravelのmigrationでは、既存のtableを削除するときにはdropまたはdropIfExistsメソッドを使います。

    migrationを生成するときは以下の様にmake:migrationArtisanコマンドを使用してmigrationファイルを生成します。

    php artisan make:migration create_flights_table

    先ほど挙げた通り、tableの削除はdropまたはdropIfExistsなので、恐らくファイル名は以下でok。

    php artisan make:migration drop_flights_table

    migrationの構造

    migrationファイルには2つのメソッドが必要です。upメソッドとdownメソッド。

    upメソッドはDBに新しいテーブル、カラム、またはインデックスを追加するために使用します。

    downメソッドはupメソッドで実行したのと逆の操作をする。以前の状態に戻せます。

    <?php
    
    use Illuminate\Database\Migrations\Migration;
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Support\Facades\Schema;
    
    class CraeteFlightsTable extends Migration
    {
        /**
         * マイグレーションの実行
         *
         * @return void
         */
        public function up()
        {
            Schema::create('flights', function (Blueprint $table) {
                $table->id();
                $table->string('name');
                $table->string('flights');
                $table->timestamp();
            });
        }
    
        /** マイグレーションを戻す
         *
         * @return void()
         */
        public function down()
        {
            Schema::drop('flights');
        }
    }

    migrationの実行

    以下のコマンドを実行すると、未処理のmigrationファイルをすべて実行することができます。

    php artisan migrate

    どのmigrationファイルが実行されているかを確認するには以下のコマンドを実行で確認できます。

    php artisan migrate:status
  • LaravelのMass Assignmentとは

    LaravelのMass Assignmentとは

    Mass Assignment(マスアサインメント)とは

    コンピュータ脆弱性の1つ。本来権限を持っていないユーザー(や悪意ある第三者)によってデータ項目を変更されること。

    通常はWebサイトにあるフォームからデータをやりとりすることを想定しているが、(例えば開発者ツールなどを使って)そのフォームのname属性を改変し(例えばname=’password’などとし)それをフォームから送信するとする。もしバックエンドで属性をvalidateせずに保存するような処理が書かれているとすると、DBに同じ名前のカラムが存在したときにそれを予期せぬ方法で上書きできてしまう。

    一行だけで新しいモデルを保存するには、createメソッドを利用できます。挿入されたモデルインスタンスが、メソッドから返されます。しかし、これを利用する前に、Eloquentモデルはデフォルトで複数代入から保護されているため、モデルへfillableguarded属性のどちらかを設定する必要があります。
    複数代入の脆弱性はリクエストを通じて予期しないHTTPパラメーターが送られた時に起き、そのパラメーターはデータベースのカラムを予期しないように変更できてしまうでしょう。たとえば悪意あるユーザーがHTTPパラメーターでis_adminパラメーターを送り、それがモデルのcreateメソッドに対して渡されると、そのユーザーは自分自身を管理者(administrator)に昇格できるのです。

    Laravel 7.x Eloquent:利用の開始 > 複数代入

    DBやテーブルは一般に分かりやすい名前のものが多いので、攻撃者による攻撃に的になり得る。

    Mass Assignmentはこの様な脆弱性、またはそれを利用した攻撃のことを指す。

    Laravelでマスアサインメントを阻止する

    Eloquentモデルを使ってcreateするとき、なにも設定しないとMassAssignmentExceptionというエラーに遭遇する。

    それを解消する2つの方法

    • ブラックリスト
    • ホワイトリスト

    ブラックリスト

    以下の様に、指定した要素をguardすることでそれ以外の要素をcreateに渡すことができる。

    class User extends Eloquent {
        protected $guarded = array('id', 'year');
    }

    上記の様に記述すればcreateからidとyear以外の要素を渡すことができる。

    idとyearをguard(=保護)している。

    ホワイトリスト

    以下の様に、指定した要素をfillableにして許可を与えることで、その要素のみをcreateから渡すkとができる。

    class User extends Eloquent {
        protected $fillable = array('name', 'age');
    }

    上記の様に書くことでcreateからnameとageの要素を変更可能(=fillable)にしている。