У разных типов пользователей разные профили, но мне нужен один, чтобы видеть других - PullRequest
0 голосов
/ 01 мая 2018

У меня в приложении два типа пользователей. Арендодатель и арендатор. В настоящее время, когда домовладелец находится на одной странице арендаторов, они могут видеть кнопку стартового арендатора и все. Если запрос отправлен, и я пытаюсь это показать, арендодатель не может увидеть сообщение на странице арендаторов, но арендатор может увидеть его на своей странице /

Как разрешить домовладельцу видеть сообщение, которое может видеть арендатор.

Это строка базы данных (поддельные данные):

This is the database row (fake data)

Код контроллера, который отображает профили:

public function index($id){
    //Authenticated different user types
    //Sends Landlord and Tenant to appropiate pages
    $user = User::where('id', $id)->first();
    //Allows landlords to see their relationship with tenants, and vice versa.
    $landlordTenancies = Tenancy::all()->where('landlord_id', Auth::id());
    $tenantTenancies = Tenancy::all()->where('tenant_id', Auth::id());

    //Allows the attirbutes from the table to be access by correct landlord and tenant
    $tenancy = Tenancy::where('tenant_id', Auth::id())->first();
    $Tenancy = Tenancy::where('landlord_id', Auth::id())->first();

    //Sends different use types to relevant view

    if($user->userType == "Landlord"){
        return view('/pages/account/landlord', compact('properties', 'user', 'Watchlists', 'property', 'landlordTenancies', 'Tenancy'));
    }

    else{
        return view('/pages/account/tenant', compact('properties', 'user', 'Watchlists', 'property', 'tenantTenancies', 'tenancy'));
    }
 }

Страница просмотра арендатора

<div class="container">
    <div class="row">
        <div class="col-md-12">
            @foreach($tenantTenancies as $tenancy)
            <span class="lead"><strong>Landlord Name: </strong>{{$tenancy->landlord_name}}</span><br>
            <span class="lead"><strong>Property Address: </strong>{{$tenancy->property_address}}</span><br>
            @endforeach

                {{-- This blocks a tenant adding themselves --}}
                {{-- Shows add button, if tenancy model is empty. Also when no relationship established. --}}

            @if(Auth::user()->id != $user->id)
                @if($tenancy == null || $tenancy->accepted == 0 && $tenancy->request_sent != 1)
                    <a href="/account/tenancy/{{$user->id}}/create" class="btn btn-primary">Start Tenancy</a>
                @elseif($tenancy->request_sent === 1)
                    <span class="text-muted">You have a tenancy request</span>
                @endif
            @endif

                {{-- Only shows following buttons, if the current signed in user, is the relevant user. --}}
                {{-- Shows accept/reject if the request has been sent, but not accepted yet. --}}

            @if(Auth::user()->id == $user->id)
                @if($tenancy != null && $tenancy->accepted == 0 && $tenancy->request_sent == 1)
                    <form method="POST" action="/account/tenancy/{{$user->id}}/accept">
                        {{ csrf_field() }}
                        <input type="submit" class="btn btn-primary" value="Accept Request">
                    </form>

                    <form method="POST" action="/account/tenancy/{{$user->id}}/reject">
                        {{ csrf_field() }}
                        <input type="submit" class="btn btn-warning" value="Reject Request">
                    </form>

                    {{-- Allows the tenancy to be ended. --}}

                @elseif($tenancy != null && $tenancy->accepted == 1 && $tenancy->request_sent == 0)
                    <form method="POST" action="/account/tenancy/{{$user->id}}/end">
                        {{ csrf_field() }}
                        <input type="submit" class="btn btn-primary" value="End Tenancy">
                    </form>
                @endif
            @endif
        </div>
    </div>

Страница арендодателя

<div class="container">


    <div class="row text-center d-flex flex-wrap">
        <div class="col-lg-12">
        @foreach($landlordTenancies as $tenancy)
            <span class="lead"><strong>Tenant Name: </strong>{{$tenancy->tenant_name}}</span><br>
            <span class="lead"><strong>Property Address: </strong>{{$tenancy->property_address}}</span><br>
        @endforeach
            <h3>Your Active Adverts</h3>
            <div class="row py-2">

            @foreach ($properties as $property)
                <div class="col-md-4 mb-4">
                    <a href="/property/{{$property->id}}">
                        <img class="list-image img-fluid" src="{{$property->photo}}">
                    </a>
                    <p class="mt-2">{{$property->address .', '. $property->town .', '. $property->county}}</p>
                </div>
            @endforeach
        </div> <!-- ./col -->
    </div> <!-- ./row -->
</div>  <!-- ./container -->

В настоящее время, когда арендодатель находится на странице арендатора, они могут это видеть. Даже если запрос отправлен, они не видят сообщение, запрос отправлен.

LandlordOnTenant:

LandlordOnTenant

Когда арендатор находится на арендаторе, и он видит отправленное сообщение с запросом, а также кнопки принятия / отклонения.

tenantOnTenantPage:

tenantOnTenantPage

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

Есть идеи?

1 Ответ

0 голосов
/ 01 мая 2018

Ознакомьтесь с документами по аутентификации Laravel и особенно с политиками https://laravel.com/docs/5.6/authorization#creating-policies

Первый шаг, который я бы предложил, - это создать некоторые политики для модели собственности, возможно, такие вещи, как (можно) управлять для типа арендодателя Пользователь и (можно) арендовать для арендатора, это не имеет большого значения, пока язык несколько естественно, потому что ваш код будет выглядеть как

@can('manage', $property)
some html for landlords only
@endcan

с примерно аналогичными аналогами в ваших контроллерах и тому подобное. Вы также можете использовать эту авторизацию на уровне маршрута

Route::get('/landlordsonly', function () { return view('x'); })->middleware('can:manage,property');

Что вернет запрещенную ошибку для не арендодателей. Это позволяет действительно легко защитить некоторые конечные точки, например, все мои действия администратора относятся к POST для определенных маршрутов, поэтому разрешите только администраторам доступ к этому маршруту, и тогда контроллер может предположить, что только администраторы смогут получить к нему доступ. Тогда все, что вам осталось, это включить в эти проверки то, что вам нужно, только для определенных пользователей. @Can является сокращением и может быть записан в виде @if ().

Есть много вещей, которые можно описать, просто используйте документацию и выясните это. Прежде чем подумать о том, чтобы что-то сделать, подумайте, как это сделать в laravel, вероятно, у него будут методы или загружаемые пакеты для того, что вам нужно, и нет смысла изобретать велосипед.

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