8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

如何在 Doctrine Extension 中根据属性过滤 DiscriminatorMap?[Api-platform]

Linces games 2月前

49 0

我有一个项目,其中我在 Vehicle 实体中使用了 Doctrine 继承和 DiscriminatorMap,其中包括 Bike 实体。我的目标是创建一个自定义 Doctrine 扩展来过滤掉自行车...

我有一个项目,其中我在 Vehicle 实体中使用了 Doctrine 继承和 DiscriminatorMap,其中包括 Bike 实体。我的目标是创建一个自定义 Doctrine 扩展,以便在使用 GET /vehicles 获取所有车辆时过滤掉未发布的自行车 (isPublished = false)。

以下是我的代码的相关部分:

<?php
//...

#[ORM\Entity(repositoryClass: VehicleRepository::class)]
#[ORM\InheritanceType('JOINED')]
#[ORM\DiscriminatorColumn(name: 'discr', type: 'string')]
#[ORM\DiscriminatorMap([
    'car' => Car::class,
    'bike' => Bike::class
])]
#[ApiResource]
class Vehicle
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    private ?int $id = null;

<?php
//...

#[ORM\Entity(repositoryClass: BikeRepository::class)]
#[ApiResource]
#[ApiFilter(OrderFilter::class)]
class Bike
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    private ?int $id = null;

    #[ORM\Column]
    private ?bool $isPublished = null;

我与 Vehicle 的 Bike 之间存在 DiscriminatorMap 关系。当我执行此操作时, GET /vehicles 我想进行一个扩展来检查 Bike 是否在 isPublished = true

通过此扩展和这个 dd() 我得到了 “SELECT o FROM App\Entity\Vehicle\Vehicle o” 。我如何过滤自行车?

<?php
// ...

class DoctrineExtension implements QueryCollectionExtensionInterface
{
    public function applyToCollection(
        /* ... */
    ): void
    {
        $rootAlias = $queryBuilder->getRootAliases()[0];

        if ($resourceClass === Vehicle::class) {
            dd($queryBuilder->getDQL());
        }
    }
}
帖子版权声明 1、本帖标题:如何在 Doctrine Extension 中根据属性过滤 DiscriminatorMap?[Api-platform]
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Linces games在本站《symfony》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 在此处输入图像描述我正在使用 WORKOs 但不知何故我收到了角色无效的错误我认为问题可能在于此角色未定义或未包含在 workos 系统中...

    在此处输入图片描述

    我正在与 WORKO 合作,不知何故我收到了角色无效的错误

    我认为问题可能是这个角色没有定义或没有包含在 Workos 系统中

    'use server';
    
    import {WorkOS} from "@workos-inc/node";
    import {revalidatePath} from "next/cache";
    import {redirect} from "next/navigation";
    
    const workos = new WorkOS(process.env.WORKOS_API_KEY);
    
    export async function createCompany(companyName: string, userId:string) {
      const org = await workos.organizations.createOrganization({name: companyName});
      await workos.userManagement.createOrganizationMembership({
        userId,
        organizationId: org.id,
        roleSlug: 'admin',
      });
      revalidatePath('/new-listing');
      redirect('/new-listing');
    

    可能在这里

  • 我有以下设置:在 k8s 上运行的微服务是单个应用程序的一部分,所有跨服务和客户端服务通信都经过的网关,用于验证令牌......

    我有以下设置:在 k8s 上运行的微服务是单个应用程序的一部分,所有跨服务和客户端服务通信都经过的网关,它验证通过请求传递的令牌和发出令牌的 Keycloak。

    我有一个用于网关的 Keycloak 客户端,以便用户提供用户名和密码并通过 Keycloak UI 登录,使用标准 OidC 流程。

    我卡在了跨服务通信上,希望客户端和服务端通信的范围、角色、资源能够统一。

    据我所知,M2M 通信是通过客户端凭证授予类型实现的。这意味着,如果我想对每个服务进行细粒度的访问控制,我需要每个服务都有一个客户端,因为每个服务都有自己可以访问的服务,但不是所有服务,所以据我所知,唯一的方法是为不同的客户端实现不同的范围和资源。

    但是,如果我确实为每个服务创建一个客户端,那么我就会遇到一个问题,即资源不是全局的而是客户端范围的,因此我无法为所有客户端提供统一、同步的资源。另外,据我了解,Keycloak 中的客户端代表我们访问的资源/应用程序,因此我们需要为每个服务提供不同的客户端。

    例如,如果我有访问 B 和 C 的服务 A,那么我需要创建一个客户端“A 到 B”以及“A 到 C”,并且这将会呈指数增长。

    我感觉我遗漏了一些东西。我该如何解决我所描述的问题?

  • .................urls.py..........从 django.contrib 导入管理员从 django.urls 导入路径,包括从用户导入视图作为 user_view从 django.contrib.auth 导入视图作为 auth_views从

    .......urls.py......

    from django.contrib import admin
    
    from django.urls import path, include
    from user import views as user_view
    from django.contrib.auth import views as auth_views
    from django.views.generic import TemplateView
    from django.conf import settings
    from django.conf.urls.static import static
    
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('', include('dashboard.urls')),
        path('register/', user_view.register, name = 'user-register'),
        path('profile/', user_view.profile, name = 'user-profile'),
        path('', auth_views.LoginView.as_view(template_name = 'user/login.html'),name='user-login'),
        path('logout/', TemplateView.as_view(template_name = 'user/logout.html'),name='user-logout' ),
        
    ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    

    ...........视图.py........

    from django.shortcuts import render, redirect
    from django.contrib.auth.forms import UserCreationForm
    from .forms import CreateUserForm
    from django.contrib.auth.models import User
    from django.contrib.auth.decorators import login_required
    
    
    
    def register(request):
        if request.method == 'POST':
            form = CreateUserForm(request.POST)
            if form.is_valid():
                form.save()
                return redirect('user-login')
        else:
            form = CreateUserForm()
        context = {
            'form': form,
        }
        return render(request, 'user/register.html',context)
    
    
    def profile(request):
        return render(request, 'user/profile.html')
    

    .........导航.html........

    <nav class="navbar navbar-expand-lg navbar-info bg-info">
        {% if user.is_authenticated %}
        <div class="container">
            <a class="navbar-brand text-white" href="{% url 'dashboard-index' %}">NTPC Inventory</a>
            <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent"
                aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
                <span class="navbar-toggler-icon"></span>
            </button>
    
            <div class="collapse navbar-collapse" id="navbarSupportedContent">
                <ul class="navbar-nav mr-auto">
                    <li class="nav-item active">
                        <a class="nav-link text-white" href="{% url 'dashboard-index' %}">Dashboard <span
                                class="sr-only">(current)</span></a>
                    </li>
                </ul>
                
                <ul class="navbar-nav ml-auto">
                    <li class="nav-item active">
                        <a class="nav-link text-white" href="profile.html">Admin Profile <span
                                class="sr-only">(current)</span></a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link text-white" href="{% url 'user-logout' %}">Logout</a>
                    </li>
                </ul>
                
               <!-- problem is not solved as is.authenticated is not working as it show logout and admin profile for the same still finding out the solution -->
              {% else  %} 
                <ul class="navbar-nav ml-auto">
                    <li class="nav-item active">
                        <a class="nav-link text-white" href="{% url 'user-register' %}">Register <span
                                class="sr-only">(current)</span></a>
                    </li>
                    
                    <li class="nav-item">
                        <a class="nav-link text-white" href="{% url 'user-login' %}">Login</a>
                    </li>
                </ul>
                {% endif %}
            </div>
        </div>
    </nav> 
    

    我尝试导入不同的库,但仍然无法找到解决方案,每当我清除 chrome 的 cookie 时,它​​才适用于该页面的单次加载,但一旦我重新加载,它就会再次出现相同的情况。

    它在导航中显示经过身份验证的块作为管理员配置文件注销,但不显示注册登录选项。

  • 您的 Jinja 语法需要稍微修改一下。如果您想在 Django 模板中检查用户是否经过身份验证,您需要按如下方式操作:

    {% if request.user.is_authenticated %}
              <a href="{% url 'user-logout' %}" class="appointment-btn scrollto">Logout</a>
              <a href="{% url 'user-profile' %}" class="appointment-btn scrollto">Profile-{{ user.username }}</a>
    {% else %}
              <a href="{% url 'user-login' %}" class="appointment-btn scrollto">Sign in / Sign up</a>
    {% endif %}
    

    您忘记了模板中的请求。此外,您还可以在视图中检查用户是否已通过身份验证,如下所示:

    def profile(request):
        if request.user.is_authenticated:
            return render(request, 'user/profile.html', {'user':request.user})
        else:
            return redirect('user-login')
    

    您的 urls.py 路径有两条为空的路径。请检查一下:

    from django.contrib import admin
    
    from django.urls import path, include
    from user import views as user_view
    from django.contrib.auth import views as auth_views
    from django.views.generic import TemplateView
    from django.conf import settings
    from django.conf.urls.static import static
    
    
    urlpatterns = [
        path('admin/', admin.site.urls),
    
        # see this one and,
        path('', include('dashboard.urls')),
    
        path('register/', user_view.register, name = 'user-register'),
        path('profile/', user_view.profile, name = 'user-profile'),
        
        # see this one 
        path('', auth_views.LoginView.as_view(template_name = 'user/login.html'),name='user-login'),
    
        path('logout/', TemplateView.as_view(template_name = 'user/logout.html'),name='user-logout' ),
        
    ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    

    我建议将其更改为其他内容,例如:

    rom django.contrib import admin
    
    from django.urls import path, include
    from user import views as user_view
    from django.contrib.auth import views as auth_views
    from django.views.generic import TemplateView
    from django.conf import settings
    from django.conf.urls.static import static
    
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('', include('dashboard.urls')),
        path('register/', user_view.register, name = 'user-register'),
        path('profile/', user_view.profile, name = 'user-profile'),
    
        # I'v changed this to login path
        path('login/', auth_views.LoginView.as_view(template_name = 'user/login.html'),name='user-login'),
        path('logout/', TemplateView.as_view(template_name = 'user/logout.html'),name='user-logout' ),
        
    ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    
  • 默认上下文处理器将请求和用户都添加到上下文中,其中用户是 request.user。因此可以说它们的模板是正确的(除非它们从它们的角度来看将其他用户对象添加到上下文中)。

  • 我以前也尝试过 request.user,但是现在它不起作用了,正如你所建议的那样,我也尝试过在视图中进行更改,但问题仍然存在,它并没有解决这个问题。如果 request.user.is_authenticated 始终为真。

  • 它没有影响,问题仍然相同。在登录页面中,它显示注销选项和个人资料选项,而不是登录和注册。

返回
作者最近主题: