質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ルーティング

ルーティングとは、TCP/IPネットワークにおいて、目的のホストまでパケットを送る為のパス選定のプロセスを言います。

SNS

SNS(ソーシャル・ネットワーキング・サービス)は、 人と人とのつながりを促進したり、サポートしたりすることが可能なコミュニティ型のWebサービスです。

Q&A

解決済

1回答

2227閲覧

Laravel 親ビューファイルの関数受け取りとルーティング

natsumi.boc

総合スコア2

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ルーティング

ルーティングとは、TCP/IPネットワークにおいて、目的のホストまでパケットを送る為のパス選定のプロセスを言います。

SNS

SNS(ソーシャル・ネットワーキング・サービス)は、 人と人とのつながりを促進したり、サポートしたりすることが可能なコミュニティ型のWebサービスです。

0グッド

0クリップ

投稿2020/09/12 10:30

編集2020/09/13 04:15

前提・実現したいこと

Laravel初学者です。
Laravel5.5 でSNS(Twitter)のクローンサイトを作っています。
ログインユーザーのフォロー数・フォロワー数を全ページ共通レイアウト(親ビューファイル)のサイドバーに表示したいのですが
Controllerで親ビューファイルに関数を渡した場合
ルーティングはどのように記述すればよいのでしょうか?

該当のソースコード

usersテーブル

php

1public function up() 2 { 3 Schema::create('users', function (Blueprint $table) { 4 $table->increments('id')->autoIncrement(); 5 $table->string('username',255); 6 $table->string('mail',255); 7 $table->string('password',255); 8 $table->string('remember_token',255)->nullable(); 9 $table->string('bio',400)->nullable(); 10 $table->string('images',255)->default('userIcon.png')->nullable(); 11 $table->timestamp('created_at')->useCurrent(); 12 $table->timestamp('updated_at')->default(DB::raw('current_timestamp on update current_timestamp')); 13 }); 14 }

postsテーブル

public function up() { Schema::create('posts', function (Blueprint $table) { $table->increments('id')->autoIncrement(); $table->unsignedInteger('user_id'); $table->string('post',200); $table->timestamp('created_at')->useCurrent(); $table->timestamp('updated_at')->default(DB::raw('current_timestamp on update current_timestamp')); $table->foreign('user_id')//外部キー ->references('id')//主キー ->on('users')//主キーのあるテーブル ->onDelete('cascade') ->onUpdate('cascade'); }); }

followsテーブル

public function up() { Schema::create('follows', function (Blueprint $table) { $table->increments('id')->autoIncrement(); $table->timestamp('created_at')->useCurrent(); $table->timestamp('updated_at')->default(DB::raw('current_timestamp on update current_timestamp')); $table->unsignedInteger('user_id'); $table->unsignedInteger('follow_id'); //外部キー $table->foreign('user_id') ->references('id') ->on('users') ->onDelete('cascade') ->onUpdate('cascade'); $table->foreign('follow_id') ->references('id') ->on('users') ->onDelete('cascade') ->onUpdate('cascade'); // 組み合わせのダブりを禁止(二重フォローにならないように) $table->unique(['user_id', 'follow_id']); }); }

login.blade.php
(ログイン中の全てのページで表示させる親ビューファイル)

php

1<!DOCTYPE html> 2<html> 3<head> 4<meta charset="utf-8" /> 5 <!--IEブラウザ対策--> 6 <meta http-equiv="X-UA-Compatible" content="IE=edge" /> 7 <meta name="description" content="ページの内容を表す文章" /> 8 <title>dawnSNS</title> 9 <link rel="stylesheet" href="css/style.css" type="text/css"> 10 <link rel="stylesheet" href="css/reset.css" type="text/css"> 11</head> 12<body> 13 <header class="header"> 14 <div id = "head"> 15 <h1><a href="/top"><img src="images/main_logo.png" width="100px" height="auto"></a></h1> 16 </div> 17 <div id="menu"> 18 <div id="menuItem"> 19 <p class="js_menu">{{ Auth::user()->username }}さん<span></span><img src="images/dawn.png"></p> 20 </div> 21 <ul class="subMenu"> 22 <li class="submenu_item"><a href="/top">ホーム</a></li> 23 <li class="submenu_item"><a href="/profile">プロフィール</a></li> 24 <li class="submenu_item"><a href="/logout">ログアウト</a></li> 25 </ul> 26 </div> 27 </header> 28 29 30 31 <div id="row"> 32 <div id="container"> 33 @yield('content') 34 </div > 35 <div id="side-bar"> 36 <div id="confirm"> 37 <p>{{ Auth::user()->username }}さんの</p> 38 <div> 39 <p>フォロー数</p> 40 <p>{{ $count_followings }}</p> //←これを表示させたい 41 42 </div> 43 <p class="btn"><a href="">フォローリスト</a></p> 44 <div> 45 <p>フォロワー数</p> 46 <p>{{ $count_followings }}</p> 47 </div> 48 <p class="btn"><a href="">フォロワーリスト</a></p> 49 </div> 50 <p class="btn"><a href="/search">ユーザー検索</a></p> 51 </div> 52 </div>

UsersController.php

php

1public function countFollowings() 2 { 3 $userId = Auth::user()->id; 4 $count_followings = \DB::connection('hoge') 5 ->table('follows') 6 ->where('user_id', '=', $userId) 7 ->count(); 8 9 return view('layouts.login', [ 10 'count_followings' => $count_followings 11 ]);

web.php

Route::get('/top', 'UsersController@countFollowings');

Route::get('/top', ...);
にすると、いままで表示できていた子ビューファイルが表示できなくなりました。

調べてもこのような問題の解決方法がのっている記事をみつけることができませんでした。
どうかご教授おねがいいたします。

補足

子ビューファイルを掲載いたします。(search.blade.php)
これは/topではなく、アカウントを作ったユーザーを検索する画面ですが。
top以外にも全て共通で表示させたいのです。

@extends('layouts.login') @section('content') <div id="container"> <div class="seach"> {!!Form::input( 'text', 'newPost', null, ['required', 'class' => 'form-control', 'placeholder' => 'ユーザー名'] )!!} </div> <button type="submit" class="" name=""> <img src="images/search.png" alt="検索ボタン" width="25px" height="25px"> </button> <div class="userIndex"> <table> @foreach ($all_users as $user) <tr> <td> <img class="image-circle" src="{{ asset('images/' . $user->images ) }}" alt=""> </td> <td>{{ $user->username }}</td> <td> @include('follows.follow_button', ['user'=>$user]) </td> </tr> @endforeach </table> </div> </div> @endsection

質問する上でどの変数かを明示したかっただけですので
「//←これを表示させたい」については実際のコードには書いてません。

知識が浅く、見当違いなことをお尋ねしてしまっているかもしれません。
ご容赦ください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuki84web

2020/09/13 02:22

子ビューファイルを掲載願います。また、「←これを表示させたい」というのは、今回の問題には関係あるのでしょうか。
guest

回答1

0

ベストアンサー

この場合ViewComposerを用いると良いと思います
サイドバーなど複数のページで共通するデータを表示したいときはViewComposerが良いと思います

子ビュー等のルーティングしたものにアクセスした際に、自動で親viewなど指定したviewに必要なデータを渡してくれるものですので、親にルーティングで渡す等は不要です

参考

かんたんに手順ですが
AppServiceProviderに

use Illuminate\Support\Facades\View;でViewFacadeを読み込み
bootメソッド内に下記のような感じで記述します

php

1View::composer('ここにblade名...今回ならlogin', function ($view) { 2 //ここでフォロワー等渡したいものの取得処理 3 $view->with('渡したい変数名',$渡す変数);// controllerから渡すときの感じです 4}); 5

ViewComposerで調べると参考がたくさん出てくるのでお試しください
別なServiceProviderを作成したり、別クラスに分ける等の手法もありますが、ここでは簡素化して書いています

一度お試しいただけますと幸いです
よろしくお願いします

投稿2020/09/13 06:24

編集2020/09/13 06:29
natsume2233

総合スコア225

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

natsumi.boc

2020/09/13 07:26

ありがとうございます! ご教授いただいた手順でばっちり反映されました! ビューコンポーザを使用すればよいのですね。とても勉強になりました。 周辺機能を調べて、より理解を深めようと思います。 ありがとうございました!
ka0000

2022/07/03 16:05

dawnを独学で学んでおりその他の場所でもつまずいている状態です。可能であればコードを見せていただくことは可能でしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問