gpt4 book ai didi

php - 扩展 Laravel 路由器 API

转载 作者:可可西里 更新时间:2023-10-31 23:36:15 26 4
gpt4 key购买 nike

我正在尝试扩展 Laravel 5.6 路由器类以添加一些方便的方法来注册路由。

我创建了一个扩展 Illuminate\Routing\Router 类的类,如下所示:

Namespace App\Overrides;

use Illuminate\Routing\Router as LaravelRouter;

class Router extends LaravelRouter
{

public function apiReadResource($name, $controller, array $options = [])
{
$this->resource($name, $controller, array_merge([
'only' => ['index', 'show'],
], $options));
}

public function apiWriteResource($name, $controller, array $options = [])
{
$this->resource($name, $controller, array_merge([
'except' => ['index', 'show', 'edit', 'create', 'destroy'],
], $options));
}

public function apiRelationshipResources($name, $controller, array $relationships, array $options = [])
{
foreach($relationships as $relationship)
{
$this->get(
$name.'/{id}/'.$relationship,
[
'uses' => $controller . '@' . $relationship,
'as' => $name . '.' . $relationship,
]
);
}
}

}

我已经在默认的 App\Providers\RouteServiceProvider 中像这样注册了我的扩展类:

namespace App\Providers;

use Illuminate\Routing\Router;
use App\Overrides\Router as APIRouter;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Route;

class RouteServiceProvider extends ServiceProvider
{
/**
* This namespace is applied to your controller routes.
*
* In addition, it is set as the URL generator's root namespace.
*
* @var string
*/
protected $namespace = 'App\Http\Controllers';


public function register()
{
$this->app->singleton('router', function ($app) {
return new APIRouter($app['events'], $app);
});
}

/**
* Define your route model bindings, pattern filters, etc.
*
* @return void
*/
public function boot()
[more code...]
}

在路由文件中,我像这样调用自己的自定义方法:Route::apiWriteResource('users', 'UserController'); 或像这样 Route::apiRelationshipResources('users ', 'UserController', ['评论']);

所有路由都已注册并正确显示在 php artisan route:list 中,但没有任何路由真正起作用。他们都给出了标准的404页面。

我做错了什么?我错过了什么?

最佳答案

基于 here 中的文档, here , here并 checkin Router.php我想到写一个答案。

尝试以下步骤:

1) 在app文件夹中创建Routing文件夹

创建一个:

2) app\Routing\ApiReadResource.php 内容如下:

<?php
namespace App\Routing

use Illuminate\Routing\Router;


class ApiReadResource
{
public static function register()
{
if (!Router::hasMacro('apiReadResource')) {
Router::macro('apiReadResource', function ($name, $controller, $options = []) {
Router::resource(
$name,
$controller,
array_merge(['only' => ['index', 'show']], $options)
);
});
}
}
}

3) app\Routing\ApiWriteResource.php 内容如下:

<?php
namespace App\Routing

use Illuminate\Routing\Router;


class ApiWriteResource
{
public static function register()
{
if (!Router::hasMacro('apiWriteResource')) {
Router::macro('apiWriteResource', function ($name, $controller, $options = []) {
Router::resource(
$name,
$controller,
array_merge(['except' => ['index', 'show', 'edit', 'create', 'destroy']], $options)
);
});
}
}
}

4) app\Routing\ApiRelationshipResources.php 内容如下:

<?php
namespace App\Routing

use Illuminate\Routing\Router;


class ApiRelationshipResources
{
public static function register()
{
if (!Router::hasMacro('apiRelationshipResources')) {
Router::macro('apiRelationshipResources', function ($name, $controller, array $relationships, $options = []) {
foreach($relationships AS $relationship) {
Router::get(
$name.'/{id}/'.$relationship,
array_merge($options, [
'uses' => $controller . '@' . $relationship,
'as' => $name . '.' . $relationship,
])
);
}
});
}
}
}

5) 在AppServiceProvider中注册它们:

<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;

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

}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
\App\Routing\ApiReadResource::register();
\App\Routing\ApiWriteResource::register();
\App\Routing\ApiRelationshipResources::register();
}
}

关于php - 扩展 Laravel 路由器 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50553571/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com