Проблема с доступом к переменным на разных страницах - PullRequest
1 голос
/ 02 апреля 2020

Мне нужно иметь доступ к определенным переменным во всем приложении (во всех блейд-файлах). В настоящее время я могу получить к ним доступ только на одной странице, и эта страница настроена в контроллере (profile.show). Мне удалось получить доступ к одной из этих переменных с представлением composer в AppServiceProvider. php, но я не могу сделать это для других. Когда я сбрасываю их на какой-то другой блейд, он показывает ошибку, которая не определена, но profile_details работает нормально. Мне нужна помощь о том, как поместить эти переменные ($ profile, $ data, $ options, $ photos) в AppServiceProvider. php composer, чтобы иметь доступ к ним. Любая помощь приветствуется. Вот мой код.

AppServiceProvider. php

<?php

namespace App\Providers;

use App\User;
use App\UserProfile;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\ServiceProvider;
use Illuminate\Database\Schema\Builder; // Import Builder where defaultStringLength method is defined

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {

    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */


    public function boot()
    { 
        view()->composer('*', function ($view) {
            $view->with('profile_details', Auth::id() ? UserProfile::profileDetails(Auth::id(), Auth::id()) : []);  
        });

        Builder::defaultStringLength(191); // Update defaultStringLength
    }

}

UserProfileController. php

class UserProfileController extends Controller
{
    public function showProfile($username, Request $request)
    {
        $user = $request->user();
        $viewer = User::find(Auth::id());
        $owner = User::where('username', $username)->first();

        if($viewer->id !== $owner->id && !$owner->active){
            abort(404);
        }

        if(!$profileId = User::getIdFromUsername($username)){
            abort(404);
        }

        $profile = UserProfile::profileDetails($profileId, $viewer->id);

        $data = UserProfile::getProfileLookingFor(Auth::user()->id);

        $options = UserProfile::getProfileLookingForDisplayOptions();

        $details = $this->returnDropdowns();


        $photo = new Photo();
        $photos = $photo->managePhotos();

        return view('profile.show', compact('user', 'profile', 'data', 'options', 'details', 'photos'));
    }
}

UserProfile. php

<?php

namespace App;

use App\User;

use App\Value;
use App\FieldValue;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Notifications\Notifiable;


class UserProfile extends Model

    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public static function profileData($profileId, $viewerId)
    {
        $user = User::find($viewerId);
        $profile = DB::table('users as u')
            ->select(DB::raw("
                data.*,
                u.id, u.gender_id, u.username, u.email, u.password, u.first_name, u.last_name, u.age, u.date_of_birth, u.premium, u.active, u.job, u.mobile_number
            "))
            ->leftJoin('user_profiles as data', 'data.user_id', '=', 'u.id')
            ->where('u.id', $profileId)
            ->first();

        return $profile;
    }

    public static function profileDetails($profileId, $viewerId)
    {
        $profile = static::profileData($profileId, $viewerId);

        if ($profile) {
            if ($viewerId != $profileId) {
                # Viewer is displaying another user's profile.
                $myProfile = false;
                } else {
                    $myProfile = true;
                }
            }

        $unit = FieldValue::measure();
        $height = App::make('App\FieldValue')->height($profile->height, $unit);

            $profile = [
                'viewerId' => $viewerId,
                'profile_id' => $profileId,
                'myProfile' => $myProfile,
                'height' => $height,
                'personal_quote' => $profile->personal_quote,
                'about_me' => $profile->about_me,
                'astro' => UserAstro::all(),
                'bodyType' => UserBodyType::all(),
                'children' => UserChildren::all(),
                'education' => UserEducation::all(),
                'orientation' => UserOrientation::all(),
                'relationshipStatus' => UserRelationshipStatus::all(),
                'smoke' => UserSmoke::all(),
            ];

        return $profile;
    }

    public static function getProfileLookingFor($userId)
    {
        $results = DB::table('user_interests')
            ->select('field_id', 'value_id')
            ->where('user_id', $userId)
            ->orderBy('field_id')
            ->get();

        $data = [];
        if (! empty($results)) {
            foreach ($results as $result) {
                if (isset($data[$result->field_id])) {
                    array_push($data[$result->field_id], $result->value_id);
                } else {
                    $data[$result->field_id] = [$result->value_id];
                }
            }
        }

        return $data;
    }

    public static function getProfileLookingForDisplayOptions()
    {
        $options = [
            'gender' => ['id' => 1, 'label' => "Interessiert an"],
            'looking_for' => ['id' => 2, 'label' => ""]
        ];

        $data_options = [];
        foreach ($options as $field => $value) {
            $data_options[$field]['data'] = Value::fieldValues($field);
            $data_options[$field]['label'] = $options[$field];

            if (!in_array($field, ['gender', 'looking_for'])) {
                $data_options[$field]['data'][100] = "Doesn't matter";
            }
        }

        return $data_options;
    }

    public function postProfileLookingFor($userId, Request $request)
    {
        $data = $request->all();
        $options = [
            'gender'         => 1,
            'looking_for'    => 2
        ];

        foreach ($options as $fieldName => $fieldId) {
            if (! empty($data[$fieldName])) {
                DB::table('user_interests')
                    ->where('user_id', $userId)
                    ->where('field_id', $fieldId)
                    ->delete();

                if (is_array($data[$fieldName])) { // Checkboxes
                    foreach ($data[$fieldName] as $key => $value) {
                        DB::table('user_interests')->insert([
                            'user_id'  => $userId,
                            'field_id' => $fieldId,
                            'value_id' => $value
                        ]);
                    }
                } else { // Select fields
                    DB::table('user_interests')->insert([
                        'user_id'  => $userId,
                        'field_id' => $fieldId,
                        'value_id' => $data[$fieldName]
                    ]);
                }
            }
        }
    }
}

1 Ответ

1 голос
/ 02 апреля 2020

Вы можете использовать View::share для доступа к переменной во всех представлениях:

В boot методе *1004* выполните следующее:

public function boot() {

    $profile_details = Auth::id() ? UserProfile::profileDetails(Auth::id(), Auth::id()) : [];

    View::share('profile_details', $profile_details);

    Builder::defaultStringLength(191); // Update defaultStringLength
}

Документация по View::share

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...