- 投稿日:2020-03-20T23:50:27+09:00
【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" */
- 投稿日:2020-03-20T23:26:14+09:00
Laravel 検索機能サンプル
searchアクションで検索結果があれば表示するサンプル
routes.phpRoute::get('/person/{id}', 'PersonController@find'); Route::post('/person/{id}', 'PersonController@search');controller.phppublic 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
- 投稿日:2020-03-20T23:12:29+09:00
【感想】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で執筆者の方々や学習者の方々とやり取りできるのがとても励みになっています。ありがとうございます。
- 投稿日:2020-03-20T23:08:23+09:00
【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'), ],/.envAWS_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.phpRoute::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.phpuse 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:clear
やphp 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.phpuse 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); }/.envAWS_URL=https://xxx.cloudfront.net # CloudFrontのページにある「Domain Name」 AWS_CLOUDFRONT_KEY_PAIR_ID=hogefuga # 鍵ファイル名のハイフン以降の文字列実行後、以下のようなURLが取得できたらうまくいっています。
CloudFront経由でしかアクセスできない(S3に直接アクセスが禁止されている)こと、GETパラメータ(署名)を外すとアクセスできないこと、有効期限を過ぎるとアクセスできないことを確認してみてください。
- 投稿日:2020-03-20T20:37:11+09:00
モデルメソッドの使い方
メソッドを定義してuseして使うだけ
# 使い方(Personモデルでの例) use App\Person; #コントローラでuse $person = Person::all(); #インスタンス取得 $Person->モデルメソッド(); #メソッドを使用viewで表示する例:
Person.php# メソッド定義 public function getData() { return $this->id . ':' . $this->name . '(' . $this->age . ')'; }PersonController.phpuse 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>
- 投稿日:2020-03-20T14:54:42+09:00
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 BasicAuthMiddlewareapp/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.phpconfig/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.
- 投稿日:2020-03-20T12:35:50+09:00
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.phppublic function delete(Request $request){ $id = $request->delete_id; $person = DB::table('people')->where('id', $id); $person->delete(); return redirect('/hello'); }
- 投稿日:2020-03-20T11:33:10+09:00
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参考
- Docker で Laravel の環境構築をしました
- Dockerを使ってLaravel開発環境構築
- 5分で作るLaravel+Vue.js開発環境(docker-compose)
- Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう
ディレクトリ構成
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/DockerfileFROM 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.ymlversion: '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:3306project/docker/php/php.ini[Date] date.timezone = "Asia/Tokyo" [mbstring] mbstring.internal_encoding = "UTF-8" mbstring.language = "Japanese"project/docker/nginx/default.confserver { 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 -d3. phpコンテナに入ってlaravelプロジェクトを作成する
$ docker-compose exec php bash $ laravel new4. dockerコンテナを一旦停止する
$ docker-compose down5.
.env
ファイルを編集する以下のように無いパラメーターは追加し、すでに記述されているパラメーターは修正する。
project/server/.envDB_CONNECTION=mysql DB_HOST=db-host DB_PORT=3306 DB_DATABASE=phpapp_db DB_USERNAME=root DB_PASSWORD=yourpassword6. コンテナを立ち上げる
$ docker-compose up -d7. ローカルホストにつながることを確認する
ブラウザから以下のURLにアクセスして正常に接続できることを確認する。
正常に接続できれば以下のような画面が表示される。
8. migrateが実行できることを確認する
phpコンテナに入ってmigrateを実行する。
$ docker-compose exec php bash $ php artisan migratemigrateが失敗する場合は以下の記事等を参考にして頂くと良いと思います。
9. Vue.jsの導入
npmでvueのパッケージをインストール。
$ npm install $ npm install -D vuevueのパッケージがインストールできていることを確認。
$ docker-compose exec php bash $ npm list vue開発環境構築は以上です。
- 投稿日:2020-03-20T02:07:17+09:00
cloud9でlaravelの認証機能を実装後、LOGIN, REDISTERをクリックすると「Oops」となる
cloud9でlaravelの認証機能を実装し、LOGIN, REGISTERの動作確認をしようとしたところ
「Oops VFS connection does not exist」が表示されてしまう。【試したこと】
- cloud9のワークスペース(インスタンス?)の再起動
- cloud9のワークスペースを削除して最初からやり直す
【解決方法】
以下のファイルにコードを追加。
/app/Providers/AppServiceProvider.phppublic function boot() { //以下を追記 \URL::forceScheme('https'); }再度サーバーを起動して試したところLOGIN, REGISTERともに無事に遷移できました。