20200320のlaravelに関する記事は9件です。

【Laravel】配列取り出し方パターン

単純配列

単純配列
$memo[] = array();
$memo = [100,200,300,400,500];
$data = $memo[2];

echo $data;
//300
連想配列
$memo[] = array();
$memo = [
  'counry' => 'Japan',
  'capital' => 'Tokyo',
  'population' => 120000000 
];
$data = $memo['capital'];

echo $data;
//Tokyo
連想配列(value値が複数)
$memo[] = array();
$memo = [
  'country' => ['Japan', 'China', 'Korea'],
  'capital' => ['Tokyo', 'Beigin', 'Sore']
];
$data = $memo['capital'][1];

echo $data;
//Beigin
多次元配列
$memo[] = array();
$memo = [
  ['田中', '兵庫', 26],
  ['斎藤', '京都', 30],
  ['鈴木', '徳島', 43]
];
foreach($memo as $value) {
  $memos = $value[0].'('.$value[1].'県出身'.$value[2].'才'.')';
  echo '<br>';
}

//"田中(兵庫県出身26才)"
//"斎藤(京都県出身30才)"
//"鈴木(徳島県出身43才)"
多次元配列
$memo[] = array();
$memo = array(
  '東京' => [
      '世田谷区'=>'100',
      '渋谷区'=>'255',
      '町田市'=>'1731',
  ],
  '北海道' => [
      '札幌市'=>'27',
      '函館市'=>'-34',
  ],
  '福岡県' => [
      '福岡市'=>'3312',
      '北九州市'=>'6398',
      '糸島市'=>'33.5',
  ]
);

$items = [];
foreach($memo as $key => $value) {
  foreach($value as $sub_key => $sub_value) {
    $items = $sub_key.":".$sub_value;
  }
}

echo $items;
/*
"世田谷区:100
渋谷区:255
町田市:1731
札幌市:27
函館市:-34
福岡市:3312
北九州市:6398
糸島市:33.5"
*/
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel 検索機能サンプル

searchアクションで検索結果があれば表示するサンプル

routes.php
Route::get('/person/{id}', 'PersonController@find');
Route::post('/person/{id}', 'PersonController@search');
controller.php
  public function find(Request $request){
    return view('person.find', ['input' => '', 'id' => $request->id]);
  }

  public function search(Request $request){
    $input_val = $request->input;
    $item = Person::find($input_val);
    return view('person.find', ['input' => $input_val, 'id' => $request->id, 'item' => $item]);
  }
view.blade.php
  <form action="/person/{{$id}}" method="post">
    {{ csrf_field() }}
    <input type="text" name="input" value="{{$input}}">
    <input type="submit" value="find">
  </form>

  @if (isset($item))
    <table>
      <tr>
        <th>Data</th>
      </tr>
      <tr>
        <td>{{ $item->getData() }}</td>
      </tr>
    </table>
  @endif
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【感想】Laravel(+Vue.js)でSNS風Webサービスを作ろう!を終えて

Laravel(+Vue.js)でSNS風Webサービスを作ろう!を終えて

教材のご紹介

今回、私が学習した教材はこちらです。

Laravel(+Vue.js)でSNS風Webサービスを作ろう!
https://www.techpit.jp/p/laravel-vue-sns


★参考までに今までのTechpit歴
・Techpitの学び放題会員2か月
・(残念ながら)学び放題に入っていない教材5個くらい単発購入(してやられた)

ちなみにRails、Laravel、Python、Vue.jsなど含め、Techpit教材はかなり漁ってきました。その中でもかなりおすすめの教材です。

初学者がポートフォリオ作成で躓く(私含め)であろうミドルウェア、リクエスト、認可、ポリシー、さらにはフロンドエンドフレームワーク(Vue.js)との連携まで、実際にアプリを作りながら体験できます。

(他にもLaravelに関しては、AWSを用いた教材やVue.jsのSPAまで実装できる教材もあるので、そちらもおすすめです。(回し者ではありません。))

教材通り、herokuでデプロイも完了しております。参考までに。
http://laravel-vue-sns.herokuapp.com/

学習を終えて


この教材では、Mac&Laradockを用いた開発になりますが、私はWindows&XAMPPに置き換えて挑戦しました。

※というよりも、いつもこの環境で頑張って乗り切っています。(Mac環境の教材多すぎて辛い)

最終的に、Mailhogだけどうしても実装できませんでしたが、それ以外は問題なく実装できました。

また、今回XAMPP環境にPostgreSQLを紐づける方法も理解できたので、herokuも今後は積極的に利用していこうかなと思いました。(※herokuはPostgreSQLを推奨。かつFTPでデプロイするのは時間がかかりすぎるので。。。)

⇓参考までにXAMPPでPostgreSQLを使う方法に関しては、下記でまとめています。

https://chobimusic.com/laravel_xampp_postgresql/

今後に関して


今回のMailhogの実装失敗などを踏まえ、Laradockでのアプリ制作ができたほうが良いなと痛感しました。

また、この教材を参考にしながらVue.jsまで連携させたポートフォリオ制作に挑戦していこうと思います。

引き続き頑張ります✌

P.S.

独学中の身として、Twitterで執筆者の方々や学習者の方々とやり取りできるのがとても励みになっています。ありがとうございます。

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

【Laravel】CloudFront+S3で署名付きURLを使いプライベートコンテンツを配信する

※3/22 03:47 バケットポリシー、AWS_URL、オブジェクトの公開に関する記述が抜けていたため、修正しました。

環境

  • PHP 7.4.1
  • Composer 1.9.3
  • Laravel Framework 6.14.0
  • league/flysystem-aws-s3-v3 1.0.24
  • aws/aws-sdk-php 3.133.40
  • aws/aws-sdk-php-laravel 3.5.0

手順

長いのでだいぶ雑です。

1. S3アップロード実装

まず、AWSアカウントの作成, S3バケットの作成, IAMポリシーの作成, IAMユーザの作成/IAMポリシー適用などが必要になります。
これらは、ググれば良い資料が沢山出てくるのでそちらを参照してください。
S3のバケット作成後、バケットポリシーには、IAMユーザからのアクションを許可する設定を書いておいてください。
ポリシージェネレーターを使うか、以下の例を書き換えて使用するのがオススメです。

バケットポリシー例(全アクションを許可)

{
  "Id": "Policy1584851110472",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1581137583020",
      "Action": "s3:*",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::example-bucket",
      "Principal": {
        "AWS": [
          "arn:aws:iam::000000000000:user/hoge_user"
        ]
      }
    }
  ]
}

公式ドキュメントに則り、Flysystemを使ってS3に画像をアップロードするところまで進めます。

composer require league/flysystem-aws-s3-v3

config/filesystems.phpには既にS3用の記述が存在するため、編集する必要はありません。
.envファイルは自身の環境に合わせて書き換えましょう。

config/filesystems.php(編集不要)
        's3' => [
            'driver' => 's3',
            'key' => env('AWS_ACCESS_KEY_ID'),
            'secret' => env('AWS_SECRET_ACCESS_KEY'),
            'region' => env('AWS_DEFAULT_REGION'),
            'bucket' => env('AWS_BUCKET'),
            'url' => env('AWS_URL'),
        ],
/.env
AWS_ACCESS_KEY_ID=hoge
AWS_SECRET_ACCESS_KEY=fuga
AWS_DEFAULT_REGION=ap-northeast-1
AWS_BUCKET=hoga
AWS_URL=https://example-bucket.s3-ap-northeast-1.amazonaws.com

画像アップロード用のHTMLとコントローラ、ルーティングを作成します。

routes/web.php
Route::get('/', function () {
    return view('index');
});
Route::Post('/', 'TestController@create');
resources/views/index.blade.php
<form method="POST" action="/" enctype="multipart/form-data">
    {{ csrf_field() }}
    <input type="file" name="media" accept="image/*">
    <input type="submit">
</form>
app/Http/Controllers/TestController.php
use Illuminate\Http\Request;
use Storage;

    public function create(Request $request) {
        // S3アップロード
        $media = $request->file('media');
        $path = Storage::disk('s3')->putFile('/', $media);
        $url = Storage::disk('s3')->url($path);
        dd($url);
    }

アップロードがうまくいかない場合、IAMポリシーやアクセスキー、バケットポリシーのチェックを行い、php artisan cache:clearphp artisan config:clearを叩いてみましょう。

この状態では、URLを叩くとエラーになるはずです。
画像をブラウザで確認する場合、S3バケットのパブリックアクセスをオンにした上でオブジェクトを公開状態にする必要があります。
S3バケットの「パブリックアクセスをすべてブロック」をオフにして、putFile()の第三引数に'public'を追記してアップロードすると、見れるようになるはずです。確認が終わったら設定を戻しておきましょう。

2. CloudFrontとの連携

ルートユーザでAWSマネジメントコンソールにアクセスし、「マイセキュリティ資格情報」からCloudFrontキーペアを生成します。
キーペアをダウンロードし、秘密鍵をアプリケーションディレクトリ直下に保存します。

/pk-hogefuga.pem
-----BEGIN RSA PRIVATE KEY-----
aaaaaaaaaaaaa
-----END RSA PRIVATE KEY-----

次に、CloudFrontのページで「Create Distribution」→Webの「Get Started」と進み、以下の情報を入力して設定を完了します。StatusがDeployedに変わるまで待ちましょう。
この操作が完了すると、S3のバケットポリシーが更新され、CloudFront経由でしかアクセスできないようになります。

Origin Domain Name: S3のバケットを選択
Restrict Bucket Access: Yes
Origin Access Identity: Create a New Identity
Grant Read Permissions on Bucket: Yes, Update Bucket Policy
Restrict Viewer Access(Use Signed URLs or Signed Cookies): Yes
Trusted Signers: Self

次に、以下のコマンドでAWS SDKを導入します。
コマンド入力後は、 https://github.com/aws/aws-sdk-php-laravel に記載のある通り、providersとaliasesを更新します。

composer require aws/aws-sdk-php-laravel

ここまでできたら、後は署名付きURLを取得するだけです。
コントローラと.envファイルを以下のように書き換えます。

app/Http/Controllers/TestController.php
use Illuminate\Http\Request;
use Storage;
use AWS;

    public function create(Request $request) {
        // S3アップロード
        $media = $request->file('media');
        $path = Storage::disk('s3')->putFile('/', $media);
        $url = Storage::disk('s3')->url($path);

        // 署名付きURLを取得
        $client = AWS::createClient('cloudfront');
        $signedUrl = $client->getSignedUrl([
            'url' => $url,
            'expires' => time() + 30, // 30秒間有効
            'private_key' => base_path('pk-hogefuga.pem'),
            'key_pair_id' => env('AWS_CLOUDFRONT_KEY_PAIR_ID')
        ]);
        dd($signedUrl);
    }
/.env
AWS_URL=https://xxx.cloudfront.net # CloudFrontのページにある「Domain Name」
AWS_CLOUDFRONT_KEY_PAIR_ID=hogefuga # 鍵ファイル名のハイフン以降の文字列

実行後、以下のようなURLが取得できたらうまくいっています。
CloudFront経由でしかアクセスできない(S3に直接アクセスが禁止されている)こと、GETパラメータ(署名)を外すとアクセスできないこと、有効期限を過ぎるとアクセスできないことを確認してみてください。

https://xxx.cloudfront.net/jA7g461GuNZDqaBwI0VKAm8Ia2KjXp6E7DMTQVe8.png?Expires=1584705653&Signature=C97kAeYc3Lvr-2mJ1hKe9SSAVQJJuS0wuCmyecIXJMIES~ITw10gJkn0UE1xuMUfpwAW8Oka~dIP61FdPfshrfU4pYzHYkeqMqZzvuZjen3NwNiSqHF1h5raLuVpG9yrhnuEPJAgaMdVsKcQFG0Ej0qHMtSi9zehrPvUh-TMmeAUHhU6dBXsPHEvlPQoPzJC-sVMh2ZVgTbVgAgaTl6CK5Am3WaVsNfSjhD1jBasdC5qTLPuEFOnuVXcMBFyh2svQLtX92DDUnfAa0jx0SUQ3DAgGNuj1I-NjV4J6w30vqvlbdGBIOHTCcBveeHxohAcp4sDxwznul2bZ2IY3Rrx6Q__&Key-Pair-Id=DFNVRFXGY12IDEBGZGPL

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

モデルメソッドの使い方

メソッドを定義してuseして使うだけ

# 使い方(Personモデルでの例)
use App\Person; #コントローラでuse

$person = Person::all(); #インスタンス取得
$Person->モデルメソッド(); #メソッドを使用

viewで表示する例:

Person.php
    # メソッド定義
  public function getData()
  {
    return $this->id . ':' . $this->name . '(' . $this->age . ')';
  }
PersonController.php
use App\Person;
use Illuminate\Http\Request;

class PersonController extends Controller
{
  public function index(){
    $people = Person::all();
    return view('person.index', ['people' => $people]);
  }
}

person/index.blade.php
  <table>
    @foreach($people as $person)
    <tr>
    <!-- ここでメソッド呼び出し -->
      <td>{{ $person->getData() }}</td>
    </tr>
    @endforeach
  </table>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

The way to add Basic Authentication on Laravel

Description

I wanted to add just basic authentication on whole page.
(It's not for user authentication)

Preparation

$ php artisan make:middleware BasicAuthMiddleware
app/Http/Kernel.php
<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{

    /** 
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array
     */
    protected $middleware = [ 
        \App\Http\Middleware\TrustProxies::class,
        \App\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        \App\Http\Middleware\BasicAuthMiddleware::class, // Add here
    ];  
...

Create Config

Add environment parameter for basic authentication

.env
...

BASIC_AUTH_FLAG=1
BASIC_AUTH_PASSWORD=sample
BASIC_AUTH_USER=sample
$ vim config/myauth.php
config/myauth.php
<?php

return [
    'basic' => [
        'flag'     => env('BASIC_AUTH_FLAG', 0),
        'username' => env('BASIC_AUTH_USER', null),
        'password' => env('BASIC_AUTH_PASSWORD', null)
    ]   
]; 

Edit code

app/Http/MiddleWare/BasicAuthMiddleware.php
<?php

namespace App\Http\Middleware;

use Closure;

class BasicAuthMiddleware
{
    /** 
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {   
        if (config('myauth.basic.flag')){
            switch (true) {
                case !isset($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']):
                case $_SERVER['PHP_AUTH_USER'] !== config('myauth.basic.username'):
                case $_SERVER['PHP_AUTH_PW']   !== config('myauth.basic.password'):
                    header('WWW-Authenticate: Basic realm="Enter username and password."');
                    header('Content-Type: text/plain; charset=utf-8');
                    die('You do not have permission');
            }   

            header('Content-Type: text/html; charset=utf-8');
        }   
        return $next($request);
    }   
}

Usage

If you'd like to verify user, change BASIC_AUTH_FLAG on env.

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

PHP(Laravel)でレコードのinsert, update, delete

insert

DB::table('テーブル名')->insert(配列データ);

update

DB::table('テーブル名')->where('更新対象を検索')->update(配列データ);
    $params = [
      'id' => $request->id,
      'name' => $request->name,
      'email' => $request->email,
      'age' => $request->age
    ];

delete

#使い方
DB::table('テーブル名')->where(検索条件)->delete();
#削除ルーティング
Route::post('/hoge/delete', 'HogeController@delete');
HogeController.php
  public function delete(Request $request){
    $id = $request->delete_id;
    $person = DB::table('people')->where('id', $id);
    $person->delete();
    return redirect('/hello');
  }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel+Mysql+Vue.jsの開発環境をDockerで構築

はじめに

Laravel+Mysql+Vue.jsでSPAのWebアプリケーション作成の勉強をしたくて、Dockerで開発環境構築をしました。
開発の常で、開発環境構築に苦戦したので備忘録を兼ねて構築手順を記述します。
記載内容に誤り等ございましたら、ご指摘をよろしくお願いいたします。

開発環境

$ docker --version
Docker version 19.03.8, build afacb8b

$ docker-compose --version
docker-compose version 1.25.4, build 8d51620a

$ php artisan --version
Laravel Framework 7.2.0

$ mysql --version
mysql  Ver 14.14 Distrib 5.7.29, for Linux (x86_64) using  EditLine wrapper

$ npm list vue
`-- vue@2.6.11 

参考

ディレクトリ構成

project
├ docker-compose.yml
├ docker
│  ├ php
│  │  ├ php.ini
│  │  └ Dockerfile
│  └ nginx
│    └ default.conf
└ server

手順

1. ファイルを準備

以下のファイルを作成します。

  • Dockerfile
  • docker-compose.yml
  • php.ini
  • default.conf
project/docker/php/Dockerfile
FROM php:7.4.1-fpm
COPY php.ini /usr/local/etc/php/

RUN apt-get update \
  && apt-get install -y zlib1g-dev libzip-dev zip mariadb-client-10.3 libpng-dev libjpeg-dev curl wget \
  && docker-php-ext-install zip pdo_mysql

# nodejs install
RUN curl -sL https://deb.nodesource.com/setup_12.x | bash -
RUN apt-get install -y nodejs

# Composer install
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php -r "if (hash_file('SHA384', 'composer-setup.php') === '$(wget -q -O - https://composer.github.io/installer.sig)') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer

ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer
ENV PATH $PATH:/composer/vendor/bin
WORKDIR /var/www
RUN composer global require "laravel/installer"

mysql-clientのパッケージは削除されているので注意。

project/dockerfile-compose.yml
version: '3'
services:
  php:
    container_name: php
    build: ./docker/php
    volumes:
      - ./server:/var/www
    depends_on:
      - db
  nginx:
    image: nginx
    container_name: nginx
    ports:
      - 80:80
    volumes:
      - ./server:/var/www
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php
  db:
    image: mysql:5.7
    restart: always
    container_name: db-host
    environment:
      MYSQL_ROOT_PASSWORD: yourpassword
      MYSQL_DATABASE: phpapp_db
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
    volumes:
      - ./docker/db/data:/var/lib/mysql
      - ./docker/db/my.conf:/etc/mysql/conf.d/my.cnf
      - ./docker/db/sql:/docker-entrypoint-initdb.d
    ports:
      - 3306:3306
project/docker/php/php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
project/docker/nginx/default.conf
server {
  listen 80;
    index index.php index.html;
    root /var/www/public;

  location / {
    root /var/www/public;
    index  index.html index.php;
    }

  location ~ \.php$ {

    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass php:9000;
    fastcgi_index index.php;
    include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_param PATH_INFO $fastcgi_path_info;
  }
 }

2. dockerコンテナを立ち上げる

$ docker-compose build
$ docker-compose up -d

3. phpコンテナに入ってlaravelプロジェクトを作成する

$ docker-compose exec php bash
$ laravel new

4. dockerコンテナを一旦停止する

$ docker-compose down

5. .envファイルを編集する

以下のように無いパラメーターは追加し、すでに記述されているパラメーターは修正する。

project/server/.env
DB_CONNECTION=mysql
DB_HOST=db-host
DB_PORT=3306
DB_DATABASE=phpapp_db
DB_USERNAME=root
DB_PASSWORD=yourpassword

6. コンテナを立ち上げる

$ docker-compose up -d

7. ローカルホストにつながることを確認する

ブラウザから以下のURLにアクセスして正常に接続できることを確認する。

正常に接続できれば以下のような画面が表示される。

Built_laravel_environment_1

8. migrateが実行できることを確認する

phpコンテナに入ってmigrateを実行する。

$ docker-compose exec php bash
$ php artisan migrate

migrateが失敗する場合は以下の記事等を参考にして頂くと良いと思います。

9. Vue.jsの導入

npmでvueのパッケージをインストール。

$ npm install
$ npm install -D vue

vueのパッケージがインストールできていることを確認。

$ docker-compose exec php bash
$ npm list vue

開発環境構築は以上です。

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

cloud9でlaravelの認証機能を実装後、LOGIN, REDISTERをクリックすると「Oops」となる

cloud9でlaravelの認証機能を実装し、LOGIN, REGISTERの動作確認をしようとしたところ
「Oops VFS connection does not exist」が表示されてしまう。

【試したこと】

  • cloud9のワークスペース(インスタンス?)の再起動
  • cloud9のワークスペースを削除して最初からやり直す

【解決方法】

以下のファイルにコードを追加。
/app/Providers/AppServiceProvider.php

public function boot()
    {
        //以下を追記
        \URL::forceScheme('https');
    }

再度サーバーを起動して試したところLOGIN, REGISTERともに無事に遷移できました。

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