20200430のlaravelに関する記事は11件です。

Laravelのルーティング基本

web.php

routes\web.php
ルーティングに関する情報の記載。

記入内容
・アドレス指定
・コントローラを指定
・コントローラのメソッドを指定

コントローラ

Http\Controllers\コントローラ名

php artisan make::controller コントローラ名

で作成する。
作成されたコントローラは、Http\Controllers\コントローラ名 に作成される。

useでrequrestやresponseやフォームリクエスト等のクラスをインポートし、メソッドの引数で読み込むことで利用可能にする。

return view('テンプレートフォルダ名', 渡す値);

この第1引数に読み込むテンプレートフォルダ名を記入。helloフォルダのindexファイルの場合は、hello.indexと記入する。
第2引数の値は、配列。この値をテンプレートに渡す。

Bladeテンプレート

resourdes\views\フォルダ名.blade.php

{{$変数名}}で、コントローラ等から渡された値を表示できる。

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

[WIP] ヘルパ DI クラス一覧

以下は全ヘルパと実際のクラスまたは代替の一覧です。

配列とオブジェクト

helper class method
Arr::* Illuminate\Support\Arr *
data_fill Illuminate\Support\Arr add ※1
data_get Illuminate\Support\Arr get ※1
data_set Illuminate\Support\Arr set ※1
head Illuminate\Support\Arr first ※1
last Illuminate\Support\Arr end ※1

※1 代替。同じではない。

パス

helper class method
app_path Illuminate\Foundation\Application path
base_path Illuminate\Foundation\Application basePath
config_path Illuminate\Foundation\Application configPath
database_path Illuminate\Foundation\Application databasePath
mix Illuminate\Foundation\Mix そのまま呼ぶ(__invoke)
public_path Illuminate\Foundation\Application publicPath
resource_path Illuminate\Foundation\Application resourcePath
storage_path Illuminate\Foundation\Application storagePath

文字列

helper class method
__ Illuminate\Translation\Translator get
class_basename
e
preg_replace_array
Str::* Illuminate\Support\Str *
trans(引数なし) Illuminate\Translation\Translator
trans(引数あり) Illuminate\Translation\Translator get
trans_choice Illuminate\Translation\Translator choice

URL

helper class method
action Illuminate\Routing\UrlGenerator action
asset Illuminate\Routing\UrlGenerator asset
route Illuminate\Routing\UrlGenerator route
secure_asset Illuminate\Routing\UrlGenerator asset(第2引数に true を指定)
secure_url Illuminate\Routing\UrlGenerator to(第3引数に true を指定)
url(引数なし) Illuminate\Routing\UrlGenerator
url(引数あり) Illuminate\Routing\UrlGenerator to

その他

helper class method
abort Illuminate\Foundation\Application abort
abort_if Illuminate\Foundation\Application abort と if 文など
abort_unless Illuminate\Foundation\Application abort と if 文など
app(引数なし) Illuminate\Foundation\Application
app(引数あり) Illuminate\Foundation\Application make
auth(引数なし) Illuminate\Auth\AuthManager
auth(引数あり) Illuminate\Auth\AuthManager guard
back Illuminate\Routing\Redirector back
bcrypt Illuminate\Contracts\Hashing\Hasher driver('bcrypt')->make
blank
broadcast Illuminate\Contracts\Broadcasting\Factory event
cache(引数なし) Illuminate\Cache\CacheManager
cache(引数あり) Illuminate\Cache\CacheManager get または put
class_uses_recursive
collect Illuminate\Support\Collection make
config(引数なし) Illuminate\Config\Repository
config(引数あり) Illuminate\Config\Repository get または set
cookie(引数なし) Illuminate\Contracts\Cookie\Factory
cookie(引数あり) Illuminate\Contracts\Cookie\Factory make
csrf_field
csrf_token Illuminate\Session\SessionManager token
dd
decrypt Illuminate\Encryption\Encrypter decrypt
dispatch
dispatch_now Illuminate\Contracts\Bus\Dispatcher dispatchNow
dump
encrypt Illuminate\Encryption\Encrypter encrypt
env Illuminate\Support\Env get
event Illuminate\Events\Dispatcher dispatch
factory Illuminate\Database\Eloquent\Factory of
filled
info Illuminate\Log\LogManager info
logger(引数なし) Illuminate\Log\LogManager
logger(引数あり) Illuminate\Log\LogManager debug
method_field
now Illuminate\Support\DateFactory now
old Illuminate\Http\Request old
optional
policy Illuminate\Contracts\Auth\Access\Gate getPolicyFor
redirect(引数なし) Illuminate\Routing\Redirector
redirect(引数あり) Illuminate\Routing\Redirector to
report Illuminate\Contracts\Debug\ExceptionHandler report
request(引数なし) Illuminate\Http\Request
request(引数あり) Illuminate\Http\Request only またはプロパティアクセス (__get)
rescue
resolve Illuminate\Foundation\Application make
response(引数なし) Illuminate\Contracts\Routing\ResponseFactory
response(引数あり) Illuminate\Contracts\Routing\ResponseFactory make
retry
session(引数なし) Illuminate\Session\SessionManager
session(引数あり) Illuminate\Session\SessionManager get または put
tap
throw_if
throw_unless
today Illuminate\Support\DateFactory today
trait_uses_recursive
transform
validator(引数なし) Illuminate\Contracts\Validation\Factory
validator(引数あり) Illuminate\Contracts\Validation\Factory make
value
view(引数なし) Illuminate\Contracts\View\Factory
view(引数あり) Illuminate\Contracts\View\Factory make
with
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

laravelで、LoginController.phpがない

php artisan make:model auth
を実行し、成功したのに、

ディレクトリ app/Http/Auth の中に、LoginController.phpのファイルがありません。
ctrl+Hを押下しましたが、表示されません。
なぜでしょうか。

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

Laravelでビュー描画前処理を行う

Laravelのビュー描画前処理

Laravelのビュー描画前処理について書いていきます
Laravelではビューが描画される時に呼び出される処理を作成しておくことができます

前提条件

下記前回記事の続きです
Laravelのレイアウトエンジンを使う
本記事は上記が完了している前提で書かれています
上記記事で使用したプロジェクトを引き続き使用していきます

Controllerにメソッド追加

(1) /sample/app/Http/Controllers/SampleController.phpにviewComposeメソッドを追記
public function viewCompose()
{
$data = ['key' => 123456789.123456];
return view('sample.viewCompose', $data);
}

(2) /sample/routes/web.phpに下記を追記
Route::get('sample/view-compose', 'SampleController@viewCompose');

viewの作成

/sample/resources/views/sample/viewCompose.blade.phpファイル作成

viewCompose.blade.php
<html>
    <head>
        <title>sample</title>
    </head>
    <body>
        {{$key}}
    </body>
</html>

描画前処理の作成

(1) /sample/app/Http/ViewComposersフォルダ作成
(2) /sample/app/Http/ViewComposers/SampleComposer.phpファイル作成

SampleComposer.php
<?php

namespace App\Http\ViewComposers;

use Illuminate\View\View;

class SampleComposer {

    public function compose(View $view)
    {
        $view->with('key', number_format($view->getData()['key'], 2, '.', ','));
    }
}

描画前処理が呼び出されるように登録する

(1) /sample/app/Providers/ViewComposerServiceProvider.phpファイル作成

ViewComposerServiceProvider.php
<?php
namespace App\Providers;

use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;

class ViewComposerServiceProvider extends ServiceProvider{

    public function boot()
    {
        View::composer(
            'sample.viewCompose', 'App\Http\ViewComposers\SampleComposer'
        );

    }

    public function register()
    {
    }
}

(2) /sample/config/app.php内のproviders配列に下記を追記

ViewComposerServiceProvider.php
‥‥

'providers' => [

‥‥

App\Providers\ViewComposerServiceProvider::class,
],

‥‥

これでレンダリングの際に
ViewComposerServiceProvider#boot→View::composer→SampleComposer#compose
が実行されます

動作確認

http://localhost/laravelSample/sample/view-compose

実行結果

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

ブラックボックスの罠 Guzzlehttpで解決しなかった文字化けが、cURLにしたらサクッと解決した

はじめに

APIを使う側の場合、サンプルコードなどがあれば、まずはそれに忠実な操作、処理をして疎通を確認する。

ライブラリは便利だが、ブラックボックスになる面もあるのでトラブルの原因把握や問題解決から遠くなる危険がある。
ソースが公開されているのなら、それを辿るがよろし。

何が起こったか?

某決済業者のAPIを使い銀行振込用のバーチャル口座のリクエストを送った時に、全角文字が含まれているとその部分だけ文字化けが発生した。
なお、クレジットカード払いなどの別手段では発生しなかった。

参考:当方サーバ側環境

  • PHP7.X系
  • Laravel5.X系
  • guzzlehttp6.5.2
  • システム内のデフォルトの文字コードはUTF-8

PHPやLaravelそのものは関係なくて、guzzleの中の問題(断言)

問題調査で発生したこと

途方に暮れる

文字コードをSJISに変換する必要がある
→変換しても、文字化けた後の内容が変わっただけで根本的な解決にはならなかった。

リクエストを送るときのContent-Typeが問題 
→ Postmanなどの、API送信ツールを使ったが、文字化けしていた。

そのほか、URLエンコードした値を送信など様々な事を試みたがダメだった。

なお、業者がサンプルで提供している(本案件では採用しない)決済モジュールを動かしてみたら無事文字化けしなかった。

cURLで実装してみたら、問題なく送信できた!

決済モジュールのコードを辿ってみたら、全角文字列はSJISに変換する。
curl_setoptで、様々な設定をしたのちリクエストを送信。

結局、いかにもありそうなcURLのサンプルコードを書いて動かしたら成功した。

cURLでリクエストを送る
//前提:こんな感じのリクエスト値が存在する(実運用時には、他のメソッドで加工するケースが多いと思います)

$params = [
    'access_code' => 'unique_access_code',
    'price' => '3980',
    'customer_name' => mb_convert_encoding('バカ殿様','SJIS','UTF-8')
];

//POSTする値を
$post_fields = http_build_query($params);

// APIのリクエスト先URL。各自の環境に置き換えて考えてください
$request_url = "https://example.com/path/to/api/receiver";


//まず、オブジェクトを作る
$curl = curl_init();

//リクエスト形式、戻り値の存在、リクエスト先などを設定する。
//URLは適宜考えてください

curl_setopt($curl,CURLOPT_URL,$request_url);
curl_setopt($curl,CURLOPT_POST,true);
curl_setopt($curl,CURLOPT_RETURNNUMBER,true);

//リクエスト先の仕様にそろえて、URLエンコード済の値をセットする
curl_setopt($curl,CURLOPT_POSTFIELDS,$post_fields);

//ここから下、cURLのリクエスト送信とレスポンス

$response = curl_exec( $curl );
$curlinfo = curl_getinfo( $curl );
curl_close( $curl );




顧客名は、時事ネタです(合掌)

犯人は(たぶん)お前だ!

guzzlehttp/guzzle/src/Client.php

applyOptionsメソッド内にてhttp_build_queryを使っていたが
ここでクエリを編集する部分に問題があるようだ。

guzzlehttp/guzzle/src/Client.php
//
        if (isset($options['query'])) {
            $value = $options['query'];
            if (is_array($value)) {
                $value = http_build_query($value, null, '&', PHP_QUERY_RFC3986);//この行に問題あり
            }
            if (!is_string($value)) {
                throw new \InvalidArgumentException('query must be a string or array');
            }
            $modify['query'] = $value;
            unset($options['query']);
        }



PHPリファレンスのhttp_build_queryのページによれば 4つ目の引数enc_typeは

デフォルトでは PHP_QUERY_RFC1738つまり、RFC1738 に従ってエンコードされる。でよかったにも関わらず 上記ソースの抜粋のようにPHP_QUERY_RFC3986でエンコードされていた…これが原因のようだ。

参考

PHP:http_build_query

https://www.php.net/manual/ja/function.http-build-query.php

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

Laravelのレイアウトエンジンを使う

Laravelのレイアウト処理

Laravelのレイアウト処理について書いていきます
viewsフォルダ配下に作成したblade.phpファイルを組み合わせて1つのビューとして処理をするものです

前提条件

下記前回記事の続きです
Laravelのテンプレートエンジンを使う
本記事は上記が完了している前提で書かれています
上記記事で使用したプロジェクトを引き続き使用していきます

Controllerにメソッド追加

(1) /sample/app/Http/Controllers/SampleController.phpにchildメソッドを追記
public function child()
{
$data = ['msgList' => ["msg1", "msg2"]];
return view('sample.child', $data);
}

(2) /sample/routes/web.phpに下記を追記
Route::get('sample/child', 'SampleController@child');

viewの作成

(1) /sample/resources/views/layoutフォルダ作成
(2) /sample/resources/views/layout/parent.blade.phpファイル作成

parent.blade.php
<html>
    <head>
        <title>@yield('title')</title>
    </head>
    <body>
        <ul>
            @section('menu')
            <li>共通メニュー1</li>
            <li>共通メニュー2</li>
            @show
        </ul>
        <div>
            @yield('content')
        </div>
    </body>
</html>

(3) /sample/resources/views/componentフォルダ作成
(4) /sample/resources/views/component/msgList.blade.phpファイル作成

msgList.blade.php
<div>{{ $msgTitle }}</div>
@foreach ($msgList as $msg)
    <div>{{ $msg }}</div>
@endforeach
{{ $addMsg }}

(5) /sample/resources/views/sample/child.blade.phpファイル作成

child.blade.php
{{-- resources/views/layout/parent.blade.phpを使うのでlayout.parentにする --}}
@extends('layout.parent')

{{-- parent.blade.phpの@yield('title')を置換する --}}
@section('title', 'Sample@tpl')

{{-- parent.blade.phpの@section('menu')から@showまでを置換する --}}
@section('menu')
    {{-- parent.blade.phpの@section('menu')から@showまでを描画する --}}
    @parent
    {{-- child.blade.php独自のメニューを描画する --}}
    <li>独自メニュー1</li>
    <li>独自メニュー2</li>
@endsection

{{-- parent.blade.phpの@yield('content')を置換する --}}
@section('content')
    <p>child.blade.phpのコンテンツ</p>

    {{-- resources/views/component/msgList.blade.phpを描画する --}}
    @component('component.msgList', ['msgTitle' => 'コンポーネントタイトル', 'msgList' => $msgList])
        @slot('addMsg')
            <div>addMsg1</div>
            <div>addMsg2</div>
        @endslot
    @endcomponent

    {{-- resources/views/component/msgList.blade.phpを描画する --}}
    @include('component.msgList', ['msgTitle' => 'インクルードタイトル', 'msgList' => $msgList, 'addMsg' => '<div>addMsg1</div><div>addMsg2</div>'])

@endsection

動作確認

http://localhost/laravelSample/sample/tpl

実行結果

● 共通メニュー1
● 共通メニュー2
● 独自メニュー1
● 独自メニュー2

child.blade.phpのコンテンツ

コンポーネントタイトル
msg1
msg2
addMsg1
addMsg2
インクルードタイトル
msg1
msg2
<div>addMsg1</div><div>addMsg2</div>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelのテンプレートエンジンを使う

Laravelの描画処理

Laravelの描画処理を行うbladeテンプレートエンジンの使い方を書いていきます
@と様々な予約語を組み合わせることでいろいろな描画処理をすることができます

前提条件

下記前回記事の続きです
eclipseでLaravel開発環境を構築する。デバッグでブレークポイントをつけて止める。(WindowsもVagrantもdockerも)
本記事は上記が完了している前提で書かれています
プロジェクトの作成もapacheの設定も上記で行っています

Controllerにメソッド追加

  1. /sample/app/Http/Controllers/SampleController.phpにtplメソッドを追記
    public function tpl()
    {
    $data = ['val' => 2,
    'parentList' => ['key1' => 1],
    'list' => ['key1' => 1, 'key2' => 2, 'key3' => 3],
    'emptyList' => []
    ];
    return view('sample.tpl', $data);
    }

  2. /sample/routes/web.phpに下記を追記
    Route::get('sample/tpl', 'SampleController@tpl');

viewの作成

  1. /sample/resources/views/sample/tpl.blade.phpファイル作成
tpl.blade.php
<html>
    <head>
        <title>sample</title>
    </head>
    <body>

        {{-- コメント --}}

        {{-- {!!  !!}はエスケープしないデータの表示 --}}
        <div>[{!! '&#064;php' !!}]</div>
        @php
            $tplVal = 10;
            echo '<div>' . $tplVal . '</div>';
        @endphp

        <br>

        <div>[echo]</div>
        <div>{{ $val }}</div>
        <br>

        <div>[if]</div>
        @if ($val === 1)
            <div>1</div>
        @elseif ($val === 2)
            <div>2</div>
        @else
            <div>else</div>
        @endif
        <br>

        <div>[switch]</div>
        @switch($val)
            @case(1)
                <div>1</div>
                @break
            @case(2)
                <div>2</div>
                @break
            @default
                <div>default</div>
        @endswitch
        <br>

        <div>[unless]</div>
        @unless (true)
            <div>true</div>
        @else
            <div>false</div>
        @endunless
        <br>

        <div>[isset]</div>
        @isset($list['key1'])
            <div>isset true</div>
        @else
            <div>isset false</div>
        @endisset
        <br>

        <div>[empty]</div>
        @empty($list['key1'])
            <div>empty true</div>
        @else
            <div>empty false</div>
        @endempty
        <br>

        <div>[for]</div>
        @for ($i = 0; $i < 10; $i++)
            @if ($i == 1)
                @continue
            @endif
            <div>{{ $i }}</div>
            @if ($i >= 3)
                @break
            @endif
        @endfor
        <br>

        <div>[foreach]</div>
        @foreach ($list as $listKey => $listVal)
            @if ($listVal == 1)
                @continue
            @endif
            <div>{{ $listKey }}:{{ $listVal }}</div>
            @if ($listVal >= 3)
                @break
            @endif
        @endforeach
        <br>

        <div>[forelse]</div>
        @forelse ($emptyList as $listKey => $listVal)
            <div>{{ $listKey }}:{{ $listVal }}</div>
        @empty
            <div>空っぽのリストです</div>
        @endforelse
        <br>

        <div>[while]</div>
        @php
            $whileIndex = 0;
        @endphp
        @while ($whileIndex <= 3)
            <div>{{ $whileIndex }}</div>
            @php
                $whileIndex++;
            @endphp
        @endwhile
        <br>

        <div>[$loop]</div>
        @foreach ($parentList as $parentListKey => $parentListVal)
            <div>parent:{{ $parentListKey }}:{{ $parentListVal }}</div>
            @foreach ($list as $listKey => $listVal)
                <div>child:{{ $listKey }}:{{ $listVal }}</div>
                <div>$loop->index:    {{ $loop->index }}</div>
                <div>$loop->iteration:{{ $loop->iteration }}</div>
                <div>$loop->remaining:{{ $loop->remaining }}</div>
                <div>$loop->count:    {{ $loop->count }}</div>
                <div>$loop->first:    {{ $loop->first }}</div>
                <div>$loop->last:     {{ $loop->last }}</div>
                <div>$loop->even:     {{ $loop->even }}</div>
                <div>$loop->odd:      {{ $loop->odd }}</div>
                <div>$loop->depth:    {{ $loop->depth }}</div>

                <div>$loop->parent->index:    {{ $loop->parent->index }}</div>
                <div>$loop->parent->iteration:{{ $loop->parent->iteration }}</div>
                <div>$loop->parent->remaining:{{ $loop->parent->remaining }}</div>
                <div>$loop->parent->count:    {{ $loop->parent->count }}</div>
                <div>$loop->parent->first:    {{ $loop->parent->first }}</div>
                <div>$loop->parent->last:     {{ $loop->parent->last }}</div>
                <div>$loop->parent->even:     {{ $loop->parent->even }}</div>
                <div>$loop->parent->odd:      {{ $loop->parent->odd }}</div>
                <div>$loop->parent->depth:    {{ $loop->parent->depth }}</div>

                @if ($listVal >= 2)
                    @break
                @endif

            @endforeach
        @endforeach
        <br>

    </body>
</html>

動作確認

http://localhost/laravelSample/sample/tpl

実行結果

[@php]
10

[echo]
2

[if]
2

[switch]
2

[unless]
false

[isset]
isset true

[empty]
empty false

[for]
0
2
3

[foreach]
key2:2
key3:3

[forelse]
空っぽのリストです

[while]
0
1
2
3

[$loop]
parent:key1:1
child:key1:1
$loop->index: 0
$loop->iteration:1
$loop->remaining:2
$loop->count: 3
$loop->first: 1
$loop->last:
$loop->even:
$loop->odd: 1
$loop->depth: 2
$loop->parent->index: 0
$loop->parent->iteration:1
$loop->parent->remaining:0
$loop->parent->count: 1
$loop->parent->first: 1
$loop->parent->last: 1
$loop->parent->even:
$loop->parent->odd: 1
$loop->parent->depth: 1
child:key2:2
$loop->index: 1
$loop->iteration:2
$loop->remaining:1
$loop->count: 3
$loop->first:
$loop->last:
$loop->even: 1
$loop->odd:
$loop->depth: 2
$loop->parent->index: 0
$loop->parent->iteration:1
$loop->parent->remaining:0
$loop->parent->count: 1
$loop->parent->first: 1
$loop->parent->last: 1
$loop->parent->even:
$loop->parent->odd: 1
$loop->parent->depth: 1

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

Laravel Dump Server インストールエラー Argument 1 passed to Symfony\Component\VarDumper\Server\Connection::__construct() must be of the type string

https://github.com/beyondcode/laravel-dump-server Laravel Dump Serverのライブラリをインストールしようとしたところ謎のエラーが発生してしまいました。

環境

  • PHP 7.4.5
  • Laravel 7.5.1
  • Laravel Dump Server 2.7.0

問題

$ composer require --dev beyondcode/laravel-dump-server

Using version ^1.4 for beyondcode/laravel-dump-server
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Package zendframework/zend-code is abandoned, you should avoid using it. Use laminas/laminas-code instead.
Package zendframework/zend-eventmanager is abandoned, you should avoid using it. Use laminas/laminas-eventmanager instead.
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi

In Connection.php line 32:

  Argument 1 passed to Symfony\Component\VarDumper\Server\Connection::__const  
  ruct() must be of the type string, null given, called in /work/backend/vend  
  or/beyondcode/laravel-dump-server/src/DumpServerServiceProvider.php on line  
   49                                                                          


Script @php artisan package:discover --ansi handling the post-autoload-dump event returned with error code 1

Installation failed, reverting ./composer.json to its original content.

インストールに失敗してちょっとビビリました。

対策

https://github.com/beyondcode/laravel-dump-server/issues/48

こちらのイシューを見たところ、キャッシュが悪さしてるようです。

$ rm bootstrap/cache/config.php

キャッシュファイルを削除して、再度インストールしなおせばokです。

$ composer require --dev beyondcode/laravel-dump-server
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MVCってなんやねん

初めに

ちょっと前に書いたんだけど、簡単にしか書いてなかったので復習程度に綴っときます。
自分なりの理解の仕方なので、間違えてたりしたらすいません。

MVCモデルとは?

Model,View,Controllerのの頭文字
機能ごとに分けて、役割だったり内容をわかりやすくする考え方。

MVC、それぞれ何の役割なの?

Model

ビジネスロジックを担当します。

  • データの検索
  • データの変換
  • データの検証
  • データの関連

Controllerから受け取った処理に基づいて、必要なデータをDBで参照します。
そして、そこから取得したデータをControllerへ渡します。
ただModel = Databaseではありません。
あくまでもModelは基本的に上記5つの処理担当です。

View

表示、入力に関する処理担当

  • リクエストを取得する
  • リクエストをControllerへ渡す
  • Controllerから受け取ったデータをHTMLなどで出力する

Controller

ここが一番ややこしい担当

  • Viewからリクエストを受け取る
  • 受け取ったリクエストに基づいて該当するアクションを実行してModelに伝える
  • Modelで処理したデータを受け取り、レスポンスをViewに返す

なんでそもそも分ける必要があるんや!

実際、LaravelなんかではControllerの中でModelの処理実行したりします。
簡単な処理とかならいいですけどそれが10行、20行、100行なんか行った際に・・・
そんなController見たいか?
となります。(というより研修課題で僕が完全にこれでした。急いで書き直した。)
なのでしっかりと役割を理解し、記述しましょう!

まとめ

自分なりに理解して綴ってみましたがどうでしょうか?
ここまで読んでくださってありがとうございます!
最後に、MVCをしっかりと理解して効率的にWeb開発をしましょう!
じゃあね!

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

Laravel バリデーションを設定する ~コントローラ編~

目的

  • 入力値をDBに保存する際にアプリケーション側でそのデータが要件を満たしているのかをフィルターする仕組みを実装する

実施環境

  • ハードウェア環境
項目 情報
OS macOS Catalina(10.15.3)
ハードウェア MacBook Pro (16-inch ,2019)
プロセッサ 2.6 GHz 6コアIntel Core i7
メモリ 16 GB 2667 MHz DDR4
グラフィックス AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB
  • ソフトウェア環境
項目 情報 備考
PHP バージョン 7.4.3 Homwbrewを用いて導入
Laravel バージョン 7.0.8 commposerを用いて導入
MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いて導入

説明に関する前提の説明

  • 下記の方法、またはそれに準ずる方法でLaravelの環境を構築していること。
  • Laravelのアプリケーションが存在すること。

説明に関する前提のコード

  • 下記のような「ビューでの入力値をDBに格納する処理」が存在する事を前提として説明を行う。
  1. ルーティングファイル

    web.php
    //入力フォームを表示する
    Route::get('/new', 'ContentController@new');
    //入力値を受け取ってDBに保存する
    Route::post('/create', 'ContentController@create');
    
  2. コントローラファイル(当該アクション部分のみ記載する)

    ContentController.php
    //入力フォームを表示する contentディレクトリのnew.blade.phpを表示する
    public function new() {
        return view('content.new');
    }
    
    //入力値を受け取ってDBに保存する DBへの格納処理の記載は省略する
    public function create(Request $request) {
    
        //受け取った値を連想配列に格納
        $notice_info = $request->all();
    
        //DBへの登録処理
    }
    
  3. ビューファイル

    content/new.blade.php
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
    </head>
    <body>
      <form action="/create" method="POST">
        <input type="text" name="input_content">
        <input type="submit" value="送信">
      </form>
    </body>
    </html>
    

実施方法概要

  • コントローラにバリデーションを記載する方法をまとめる。
  1. バリデーションルールの設定
  2. バリデーション本体の記載
  3. 確認

実施方法詳細

  1. バリデーションルールの設定

    1. 下記のようにコントローラに記載してバリデーションルールを定義する。
    2. バリデーション内容は「空状態での送信をブロックする」ものとする
    3. バリデーションルールに引っかかった場合、/newのページ(入力を行って送信ボタンをクリックしたページ)にリダイレクトされるようにする。

      ContentController.php
      //入力フォームを表示する contentディレクトリのnew.blade.phpを表示する
      public function new() {
          return view('content.new');
      }
      
      //入力値を受け取ってDBに保存する DBへの格納処理の記載は省略する
      public function create(Request $request) {
          //バリデーションのルール設定
          $rules = [
              //'ビューのinput要素のnameで指定したキーの名前' => ['バリデーションのルール'],のように記載する、requiredは空の状態での送信をブロックするルールである
              'input_content' => ['required'],
          ];
      
          //受け取った値を連想配列に格納
          $notice_info = $request->all();
      
          //DBへの登録処理
      }
      
  2. バリデーション本体の記載

    1. バリデーションの命令を記載する

      ContentController.php
      //入力フォームを表示する contentディレクトリのnew.blade.phpを表示する
      public function new() {
          return view('content.new');
      }
      
      //入力値を受け取ってDBに保存する DBへの格納処理の記載は省略する
      public function create(Request $request) {
          //バリデーションのルール設定
          $rules = [
              //'ビューのinput要素のnameで指定したキーの名前' => ['バリデーションのルール'],のように記載する、requiredは空の状態での送信をブロックするルールである
              'input_content' => ['required'],
          ];
      
          //下記のように記載してバリデーションを設定する
          //$this->validate(ビューのform要素から送られた値が格納された変数$request, バリデーションルールが格納された変数$rules);のように記載する
          $this->validate($request, $rules);
      
          //受け取った値を連想配列に格納
          $notice_info = $request->all();
      
          //DBへの登録処理
      }
      
    2. ビューファイルを編集してエラーメッセージを出力する記載を追加する。

    content/new.blade.php
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
    </head>
    <body>
      <form action="/create" method="POST">
        <!-- 下記を追記する -->
        <!-- バリデーションルールはひとつであるが、複数のエラーメッセージが出力される事を想定してforeach文でエラーを出力する -->
        <!-- 配列$errorsのキー'input_content'にメッセージが格納されているかの分岐 -->
        @if ($errors->has('input_content'))
          <!-- 配列$errorsのキー'input_content'に格納されているメッセージを行っこづつ変数$input_content_errorに格納する -->
          @foreach ($errors->get('input_content') as $input_content_error)
            <!-- 変数$input_content_errorを出力する -->
            <p>{{$input_content_errors}}</p>
            <br>
          @endforeach
        @endif
        <!-- ひとつのエラーメッセージのみ出力したい場合、下記の記載でも可 -->
        <!--
        @if ($errors->has('input_content'))
          <p>{{$errors->first('input_content')}}</p>
        @endif
        -->
        <!-- 上記までを追記する -->
        <input type="text" name="input_content">
        <input type="submit" value="送信">
      </form>
    </body>
    </html>
    
  3. 確認

    1. /newにアクセスし、input要素で表示されている入力ボックスに何も入力せず「送信」ボタンをクリックする。
    2. /newが際表示される事を確認する。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】Laravel DB設定

①MAMPを起動

アプリケーションからMAMPを開き、「サーバを起動」を押下する。

②phpMyAdminにアクセス

phpMyAdminにアクセスする。

③データベース作成

▪︎新規作成
左側のメニューから「新規作成」を押下する。

▪︎データベース名入力
フォームに作成したいデータベース名を入力する。

▪︎文字コード設定
プルダウンから文字コード「utf8_general_ci」を選択する。

▪︎作成
「作成」ボタンを押下する。

④特権の設定

▪︎データベースの選択
左側のメニューから特権を設定したいデータベースを選択する。
今回は先ほど③で作成したデータベースを選択する。

▪︎特権タブを開く
上部から「特権タブ」を開く。

▪︎ユーザアカウント追加
「ユーザアカウントを追加する」を押下する。

▪︎ログイン情報フォーム入力
ユーザ名、パスワード、再入力を入力する。
他の設定は変えない。

▪︎ユーザアカウント専用データベース設定
チェックボックスから「データベース laravel_task への全ての特権を与える。」を選択し、チェックを入れる。

▪︎グローバル特権設定
チェックボックスから「すべてチェックする」を選択し、チェックを入れる。

▪︎SSL設定
ラジオボタンから「REQUIRE NONE」を選択しする。

▪︎実行
「実行」ボタンを押下する。

⑤.envファイルのデータベース設定

.envファイルを開き、下記の通りデータベースを設定する。

公文)
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=8889
DB_DATABASE=【③で作成したデータベース名】
DB_USERNAME=【④で作成したユーザ名】
DB_PASSWORD=【④で設定したパスワード】
DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock

例)
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=8889
DB_DATABASE=laravel_task
DB_USERNAME=laravel_user
DB_PASSWORD=password123
DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock

⑥DBマイグレート

▪︎ディレクトリ移動

公文)
$ cd /Applications/MAMP/htdocs/プロジェクト名
例)
$ cd /Applications/MAMP/htdocs/laravel_test

▪︎DBマイグレート

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