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

[laravel] UserモデルをModelsディレクトリに移動

laravel 7.19.1でのやり方です

参考にした記事
【Laravel】モデルのディレクトリ構成変更についてのメモ

参考にさせていただいた内容とほぼ同じですが、バージョンから変更ファイルに多少違いがありましたのでメモ程度ですが紹介します

準備

1.認証を追加

*リファレンスから

$ composer require laravel/ui

$ php artisan ui vue --auth

2.ディレクトリを作成

$ mkdir Models

3.User.phpを移動

$ mv User.php Models

ファイルの修正

User.php
namespace App;
変更
namespace App\Models;
RegisterController.php
use App\User;
変更
use App\Models\User;
auth.php
     'providers' => [
         'users' => [
             'driver' => 'eloquent',
             'model' => App\User::class,
        ↓変更
             'model' => App\Models\User::class,
         ],

UserFactory.php
use App\User;
変更
use App\Models\User;

でいけると思います!

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

DockerでRedisコンテナを立ち上げLaravelで読み書きする

はじめに

DockerでRedisコンテナを立ち上げLaravelから読み書きしてみましたので、
Redisコンテナを立ち上げるまでの最小限の構成を紹介します。

やりたいこと

  • DockerでRedisコンテナを立ち上げたい
  • Redisのデータを永続化したい
  • LaravelからRedisのデータを読み書きしたい

この記事で説明しないこと

  • Redis以外のDocker構成
  • Laravelのインストール手順

ディレクトリ構成

.
├── data
│   └── redis
│       └── appendonly.aof(コンテナ起動時に作成されます)
├── docker-file
│   ├── nginx
│   │   └── default.conf
│   └── php
│       ├── Dockerfile
│       └── php.ini
├── volumes
│   └── www
└── docker-compose.yml

各ファイルの内容

docker-compose.yml

データ永続化の為にdataフォルダをマウントしています。

また、redisコンテナを立ち上げ直すたびにIPアドレスが変わっては不便なのでnetworksで固定IPを割り振るようにしています。

docker-compose.yml
version: '3.3'

services:
  php:
    container_name: php
    build: ./docker-file/php
    volumes:
      - ./volumes/www:/var/www
    networks:
      app_net:
        ipv4_address: 172.16.238.2

  nginx:
    image: nginx
    container_name: nginx
    ports:
      - 8080:80
    volumes:
      - ./volumes/www:/var/www
      - ./docker-file/nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php
    networks:
      app_net:
        ipv4_address: 172.16.238.3

  redis:
    image: "redis:latest"
    container_name: redis
    ports:
      - "6379:6379"
    command: redis-server --appendonly yes
    volumes:
      - "./data/redis:/data"
    networks:
      app_net:
        ipv4_address: 172.16.238.4

networks:
  app_net:
    driver: bridge
    ipam:
     driver: default
     config:
       - subnet: 172.16.238.0/24

docker-file/nginx/default.conf

default.conf
server {
  listen 80;

  root  /var/www/public;
  index index.php;

  location / {
    try_files $uri $uri/ /index.php$is_args$args;
  }

  location ~ \.php$ {
    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;
  }
}

docker-file/php/Dockerfile

公式でPhpRedis PHP拡張が推奨されている為、phpredisをgit cloneしています。

LaravelでRedis使用するには、PECLを使用してPhpRedis PHP拡張をインストールすることを推奨します。インストール方法は複雑ですが、Redisをヘビーユースするアプリケーションではより良いパフォーマンスが得られます

FROM php:7.3-fpm
COPY php.ini /usr/local/etc/php/

RUN apt-get update \
  && apt-get install -y zlib1g-dev libzip-dev libpq-dev iputils-ping net-tools git
RUN git clone https://github.com/phpredis/phpredis.git /usr/src/php/ext/redis
RUN docker-php-ext-install zip pgsql pdo_pgsql redis

COPY --from=composer /usr/bin/composer /usr/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"

docker-file/php/php.ini

php.ini
[Date]
date.timezone = "Asia/Tokyo"

[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

実行

docker-composeで起動します。

$ docker-compose up -d
Creating network "redis-docker_app_net" with driver "bridge"
Creating php   ... done
Creating redis ... done
Creating nginx ... done

Laravelから読み書きする

config/database.phpを設定する必要がありますが、基本的には初期設定のままで問題ありません。
参考:Redis 6.x Laravel

書き込み、読み込み

/app/Http/Controllers/RedisController.php
<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Redis;

class RedisController extends Controller
{
    /**
     * Redisへデータをセット
     */
    public function setRedis($id)
    {
        Redis::set('test', $id);

        return;
    }

    /**
     * Redisのデータを取得
     */
    public function getRedis()
    {
        $redis_data = Redis::get('test');

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

【Laravel】シーディング

内容

シーディングについてメモしておきます。

factoryファイルの作成

UserFactoryはデフォルトで作成されています。
ここではuser_idを外部キーにもつPostモデルのfactoryファイルを作成してみます。

% php artisan make:factory PostFactory --model=Post

--modelオプションでモデルを指定しています。
ファイルの中身は、例えば以下のようにします。

database/factories/PostFactory.php
use Illuminate\Support\Str;

$factory->define(Post::class, function (Faker $faker) {
    return [
        'title' => $faker->title(),
        'comment' => Str::random(10),
    ];
});

指定していないcreated_atやupdated_atなどは自動生成してくれるようです。
user_idは下の方で説明する書き方をすれば自動に値を入れてくれます。

seederファイルの作成

% php artisan make:seeder UserSeeder
database/seeds/UserSeeder.php
    public function run()
    {
        for ($i = 0; $i < 50; $i++) {
            $user = factory(User::class)->create(['name' => 'user'.$i]);
            $posts = [];
            for($j = $i * 10; $j < $i * 10 + 10; $j++) {
                array_push($posts, factory(Post::class)->make([
                    'title' => 'title'.$j,
                    'comment' => 'comment'.$j,
                ])->toArray());
            }
            $user->posts()->createMany($posts);
        }
    }

見慣れない記述ですが、titleとcommentに連番をつけたかったので、上のような書き方をしました。

factory(User::class)->create();
で一つのデータが作成されます。create()の引数を指定することで、値をオーバーライドできます。
1対多のリレーションでは、createMany()を利用するといいでしょう。引数は配列にする必要があります。

DatabaseSeeder.php

database/seeds/DatabaseSeeder.php
    public function run()
    {
        $this->call([
            UserSeeder::class,
        ]);
    }

run()内のcallメソッドの引数に実行するSeederを指定します。

オートローダ

Seederファイルを作成したら、以下のコマンドを実行して、オートローダを再生成しましょう。

% composer dump-autoload

シーディング

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

DockerでPHP7.4のLaravel開発環境を作成

PHP7.4のLaravel開発環境を、Docker-Composeで構築して、Laravelの新規プロジェクトを作成して起動してみるところまで確認してみます。
データベースには「MariaDB」を使います。

環境

この記事を書くにあたって使用した環境です。どれも、2020年7月時点の最新バージョンを使用しているハズ。

Docker

Name Version
docker 19.03.1
docker-compose 1.24.1

Web

今回は、Webサーバーに「Apache」を使用します。

Name Version
PHP 7.4
Apache 2.4.38
Laravel 7.21.0

DB

データベースは「MariaDB」です。データベース管理ツールの「Adminer」も入れておきます。

Name Version
MariaDB 10.5.4
Adminer 4.7.7

フォルダ構成

今回は、次のようなフォルダ構成にします。

[Project_ROOT]
├ docker
│ └ web
│   ├ apache
│   │ └ 000-default.conf
│   ├ php
│   │ └ php.ini
│   └ Dockerfile  
├ mysql
│ ├ data
│ └ initdb
└ docker-compose.yml

docker-compose.yml

version : "3"
services:
  web:
    container_name: web
    build: ./docker/web
    ports:
      - 80:80
    privileged: true
    volumes:
      - ./server:/var/www/html

  db:
    image: mariadb
    restart: always
    ports:
      - 3307:3306
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/initdb:/docker-entrypoint-initdb.d
    environment:
      - MYSQL_ROOT_PASSWORD=pwd
      - MYSQL_DATABASE=test
      - MYSQL_USER=user
      - MYSQL_PASSWORD=pwd

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080

Dockerfile (PHP+Apache)

docker/webにwebコンテナ 構築用の「Dockerfile」を作成します。
PHP+Apacheのイメージをベースに、各種ライブラリとComposer、Laravelをインストールします。

FROM php:7.4-apache
COPY ./php/php.ini /usr/local/etc/php/
COPY ./apache/*.conf /etc/apache2/sites-enabled/

RUN apt-get update \
  && apt-get install -y zlib1g-dev libpq-dev mariadb-client unzip libzip-dev\
  && docker-php-ext-install zip pdo_mysql mysqli \
  && docker-php-ext-enable mysqli

COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer
ENV PATH $PATH:/composer/vendor/bin

WORKDIR /var/www/html

RUN composer global require "laravel/installer"

※ 以前のバージョンでは不要でしたが、今回インストールするcomposerには「libzip-dev」が必要なので一緒にインストールします。

php.ini

PHPの設定ファイルを作成します。

[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

Apacheの設定ファイル

Apacheのポートや、ドキュメントルートなど、最低限の設定を行います。

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html/public
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Dockerコンテナの起動

各種ファイルの準備ができたら、次のコマンドを使用してDockerコンテナを起動します。最初は400MB近いファイルがダウンロードされ時間がかかるので、気長に待ちます。

$ docker-compose up -d

Laravelプロジェクトの作成

webのコンテナ にシェルでログインして、Laravelの新規プロジェクトを作成します。

# webコンテナにシェルで入ります
$ docker-compose exec web bash

# 新規のLaravelプロジェクト作成します
$ laravel new

動作確認

ここまでで、WEBとDBのコンテナの作成と、Laravel新規プロジェクトの作成は完了です。作成したコンテナが正常に動作しているか確認していきましょう。

ブラウザでhttp://127.0.0.1/にアクセスして、Laravelプロジェクトが正常に動作しているか確認します。
スクリーンショット 2020-07-24 13.50.42.png

次に、データベース(MariaDB)とAdminerが動作しているか確認します。
ブラウザでhttp://127.0.0.1:8080/にアクセスし、docker-composeで指定したパスワードでログインします。
スクリーンショット 2020-07-24 14.10.11.png

ログインに成功すると、次のような画面が表示されます。
スクリーンショット 2020-07-24 19.10.19.png

まとめ

PHP7.4のLaravel開発環境を作ってみました。デバッグ実行はできませんが、dockerを使えば簡単にPHP+Laravelの環境が作れて便利です。

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

【Laravel】Composerを使った環境構築

Composerを使ってLaravelをローカル環境に構築する。

terminalでapplications/mamp/htdocsに移動する。
composerのcreate-projectコマンドを使ってLarabelをインストールする。

composer create-project --prefer-dist laravel/laravel 【ディレクトリ名】

※【ディレクトリ名】の部分がフォルダの名前になる。
Laravelのインストール

バージョン

php:7.3.11
Laravel:7.21.0

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

Reactを初めて使ってCRUDアプリを作ってみた記録

JSフレームワークをやってみようと思い立ったので、Reactを使ってみた記録です。

マシンスペック

  • Mac mini 2018
  • macOS Catalina(10.15.x)
  • Intel Core-i7 3.2GHz 6コア
  • メモリ 32GB
  • SSD 512GB

サーバー環境

  • CentOS7.x
  • MySQL5.7.x
  • Nginx最新版
  • PHP7.1.x
  • Laravel5.6
  • Visual Studio Code最新版

フロント環境

  • React最新版
  • Bootstrap最新版
  • Visual Studio Code最新版

やること

  • ReactとLaravelでCRUDアプリを作る

補足

各環境の操作は、下記のように記載します。

[Cent]$ MacのターミナルからCentOSに接続して作業
[Mac]$ MacのターミナルでMac内の作業

前提

サーバー環境は構築済み
【コピペ】VirtualBox+Vagrant+AnsibleでLaravel開発環境を構築その弐

サーバーの準備

この記事用に作りました!
https://github.com/bobtabo/laravel5.6

[Mac]$ vagrant ssh
[Cent]$ rm -fdR laravel5
[Cent]$ git clone https://github.com/bobtabo/laravel5.6.git laravel5
[Cent]$ cd laravel5
[Cent]$ composer install
[Cent]$ chmod -R 777 storage
[Cent]$ chmod -R 777 bootstrap/cache
[Cent]$ cp -p .env.example .env
[Cent]$ php artisan key:generate
[Cent]$ vi .env
★DB設定を置換
:%s/DB_DATABASE=homestead/DB_DATABASE=hoge/g
:%s/DB_USERNAME=homestead/DB_USERNAME=fuga/g
:%s/DB_PASSWORD=secret/DB_PASSWORD=vagrant#VAGRANT1234/g
:wq
[Cent]$ bin/clear-laravel.sh
[Cent]$ php artisan migrate:refresh --seed

フロントの準備&練習

[Mac]$ brew install npm
[Mac]$ brew install node
[Mac]$ mkdir react-dev
[Mac]$ cd react-dev
[Mac]$ mkdir -p src/js
[Mac]$ npm init -y

★npm install --save-dev webpack webpack-cli webpack-dev-serverでエラーになったら行う
[Mac]$ sudo rm -rf $(xcode-select -print-path)
[Mac]$ sudo rm -rf /Library/Developer/CommandLineTools
[Mac]$ xcode-select --install

[Mac]$ npm install --save-dev webpack webpack-cli webpack-dev-server
[Mac]$ npm install -g webpack webpack-cli
[Mac]$ npm install --save-dev @babel/core @babel/preset-env @babel/preset-react babel-loader
[Mac]$ npm install --save-dev react react-dom

下記のサイトに従って、ファイルを作成する
今から始めるReact入門 〜 React の基本

  • webpack.config.js
  • src/index.html
  • src/js/client.js
[Mac]$ webpack --mode development
[Mac]$ open -a '/Applications/Google Chrome.app' ./src/index.html

※参考
https://qiita.com/TsutomuNakamura/items/72d8cf9f07a5a30be048
https://qiita.com/baby-0105/items/18f6fbc073e160bf83ac
https://qiita.com/nwtgck/items/4b9c83227bc334576552

フロントを作ってみた

上記の練習で作ったファイル(src/index.html、src/js/client.js)を色々いじってみた
https://github.com/bobtabo/react

[Mac]$ cd ..
[Mac]$ rm -fdR react-dev
[Mac]$ git clone https://github.com/bobtabo/react.git react-dev
[Mac]$ cd react-dev
[Mac]$ npm install
[Mac]$ webpack --mode development
[Mac]$ open -a '/Applications/Google Chrome.app' ./src/index.html

APIのレスポンス表示できた!
スクリーンショット 2020-07-24 15.29.33.png

※参考
https://qiita.com/dyoshikawa/items/c8b09cde728388c8feec
https://qiita.com/rei67/items/273ebef44d19912733b7

感想

LaravelをVSCodeで書いてみたけど、やっぱりPhpStormが良いかな。
プラグインあれこれ入れたけど、PhpStormの快適さを超えられなかった。

ReactでCRUDアプリ作ろう!と思ったけど、R作ったところで、お腹いっぱい。
続きは、また今度!

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

laravel cowitter

laravel で twitter api cowitter を使う。
面倒なのでモデルに読み込ませる。

これで片思いかどうかがわかる。

Cow.php
<?php

namespace App;
use Illuminate\Database\Eloquent\Model;
use Log;

use mpyw\Co\Co;
use mpyw\Co\CURLException;
use mpyw\Cowitter\Client;
use mpyw\Cowitter\HttpException;

//cowitter 利用専門
class Cow extends Model
{

    var $client;

    public function start($token,$token_secret)
    {
        $client = new Client([config('app.twitter_client_id'),config('app.twitter_client_secret'),$token,$token_secret]);
        $this->client = $client;
    }


    public function isFollow($source_id,$target_id)
    {
        //片思い
        $statuses = $this->client->get('friendships/show', [
            'source_id' => $source_id,
            'target_id' => $target_id,
        ]);

        if($statuses->relationship->source->following){
//            pd("フォローしています");
            $res = true;
        } else {
//            pd("フォローしていません");
            $res = false;
        }

        return $res;
    }


}



cowitter

HogeController.php
use App\Cow;
class HogeController extends Controller
{

    public static function test(Request $request)
    {

        $token = '4yhournZLGNGD';
        $token_secret = 'tWuyiur34QFkbdBEDONuAybqBaagr';

        $cow = new Cow;
        $cow->start($token,$token_secret);
        $tmp = $cow->isFollow('125023968', '11285142');
//        $tmp = $cow->isFollow('11285142','125023968');

        pd($res);

        die;

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

Laravelでmigatateした時にエラーが出ました。

下記のエラーが出ました。

$ php artisan migrate

   Illuminate\Database\QueryException  : SQLSTATE[HY000] [1049] Unknown database 'laravel' (SQL: select * from information_schema.tables where table_schema = laravel and table_name = migrations and table_type = 'BASE TABLE')

原因

  • データベースを作成せずにコマンドを入力したこと

解決方法

  • mysqlにログインしてデータベースを作成した
  • $ mysql -u root
  • mysql> create database 任意のDB名;
  • mysql> use DB名;
  • mysql> create user ユーザー名 IDENTIFIED BY '任意のパスワード';
  • mysql> grant all privileges on DB名.* to 'ユーザー名';
  • mysql> quit;
  • .envファイルにDB_DATABASE DB_USERNAME DB_PASSWORDをそれぞれ追記した

そして$ php artisan config:cacheを行い設定を反映させ
再度、$ php artisan migrateで解消された。

焦らず順番に行なうようにしていきたい。

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

LaravelのCI実行時にcomposer installでCIが落ちる現象を回避したい

要約

  • CIのcomposer install時には--no-scriptsをつけておく

概要

LaravelをGitHub Actionsでテスト実行時になぜかcomposer installで落ちる時期が突然出てきた。
ログを見るとphp artisan ide-helper:generateで毎回落ちている。

composer.json
  "scripts": {
    "post-root-package-install": [
      "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
    ],
    "post-create-project-cmd": [
      "@php artisan key:generate"
    ],
    "post-autoload-dump": [
      "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
      "@php artisan package:discover",
      "php artisan ide-helper:generate", 
      "php artisan ide-helper:meta"
    ]
  }

barryvdh/laravel-ide-helperのREADME.mdによると、 Some classes need a working database connection.とのこと。

マイグレーション前にDB接続されるのは回避したい。

The generator tries to identify the real class, but if it cannot be found, you can define it in the config file.

Some classes need a working database connection. 
If you do not have a default working connection, some facades will not be included. You can use an in-memory SQLite driver by adding the -M option.

解決策

composer install時には--no-scriptsをつけて、script実行を回避することにした。

github-bactions.yml
~~省略~~
      - name: Install Composer dependencies
        run: composer install --no-scripts
~~省略~~

こんな感じで。

composer install時の引数についてはComposer公式ドキュメントを参照。

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

【Laravel】ajaxを使った検索機能の実装

非同期通信で検索機能を実装する

簡単な流れ

検索ボタンを押す→サーバー側の任意のアクションへリクエストを投げる→DBから任意の値をとってくる→レスポンスとしてjsonデータをフロント側に返す→フロントはそれを元にビューを作成

使用したもの

  • user.js
  • UserController.php
  • user/index.blade.php
  • web.php

step1 フロント側

1. イベントの起点を決める

検索フォームとクリックイベントの起点となるボタンを記述

index.blade.php

    <div class="search-wrapper col-sm-4">
      <div class="user-search-form">
        {{ Form::text('search_name', null, ['id' => 'search_name', 'class' => 'form-control shadow', 'placeholder' => 'ユーザーを検索する']) }}
        {{ Form::button('<i class="fa fa-search" aria-hidden="true"></i>', ['class' => 'btn search-icon', 'type' => 'button']) }}
      </div>
    </div>

ポイント

  • フォームファサードを使うがForm::openの記述はいらない
  • buttonタグのtypeはbuttonにしないと遷移が走ってしまう
  • search-iconがイベントの起点

2.ajaxを走らせる

検索ボタンを押下後にサーバーサイドにリクエストを送れるようにする

 $('.user-search-form .search-icon').on('click', function () {
        $('.user-table tbody').empty(); //もともとある要素を空にする
        $('.search-null').remove(); //検索結果が0のときのテキストを消す

        let userName = $('#search_name').val(); //検索ワードを取得

        if (!userName) {
            return false;
        } //ガード節で検索ワードが空の時、ここで処理を止めて何もビューに出さない

        $.ajax({
            type: 'GET',
            url: '/user/index/' + userName, //後述するweb.phpのURLと同じ形にする
            data: {
                'search_name': userName, //ここはサーバーに贈りたい情報。今回は検索ファームのバリューを送りたい。
            },
            dataType: 'json', //json形式で受け取る

            beforeSend: function () {
                $('.loading').removeClass('display-none');
            } //通信中の処理をここで記載。今回はぐるぐるさせるためにcssでスタイルを消す。
         }).done(function (data) {
         //以下は後述

ポイント

  • dataTypeはjson
  • 今回は表示させるだけなのでget通信
  • beforeSendは無くても良い

これでサーバーへ非同期でデータが渡せる

step2 サーバー側

1.コントローラーを呼ぶ

まず、ajaxでurlを設定した通りにweb.phpでルーティングを構築する

Route::get('/user/index/{name}', 'UserController@getUsersBySearchName'); // url: '/user/index/' + userNameと同じ

これでajaxが走ったときにUserコントローラーのgetUsersBySearchNameアクションが呼ばれる

2.DBから値を取得しjsonでフロントへ返却

URLのパラメーターを引数にUserモデルから任意の値を取得する

UserController.php

    public function getUsersBySearchName($userName)
    {
        $users = $this->user->where('name', 'like', '%' . $userName . '%')->withCount('items')->orderBy('items_count', 'desc')->get(); //出品数もほしいため、withCountでitemテーブルのレコード数も取得
        return response()->json($users);
    }

ポイント

  • 返り値は必ずjsonデータ

step3 フロント側

1.サーバーから受け取った値をビューに表示

ajax通信が成功したときの処理としてjsonデータをビューに表示させる。
dataにはサーバーから受け取った値がjson形式で入っている

}).done(function (data) { //ajaxが成功したときの処理
            $('.loading').addClass('display-none'); //通信中のぐるぐるを消す
            let html = '';
            $.each(data, function (index, value) { //dataの中身からvalueを取り出す
    //ここの記述はリファクタ可能
                let id = value.id;
                let name = value.name;
                let avatar = value.avatar;
                let itemsCount = value.items_count;
    // 1ユーザー情報のビューテンプレートを作成
                html = `
                            <tr class="user-list">
                                <td class="col-xs-2"><img src="${avatar}" class="rounded-circle user-avatar"></td> //${}で変数展開
                                <td class="col-xs-3">${name}</td>
                                <td class="col-xs-2">${itemsCount}</td>
                                <td class="col-xs-5"><a class="btn btn-info" href="/user/${id}">詳細</a></td>
                            </tr>
                                `
            })
            $('.user-table tbody').append(html); //できあがったテンプレートをビューに追加
   // 検索結果がなかったときの処理
            if (data.length === 0) {
                $('.user-index-wrapper').after('<p class="text-center mt-5 search-null">ユーザーが見つかりません</p>');
            }

        }).fail(function () {
   //ajax通信がエラーのときの処理
            console.log('どんまい!');
        })

ポイント

  • console.log(data)でdataの中身を確認する
  • 検証ツールのnetwork欄でajaxの情報が確認できる
  • ドット記法でdataの中身を取り出せる
  • eachを使って各テンプレートに変数を代入する
  • それをビューにappendさせる(ちなみに上記コードよりまとめたあとに一つの変数としてappendしたほうがよい)

ちゃんとビューに表示されていれば完成!

参考資料

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

LaravelでRoute::resourceを使用した時に必要のないrouteを無効にする

概要

Route::resourceを使用した時に必要のないrouteを無効にする方法。

環境

Laravel: 7.21.0

resourceコントローラの生成

下記のコマンドでルートとコントローラを自動的に割り付けてくれます。

php artisan make:controller PostController --resource

artisanコマンドで生成されたコントローラは以下のような内容です。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class PostController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}

ルーティングの指定

Route::resourceを使うと必要なルートを記述を一度だけで指定できます。

web.php
Route::resource('post', 'PostController');

ルーティングは下記のような内容になります。

+--------+-----------+------------------+--------------+---------------------------------------------+------------+
| Domain | Method    | URI              | Name         | Action                                      | Middleware |
+--------+-----------+------------------+--------------+---------------------------------------------+------------+
|        | GET|HEAD  | post             | post.index   | App\Http\Controllers\PostController@index   | web        |
|        | POST      | post             | post.store   | App\Http\Controllers\PostController@store   | web        |
|        | GET|HEAD  | post/create      | post.create  | App\Http\Controllers\PostController@create  | web        |
|        | GET|HEAD  | post/{post}      | post.show    | App\Http\Controllers\PostController@show    | web        |
|        | PUT|PATCH | post/{post}      | post.update  | App\Http\Controllers\PostController@update  | web        |
|        | DELETE    | post/{post}      | post.destroy | App\Http\Controllers\PostController@destroy | web        |
|        | GET|HEAD  | post/{post}/edit | post.edit    | App\Http\Controllers\PostController@edit    | web        |
+--------+-----------+------------------+--------------+---------------------------------------------+------------+

ルーティングの制限

全部のrouteを使用しない場合only,exceptを使って使用するrouteを指定できます。
今回は、index,showのみを使用できるようにしてみます。

web.php
// onlyを使った場合
Route::resource('post', 'PostController')->only([
    'index', 'show'
]);

// exceptを使った場合
Route::resource('post', 'PostController')->except([
  'create', 'store', 'edit', 'update', 'destroy'
]);

onlyを使用すると指定した他のroute以外を無効にできます。
expectを使用すると指定したrouteを無効にできます。

結果はどちらも下記のようになります。

+--------+----------+-------------+------------+-------------------------------------------+------------+
| Domain | Method   | URI         | Name       | Action                                    | Middleware |
+--------+----------+-------------+------------+-------------------------------------------+------------+
|        | GET|HEAD | post        | post.index | App\Http\Controllers\PostController@index | web        |
|        | GET|HEAD | post/{post} | post.show  | App\Http\Controllers\PostController@show  | web        |
+--------+----------+-------------+------------+-------------------------------------------+------------+

個人的にonlyを使用した場合の方が分かり易いと思いました。

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

LaravelでRoute::resourceを使用したときにアクションの一部を指定する

概要

Route::resourceを使用した時に必要のないrouteを無効にする方法。

環境

Laravel: 7.21.0

resourceコントローラの生成

下記のコマンドでルートとコントローラを自動的に割り付けてくれます。

php artisan make:controller PostController --resource

artisanコマンドで生成されたコントローラは以下のような内容です。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class PostController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}

ルーティングの指定

Route::resourceを使うと必要なルートを記述を一度だけで指定できます。

web.php
Route::resource('post', 'PostController');

ルーティングは下記のような内容になります。

+--------+-----------+------------------+--------------+---------------------------------------------+------------+
| Domain | Method    | URI              | Name         | Action                                      | Middleware |
+--------+-----------+------------------+--------------+---------------------------------------------+------------+
|        | GET|HEAD  | post             | post.index   | App\Http\Controllers\PostController@index   | web        |
|        | POST      | post             | post.store   | App\Http\Controllers\PostController@store   | web        |
|        | GET|HEAD  | post/create      | post.create  | App\Http\Controllers\PostController@create  | web        |
|        | GET|HEAD  | post/{post}      | post.show    | App\Http\Controllers\PostController@show    | web        |
|        | PUT|PATCH | post/{post}      | post.update  | App\Http\Controllers\PostController@update  | web        |
|        | DELETE    | post/{post}      | post.destroy | App\Http\Controllers\PostController@destroy | web        |
|        | GET|HEAD  | post/{post}/edit | post.edit    | App\Http\Controllers\PostController@edit    | web        |
+--------+-----------+------------------+--------------+---------------------------------------------+------------+

ルーティングの制限

全部のrouteを使用しない場合only,exceptを使って使用するrouteを指定できます。
今回は、index,showのみを使用できるようにしてみます。

web.php
// onlyを使った場合
Route::resource('post', 'PostController')->only([
    'index', 'show'
]);

// exceptを使った場合
Route::resource('post', 'PostController')->except([
  'create', 'store', 'edit', 'update', 'destroy'
]);

onlyを使用すると指定した他のroute以外を無効にできます。
expectを使用すると指定したrouteを無効にできます。

結果はどちらも下記のようになります。

+--------+----------+-------------+------------+-------------------------------------------+------------+
| Domain | Method   | URI         | Name       | Action                                    | Middleware |
+--------+----------+-------------+------------+-------------------------------------------+------------+
|        | GET|HEAD | post        | post.index | App\Http\Controllers\PostController@index | web        |
|        | GET|HEAD | post/{post} | post.show  | App\Http\Controllers\PostController@show  | web        |
+--------+----------+-------------+------------+-------------------------------------------+------------+

個人的にonlyを使用した場合の方が分かり易いと思いました。

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