20200715のlaravelに関する記事は12件です。

Laravel 6.x→7.xバージョンアップ

Laravel 6.x→7.xバージョンアップ方法

概要

Laravelのバージョンを6.x→7.xにアップする方法をご紹介します。
基本的には公式ドキュメント様の言う通りです。
なお、今回ご紹介するのはバージョンアップ対応で必要な最低限の項目になります。
詳細は 公式ドキュメント を参照ください。

手順

1. 現在のバージョン確認

% php artisan --version
Laravel Framework 6.18.25

2. composer.jsonの編集

composer.jsonを直接触るのは嫌なのですが、、、公式がそう記載しているので仕方ないですね。

前提

  • Symfony 5以上
  • PHP 7.2.5以上

編集要点

  • laravel/framework: "^7.0"
  • nunomaduro/collision: "^4.1"
  • phpunit/phpunit: "^8.5"
  • laravel/tinker: "^2.0"
  • facade/ignition: "^2.0"

Before

composer.json
{
    "name": "laravel/laravel",
    "type": "project",
    "description": "The Laravel Framework.",
    "keywords": [
        "framework",
        "laravel"
    ],
    "license": "MIT",
    "require": {
        "php": "^7.2",
        "ext-fileinfo": "*",
        "barryvdh/laravel-dompdf": "^0.8.5",
        "bensampo/laravel-enum": "^1.28",
        "fideloper/proxy": "^4.0",
        "laravel/framework": "^6.2",
        "laravel/tinker": "^1.0",
        "laravel/ui": "^1.2",
        "nesbot/carbon": "^2.27"
    },
    "require-dev": {
        "barryvdh/laravel-ide-helper": "^2.6",
        "facade/ignition": "^1.4",
        "fzaninotto/faker": "^1.4",
        "mockery/mockery": "^1.0",
        "nunomaduro/collision": "^3.0",
        "phpunit/phpunit": "^8.0"
    },
    "config": {
        "optimize-autoloader": true,
        "preferred-install": "dist",
        "sort-packages": true
    },
    "extra": {
        "laravel": {
            "dont-discover": []
        }
    },
    "autoload": {
        "psr-4": {
            "App\\": "app/"
        },
        "classmap": [
            "database/seeds",
            "database/factories"
        ]
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
        }
    },
    "minimum-stability": "dev",
    "prefer-stable": true,
    "scripts": {
        "post-autoload-dump": [
            "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
            "@php artisan package:discover --ansi"
        ],
        "post-root-package-install": [
            "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
        ],
        "post-create-project-cmd": [
            "@php artisan key:generate --ansi"
        ]
    }
}

After

composer.json
{
    "name": "laravel/laravel",
    "type": "project",
    "description": "The Laravel Framework.",
    "keywords": [
        "framework",
        "laravel"
    ],
    "license": "MIT",
    "require": {
        "php": "^7.2",
        "ext-fileinfo": "*",
        "barryvdh/laravel-dompdf": "^0.8.5",
        "bensampo/laravel-enum": "^1.28",
        "fideloper/proxy": "^4.0",
        "laravel/framework": "^7.0",
        "laravel/tinker": "^2.0",
        "laravel/ui": "^1.2",
        "nesbot/carbon": "^2.27"
    },
    "require-dev": {
        "barryvdh/laravel-ide-helper": "^2.6",
        "facade/ignition": "^2.0",
        "fzaninotto/faker": "^1.4",
        "mockery/mockery": "^1.0",
        "nunomaduro/collision": "^4.1",
        "phpunit/phpunit": "^8.5"
    },
    "config": {
        "optimize-autoloader": true,
        "preferred-install": "dist",
        "sort-packages": true
    },
    "extra": {
        "laravel": {
            "dont-discover": []
        }
    },
    "autoload": {
        "psr-4": {
            "App\\": "app/"
        },
        "classmap": [
            "database/seeds",
            "database/factories"
        ]
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
        }
    },
    "minimum-stability": "dev",
    "prefer-stable": true,
    "scripts": {
        "post-autoload-dump": [
            "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
            "@php artisan package:discover --ansi"
        ],
        "post-root-package-install": [
            "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
        ],
        "post-create-project-cmd": [
            "@php artisan key:generate --ansi"
        ]
    }
}

3. App\Exceptions\Handlerの編集

app/Exceptions/Handler.phpを編集します。

編集要点

ExceptionからThrowableに変更します。
注: ちゃんとparentを継承するようにしないと後々エラーになってしまいます。
詳しくはAfterを参照してください。

use Throwable;

public function report(Throwable $exception);
public function shouldReport(Throwable $exception);
public function render($request, Throwable $exception);
public function renderForConsole($output, Throwable $exception);

Before

<?php

namespace App\Exceptions;

use Exception;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;

class Handler extends ExceptionHandler
{
    /**
     * A list of the exception types that are not reported.
     *
     * @var array
     */
    protected $dontReport = [
        //
    ];

    /**
     * A list of the inputs that are never flashed for validation exceptions.
     *
     * @var array
     */
    protected $dontFlash = [
        'password',
        'password_confirmation',
    ];

    /**
     * Report or log an exception.
     *
     * @param  \Exception  $exception
     * @return void
     */
    public function report(Exception $exception)
    {
        parent::report($exception);
    }

    /**
     * Render an exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Exception  $exception
     * @return \Illuminate\Http\Response
     */
    public function render($request, Exception $exception)
    {
        return parent::render($request, $exception);
    }
}

After

<?php

namespace App\Exceptions;

use Throwable;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;

class Handler extends ExceptionHandler
{
    /**
     * A list of the exception types that are not reported.
     *
     * @var array
     */
    protected $dontReport = [
        //
    ];

    /**
     * A list of the inputs that are never flashed for validation exceptions.
     *
     * @var array
     */
    protected $dontFlash = [
        'password',
        'password_confirmation',
    ];

    /**
     * Report or log an exception.
     *
     * @param  Throwable  $exception
     * @return void
     */
    public function report(Throwable $exception)
    {
        parent::report($exception);
    }

    public function shouldReport(Throwable $exception)
    {
        parent::shouldntReport($exception);
    }

    /**
     * Render an exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  Throwable  $exception
     * @return \Illuminate\Http\Response
     */
    public function render($request, Throwable $exception)
    {
        return parent::render($request, $exception);
    }

    public function renderForConsole($output, Throwable $exception)
    {
        parent::renderForConsole($output, $exception);
    }
}

4. sessionファイル編集

app/config/session.phpを編集します。

Before

'secure' => env('SESSION_SECURE_COOKIE', false),

After

'secure' => env('SESSION_SECURE_COOKIE', null),

5. Composer update

% composer update

6. Laravel/uiの設定

composerのrequireセクションにて"2.0"以上が必要なようです。

% composer require laravel/ui "^2.0"

7. 確認

% php artisan --version
Laravel Framework 7.19.1

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】諸々復習

書籍のアウトプットとして

ルーティング

ルート情報の基本(GET)

Route::get(アドレス,関数等)

第2引数はクロージャ。

function (){
  return ;
}

returnで返される値が表示内容。

view

view(テンプレ名)

テンプレファイルをトードしてレンダリングして返す。
テンプレはresources/viewsフォルダの中に作る

コントローラの利用

シングルアクションコントローラの利用

1つのコントローラに1つのアクションだけしか用意しないという設計のこと
要するに
コントローラ:アクション=1:1

シングルアクションメソッドの基本形
class クラス名 extends Controller
{
    public function __invoke()
    {
        //アクション処理
    }
}

これ以外にアクションメソッドは用意しない。
ルート情報の記述も変わってくる。

ルート情報
Router::get('アドレス','コントローラ名');

invokeはPHPの基本機能

__invokeはPHPのマジックメソッド
__invokeはそのクラスのインスタンスを関数的に実行する。
インスタンスに()をつけて関数として呼び出せる。
したがってコントローラに限らず一般的なクラスも「インスタンスをそのまま関数として実行させたい」という場合に利用される。

リクエストとレスポンス

ResponseとRequestをアクションメソッドで利用するにはこうする

public function index(Request $request,Response $response){...

引数に追加するだけで使えるようになる。

なぜ追加するだけで使えるのか

理解のためには「サービス」と「サービスコンテナ」の機能を知る必要がある。
アクションメソッドに引数を追加することで、サービスコンテナによって対応するクラスのインスタンスがその引数に渡されていた。
この機能はメソッドインジェクションという

PHPテンプレートの利用

ビューについて

テンプレはLaravelのビューを担当する。

ルート情報でテンプレを表示する

viewメソッド

view('フォルダ名.テンプレ名')

テンプレはviewsフォルダから検索される。
例えば、view('hello.index')なら
views/helloフォルダの
index.phpファイルが読み込まれる。

単にview('hello')だけならhelloという名前のファイルを探してしまう。

サービスとビューコンポーザ

ビューコンポーザ

コントローラとは別にビジネスロジックを使って必要な情報などを処理しビューにデータを結合する機能。

ビューのビジネスロジック

ビューコンポーザを作ってアプリに登録することでビューをレンダリングする際に処理を自動実行できる。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel5.5】 tinkerコマンドで管理者ユーザー登録

やりたいこと

今回はタイトルにもある通り、tinkerコマンドを使い管理者(Admin側)でのユーザー登録の流れを解説しようと思います。

なぜコマンドで登録するのか

Laravelでは標準で用意されている会員登録機能が認証(Auth側)のみ用意されており、管理者ユーザーのテーブルで直接パスワードを入力してインサートしてもハッシュ化されていないためログインが出来ません。
そのためtinkerコマンドでハッシュ化したパスワードをインサートする必要が出てくる場合があります。

コマンド操作流れ

tinker
php artisan tinker
Psy Shell v0.9.12 (PHP 7.1.29  cli) by Justin Hileman
>>> use App\Admin;
>>> $admin = new Admin();
=> App\Admin {#2914}
>>> $admin->name = 'ユーザー名';
=> "ユーザー名"
>>> $admin->email = 'hoge@hoge.co.jp';
=> "hoge@hoge.co.jp"
//bcrypt関数でハッシュ化
>>> $admin->password = bcrypt('パスワード');
=>"ハッシュ化されたパスワード"
>>> $admin->save();
=> true
//quitまたはexitでtinkerの終了
>>> quit

こちらがtinkerコマンドでの管理者ユーザー登録の一連になります。
tinkerはメソッド等実行出来るのでデバッグや実際の動きを確認したり、
テーブルに登録されているユーザーの一覧を取得出来たり便利なので積極的に使いたいですね!

以上になります!LGTMを押していただけると励みになります。
お疲れ様でした!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel バージョン確認コマンド

はじめに

これは初心者エンジニアがフルスタックエンジニアを目指すための備忘録である

Laravelバージョン確認コマンド

php artisan --version

または

php artisan -V

のどちらかです。

php artisan -v

// これが出たらOK!

Laravel Framework 5.8.38 

//←投稿者:現在のバージョン

以上です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

The GET method is not supported for this route. Supported methods: POST.のエラー

忘れっぽすぎるのでメモるぞ。

createからconfirmに遷移する時にこのエラーが出るぽよぴえん;;
The GET method is not supported for this route. Supported methods: POST.

バリデーションに引っかかって、内部でエラーを返すときにGET送信されているから
このエラーが出る!バリデーションに引っかからないようにしような〜〜!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[データ配布] Laravel + Reactのアーキテクチャ設計

Laravel + React シンプルなTodoアプリ(アーキテクチャ設計)

構成

  • Laravel: CRUD API(updateは未実装)
  • React: フォーム送信機能

Laravel環境構築

  • Laravel 5.8
  • React
  • VirtialBox
  • Vagrant
  • Macの場合、Xcode、Homeblue必須

Laravel環境構築 チートシート
この記事内のvagrant@homestead:~$ cd codeまでおこなってください。
Laravelデータは作成した方を入れるのでデフォルトデータはクローンしなくて大丈夫です。

GitHubデータをクローン

どこでもいいのでデータクローン。
使うのは中身のファイルです。

# 別ウィンドウでターミナルを立ち上げて(コマンド+T)
$ cd Desktop
$ git clone https://github.com/dai-570415/laravel-react-example.git

クローンできたら
中身のファイル一式を「/Laravelファイル名/code/」ディレクトリに直接移動

# Laravelプロジェクト側

# 依存関係インストール
vagrant@homestead:~$ npm install
# テーブル生成
vagrant@homestead:~$ php artisan migrate
# React監視
vagrant@homestead:~$ npm run watch-poll

こちらで無事表示できたかと思います。

中身の説明はGit Hubにまとめましたので、そちらからみてください。
Git Hub

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel npm installを実行しようとしたらエラーが出た話 超簡易版

目的

  • Laravelアプリに必要なJSパッケージをインストールするためにnpm installを実行したがエラーが出た話をまとめる

問題までの経緯

  1. Laravelアプリ名ディレクトリの一つ上の階層で下記コマンドを実行した。

    $ npm install
    

問題

  1. 下記エラーが発生しコマンドが正常実行されない。

    npm WARN saveError ENOENT: no such file or directory, open '/usr/share/nginx/html/package.json'
    npm WARN enoent ENOENT: no such file or directory, open '/usr/share/nginx/html/package.json'
    npm WARN html No description
    npm WARN html No repository field.
    npm WARN html No README data
    npm WARN html No license field.
    
    audited 15 packages in 0.511s
    
    3 packages are looking for funding
      run `npm fund` for details
    
    found 0 vulnerabilities
    

問題解決までの経緯

  1. $ npm installを実行するディレクトリを間違えていた。
  2. Laravelアプリ名ディレクトリに移動して$ npm installを実行したところ正常に実行された。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelの最短ページ作成流れ

LaravelのMVCモデルの構造上、以下3つを作れば最低限のページ作成ができる。
細かい繋ぎ込みは省く。

①routes /web.phpにルーティングを記入 

('/アドレス名','使いたいコントローラーの中にあるfunction関数名を記載')
 スクリーンショット 2020-07-14 23.41.42.png

②app/Http/Controllers /PostsController.phpにshowメソッドを記入

例:public function 名前(){
return view('表示したいviewsの名前')
}
スクリーンショット 2020-07-14 23.50.57.png

③resources/views /"ページ名".blade.phpにhtml文を記入

 

イメージ画像 https://miyabi-lab.space/blog/22

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】バリデータ オリジナルバリデータの作成から

書籍アウトプットとして

オリジナルバリデータの作成

Illuminate\Validation\Validatorクラスを継承したクラスを新しく作成する。

基本形がこれ。

use Illuminate\validation\Validator;

class クラス名 extends Validator
{
    public function validate〇〇($attribute, $balue, $parameters)
    {
        //バリデーションの処理
        return 真偽値;
    }
}

validate〇〇という名前のメソッドを用意する.

例えば、validateAbcという名前で用意すれば'abc'というルールとして扱われる。
またバリデーションの処理をして真偽値を返す。

真偽値 説明
true 問題なし
false バリデーションエラー

HelloValidatorを作成する

バリデータクラスは手作業で作成していく。
Http/Validators/HelloValidator.phpというファイルを作ってそこに書いていく

HelloValidator.php
<?php
namespace App\Http\Validator;

use Illuminate\Validation\Validator;

class HelloValidator extends Validator
{
    public function validateHello($attribute, $value, $parameters)
    {
        return $value%2==0;
    }
}

ここでreturn $value%2==0;を返して、偶数なら許可としている。

HelloValidatorを組み込む

組み込みにはサービスプロバイダを利用する。

public function boot()
    {
        $validator=$this->app['Validator'];
        $validator->resolver(function ($translator, $data, $rules, $message) {
            return new HelloValidator($translator, $data, $rules, $message);
        });
    }

バリデータは$this->app['validator']に保管されている。
このresolverというメソッドでリゾルブ(バリデーションの処理を行う)の処理を設定できる。
引数は以下のようなクロージャ

function ($translator, $data, $rules, $message) {
            return Validator;
        }

ここではバリデータのインスタンスをreturnすることで、このクラスをバリデーションの処理として設定している。

HelloValidatorのルールを使用する

class HelloRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        if ($this->path()=='hello') {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
          'name'=>'required',
          'mail'=>'email',
          'age'=>'numeric|hello',
        ];
    }
    public function messages()
    {
        return [
        'name.required'=>'名前は必須項目',
        'mail.email'=>'メアドは必要',
        'age.numeric'=>'整数で記入',
        'age.hello'=>'Hello 入力は偶数のみ受付',
      ];
    }
}

HelloRequestクラスを修正する。
agenumeric|helloという形で検証ルールを設定
エラーメッセージはage.helloを指定して設定。
次はコントローラの修正

class HelloController extends Controller
{
    public function index(Request $request)
    {
return view('hello.index',['msg'=>'フォームを入力']);
    }
    public function post(Request $request)
    {
      return view('hello.index',['msg'=>'正しく入力された']);
    }
}

これで/helloにアクセスする

Validator::extendを利用する

独自のバリデータクラスの作成をしないほどのカスタマイズしたい場合にはValidatorクラスのextendメソッドを使う

Validator::extends(名前,クロージャ);

これで第1引数に指定した名前で第2引数のクロージャをルールとして追加する。

第2引数のクロージャ
function($arrtivute,$value,$parameters,$validator){
  //バリデーションの処理
  return 真偽値;
} 

$arrtivute,$value,$parametersの引数に加えてバリデータのインスタンスを渡す。

これを使って先の独自バリデータクラスを同じことをしてみる。
HelloServiceProvierクラスを修正する。

public function boot()
    {
        Validator::extend('hello', function ($arrtivute, $value, $parameters, $validator) {
            return $value%2==0;
        });
    }

Validator::extendは手軽だが汎用性がない。
1つのコントローラでしか使わないルールはこれで作り
いくつものコントローラで利用する場合はバリデーションクラスを作るという使い分けが良い。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Githubのプルリク時に発生するエラー「You can't perform that action at this time.」の解決法

起きた問題

laravelで掲示板らしきものをgithubで管理しながら、制作していた時に急にプルリクができなくなってしまった。

環境

dockerとlaravelとgithub

発生したエラー

dockerコンテナの外から

git add .
git commit -m "コミット名"
git push origin "ブランチ名"

をし、github上でプルリクをしようとしたが、
スクリーンショット 2020-07-15 13.01.16.png
上記の赤枠内の部分が表示されない。仕方なく、
スクリーンショット 2020-07-15 0.56.48.png
黒枠からプルリクを選択→create pull requestを選択

Pull request creation failed. Validation failed You can't perform that action at this time.

というエラーがgithub上に出力された。

原因

制作した掲示板はgithubログインできる使用だったのだが、その掲示板に今ログインしているuserとプルリクしたgithubのアカウントが異なっていたためと思われる。

解決策

掲示板をプルリクしたいgithubアカウントでログインし直すと解決できた。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】プロフィール画像アップロード

実装したいこと

  • usersテーブルにプロフィール画像を追加
  • デフォルト画像を用意
  • プロフィール画像変更
  • 変更時、選択した画像を表示
  • アップロード時、画像をリサイズ

前提

  • Laravel7
  • マイグレーション済み
  • routes/web.phpにRoute::resource('user', 'UserController');を記述済み

実装

データベースに画像のファイル名を保存しておいて、そのファイル名をもとに画像の読み出しを行う、という戦略をとることとします。
画像の保存場所はpublic/storage/profiles/とします。このディレクトリにあらかじめデフォルトの画像を配置しておいてください。

profile_imageカラムの追加

マイグレーションファイルを作成します。

% php artisan make:migration add_column_to_users_table --table=users

カラムを追加する処理を書きます。

database/migrations/20XX_00_00_000000_add_column_to_users_table.php
class AddColumnToUsersTable extends Migration
{
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('profile_image')->default('default.png');
        });
    }

    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('profile_image');
        });
    }
}

マイグレーション

% php artisan migrate

User.phpの$fillableにカラムを追加

app/User.php
    protected $fillable = [
        'name', 'email', 'password', 'profile_image'
    ];

画像の表示

画像の表示の一例を以下に示します

コントローラー

app/Http/Controllers/ProfileController.php
    public function profile() {
        $user = Auth::user();
        return view('profile', ['user' => $user]);
    }

ビュー

resources/views/profile.blade.php
<img src="{{ asset('storage/profiles/'.$user->profile_image) }}" alt="プロフィール画像">

プロフィール画像編集(アップロード)

ここで、Intervention Imageを用います。
Intervention Imageを使用するには、以下のコマンドを実行するだけでいいです。

% composer require intervention/image

Intervention Imageの使い方は以下のブログを参考にしました。
完全網羅!Intervention Image(PHP)で画像を編集する全実例
公式はこちら

コントローラー
Intervention Imageでの処理は、saveProfileImage()内で行っています。
バリデーションはフォームリクエストUserRequestで行います。(省略)

app/Http/Controllers/UserController.php
    public function edit($id) {
        $user = Auth::user();
        return view('user.edit', ['user' => $user]);
    }

    public function update($id, UserRequest $request) {
        $user = Auth::user();
        $form = $request->all();

        $profileImage = $request->file('profile_image');
        if ($profileImage != null) {
            $form['profile_image'] = $this->saveProfileImage($profileImage, $id); // return file name
        }

        unset($form['_token']);
        unset($form['_method']);
        $user->fill($form)->save();
        return redirect('/home');
    }

    private function saveProfileImage($image, $id) {
        // get instance
        $img = \Image::make($image);
        // resize
        $img->fit(100, 100, function($constraint){
            $constraint->upsize(); 
        });
        // save
        $file_name = 'profile_'.$id.'.'.$image->getClientOriginalExtension();
        $save_path = 'storage/profiles/'.$file_name;
        $img->save($save_path);
        // return file name
        return $file_name;
    }

ビュー

  • 現在のプロフィール画像を最初に表示
  • プロフィール画像をクリックしたら、画像ファイルを選択できる
  • 選択した画像ファイルが表示される

以上を満たすように実装します。
「選択画像が変化したらアップロードしようとしている画像を表示する」といった処理をJavaScriptで実装しています。

ファイルをアップロードするためには、enctype="multipart/form-data"をformタグに追加する必要があります。

resources/views/user/edit.blade.php
<form method="post" action="{{ route('user.update', ['user' => $user->id]) }}" enctype="multipart/form-data">
  @csrf
  @method('PATCH')

  <label for="profile_image">プロフィール画像</label>

  <label for="profile_image" class="btn">
    <img src="{{ asset('storage/profiles/'.$user->profile_image) }}" id="img">
    <input id="profile_image" type="file"  name="profile_image" onchange="previewImage(this);">
  </label>

  <button type="submit" class="btn btn-primary">
    変更
  </button>
</form>

<script>
  function previewImage(obj)
  {
    var fileReader = new FileReader();
    fileReader.onload = (function() {
      document.getElementById('img').src = fileReader.result;
    });
    fileReader.readAsDataURL(obj.files[0]);
  }
</script>

SASS(CSS)

input#profile_image {
    display: none;
}

おわり

画像のリサイズやJavaScriptの部分は一例に過ぎないので、他のサイトで別の方法をとてもいいかも
Intervention Imageは便利なので上で紹介したサイトで勉強してみては?

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelで同じURLにルーティングをする方法

概要

Laravelでルーティングをしようと思った際に困ったことがあり、ネットにあまり情報がなかったので備忘録として投稿しました。
初めてQiitaに投稿するので至らないところがあると思いますがご了承下さい。
また、PHPに触れるのも2,3週間ほどしか経っていないです。

困ったこと

/routes/web.phpにルーティングについての記述をしていました。

/routes/web.php
Route::get('/sql/hogehoge', function () {
    return view('sql/hogehoge');
});

Route::get('/sql/hogehoge/', 'SQLController@search');
Route::post('/sql/hogehoge/', 'SQLController@searchResults');

Route::get('/sql/hogehoge/', 'SQLController@index1_search');
Route::post('/sql/hogehoge/', 'SQLController@index1_searchResults');

SQLController.php
public function search(){
       $sql = "SELECT name FROM tables";
       $stmt = $pdo->prepare($sql);
       $stmt->execute(); 

       return view('sql/hogehoge', [
            'names' => $stmt
        ]);
}

public function searchResults(){

    $name_id = request('name');
    return $name_id;
}

public function index1_search(){
       $sql = "SELECT date FROM tables";
       $stmt = $pdo->prepare($sql);
       $stmt->execute();

       return view('sql/hogehoge', [
            'dates' => $stmt
        ]);
}
public function index1_searchResults(){
       $date_id = request('date');
       return $date_id;
}

Route::get()の第1引数にはURLを書きます。第2引数にはどこのメソッドで処理をするのか書きます。
上記の例ですとhttp://localhost/sql/hogehoge と検索したときにSQLController.phpにあるsearchメソッドが呼び出されて処理が行われるという意味になります。

また、SQLController.phpで処理したデータを表示させるために以下のresult.php(仮称)を作成しました。

result.php
 <form action ="./SQLController" method="POST">

                <label for="Hogehoge">Hogehoge</label>
                <select class="form-control" id="name" name="name">
                    <option value="" selected></option>  
                    <?php 
                        if(isset($names))
                        foreach ($names as $v) { ?>
                        <option value=<?php echo $v["first"]; ?>><?php echo $v["last"]; ?></option>
                    <?php } ?>
                </select>
                </form>

 <form action ="./SQLController" method="POST">

                <label for="Tournament">Tournament</label>
                <select class="form-control" id="date" name="date">
                    <option value="" selected></option>  
                    <?php 
                        if(isset($dates))
                        foreach ($dates as $v) { ?>
                        <option value=<?php echo $v["month"]; ?>><?php echo $v["year"]; ?></option>
                    <?php } ?>
                </select>
                </form>

だいぶ省略していますがこれを実行しようとするとプルダウンメニューがname用とdate用で2つでてくるのですが、なんとdate用のプルダウンメニューしかsqlの処理がなされませんでした。name用のプルダウンメニューには何も表示されませんでした。

原因

原因はweb.phpにありました。

/routes/web.php
Route::get('/sql/hogehoge/', 'SQLController@search');
Route::post('/sql/hogehoge/', 'SQLController@searchResults');

Route::get('/sql/hogehoge/', 'SQLController@index1_search');
Route::post('/sql/hogehoge/', 'SQLController@index1_searchResults');

上記ではRoute::getの第1引数が同じものを使っていることがわかると思います。
同じものを記述するとあとに記述したもの(ここではSQLController@index1_searchResults)が優先されて実行されるようです。
実際そのような結果が筆者は確認できました。

解決方法

同じ第1引数を記述したことに原因があるのでそれについて変更を加えました。
web.phpは処理をするメソッドを一つにまとめました。

/routes/web.php
Route::get('/sql/hogehoge/', 'SQLController@search');
Route::post('/sql/hogehoge/', 'SQLController@searchResults');

それにともないSQLController.phpのほうのメソッドも一つにまとめました。

SQLController.php
public function search(){
       $name_sql = "SELECT name FROM tables";
       $name_stmt = $pdo->prepare($name_sql);
       $name_stmt->execute(); 

       $date_sql = "SELECT date FROM tables";
       $date_stmt = $pdo->prepare($date_sql);
       $date_stmt->execute();


       return view('sql/hogehoge', [
            'names' => $name_stmt, 
            'dates' => $date_stmt
        ]);
}

public function searchResults(){

    $name_id = request('name');
    return [$name_id, $date_id];
}

メソッドで複数の値を返したいときはreturn [];の形で書きます。

以上のようにしてみたら上手く複数のプルダウンメニューが表示できるようになりました。

おわりに

コードは適当に変数や値をつけてしまった部分があるので間違いがあると思います。
ほかにもいい方法があるのかもしれませんが、3,4時間ほど悩んでようやく解決できた苦痛を他の方々にも味わってほしくないと思い、ここに書き記しました。

なにか間違い等ありましたら教えて下さい。また、ほかにもなにかいい方法がありましたら教えて下さい。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む