- 投稿日:2020-07-24T22:33:54+09:00
[laravel] UserモデルをModelsディレクトリに移動
laravel 7.19.1でのやり方です
参考にした記事
【Laravel】モデルのディレクトリ構成変更についてのメモ参考にさせていただいた内容とほぼ同じですが、バージョンから変更ファイルに多少違いがありましたのでメモ程度ですが紹介します
準備
1.認証を追加
*リファレンスから
$ composer require laravel/ui $ php artisan ui vue --auth2.ディレクトリを作成
$ mkdir Models3.User.phpを移動
$ mv User.php Modelsファイルの修正
User.phpnamespace App; ↓変更 namespace App\Models;RegisterController.phpuse App\User; ↓変更 use App\Models\User;auth.php'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\User::class, ↓変更 'model' => App\Models\User::class, ],UserFactory.phpuse App\User; ↓変更 use App\Models\User;でいけると思います!
- 投稿日:2020-07-24T21:41:07+09:00
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.ymlversion: '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/24docker-file/nginx/default.conf
default.confserver { 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 ... doneLaravelから読み書きする
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; } }
- 投稿日:2020-07-24T21:04:29+09:00
【Laravel】シーディング
内容
シーディングについてメモしておきます。
factoryファイルの作成
UserFactoryはデフォルトで作成されています。
ここではuser_idを外部キーにもつPostモデルのfactoryファイルを作成してみます。% php artisan make:factory PostFactory --model=Post--modelオプションでモデルを指定しています。
ファイルの中身は、例えば以下のようにします。database/factories/PostFactory.phpuse 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 UserSeederdatabase/seeds/UserSeeder.phppublic 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.phppublic function run() { $this->call([ UserSeeder::class, ]); }run()内のcallメソッドの引数に実行するSeederを指定します。
オートローダ
Seederファイルを作成したら、以下のコマンドを実行して、オートローダを再生成しましょう。
% composer dump-autoloadシーディング
% php artisan db:seed
- 投稿日:2020-07-24T19:16:08+09:00
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.ymldocker-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:8080Dockerfile (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 -dLaravelプロジェクトの作成
webのコンテナ にシェルでログインして、Laravelの新規プロジェクトを作成します。
# webコンテナにシェルで入ります $ docker-compose exec web bash # 新規のLaravelプロジェクト作成します $ laravel new動作確認
ここまでで、WEBとDBのコンテナの作成と、Laravel新規プロジェクトの作成は完了です。作成したコンテナが正常に動作しているか確認していきましょう。
ブラウザで
http://127.0.0.1/
にアクセスして、Laravelプロジェクトが正常に動作しているか確認します。
次に、データベース(MariaDB)とAdminerが動作しているか確認します。
ブラウザでhttp://127.0.0.1:8080/
にアクセスし、docker-compose
で指定したパスワードでログインします。
まとめ
PHP7.4のLaravel開発環境を作ってみました。デバッグ実行はできませんが、dockerを使えば簡単にPHP+Laravelの環境が作れて便利です。
- 投稿日:2020-07-24T18:47:24+09:00
【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
- 投稿日:2020-07-24T16:12:57+09:00
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※参考
https://qiita.com/dyoshikawa/items/c8b09cde728388c8feec
https://qiita.com/rei67/items/273ebef44d19912733b7感想
LaravelをVSCodeで書いてみたけど、やっぱりPhpStormが良いかな。
プラグインあれこれ入れたけど、PhpStormの快適さを超えられなかった。ReactでCRUDアプリ作ろう!と思ったけど、R作ったところで、お腹いっぱい。
続きは、また今度!
- 投稿日:2020-07-24T15:56:26+09:00
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.phpuse 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;
- 投稿日:2020-07-24T15:28:11+09:00
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
で解消された。焦らず順番に行なうようにしていきたい。
- 投稿日:2020-07-24T14:40:32+09:00
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公式ドキュメントを参照。
- 投稿日:2020-07-24T14:38:13+09:00
【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したほうがよい)
ちゃんとビューに表示されていれば完成!
参考資料
- 投稿日:2020-07-24T14:22:40+09:00
LaravelでRoute::resourceを使用した時に必要のないrouteを無効にする
概要
Route::resourceを使用した時に必要のないrouteを無効にする方法。
環境
Laravel: 7.21.0
resourceコントローラの生成
下記のコマンドでルートとコントローラを自動的に割り付けてくれます。
php artisan make:controller PostController --resourceartisanコマンドで生成されたコントローラは以下のような内容です。
<?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.phpRoute::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を使用した場合の方が分かり易いと思いました。
- 投稿日:2020-07-24T14:22:40+09:00
LaravelでRoute::resourceを使用したときにアクションの一部を指定する
概要
Route::resourceを使用した時に必要のないrouteを無効にする方法。
環境
Laravel: 7.21.0
resourceコントローラの生成
下記のコマンドでルートとコントローラを自動的に割り付けてくれます。
php artisan make:controller PostController --resourceartisanコマンドで生成されたコントローラは以下のような内容です。
<?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.phpRoute::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を使用した場合の方が分かり易いと思いました。