検索
ホームページPHPフレームワークLaravelLaravelコントローラーとは何ですか

Laravelコントローラーとは何ですか

Jan 14, 2023 am 11:16 AM
phplaravelコントローラ

laravel では、コントローラー (Controller) は特定の機能を実装するために使用されるクラスであり、コントローラーは関連するリクエスト処理ロジックを別のクラスに結合できます。一部のメソッドは、特定の機能を実装するためにコントローラーに保存されます。コントローラーはルーティングを通じて呼び出され、コールバック関数は使用されなくなり、コントローラーは「app/Http/Controllers」ディレクトリに保存されます。

Laravelコントローラーとは何ですか

このチュートリアルの動作環境: Windows 7 システム、Laravel 6 バージョン、DELL G3 コンピューター。

#コントローラーの紹介

#1. コントローラーとは何ですか?

ルート ファイル内のクロージャの形式で定義されているすべてのリクエスト処理ロジックを置き換えるには、コントロール クラスを使用してこの動作を整理する必要がある場合があります。コントローラーは、関連するリクエスト処理ロジックを別のクラスにグループ化できます。

Controller は、特定の機能を実装するために使用されるクラスです。一部のメソッドは、特定の機能を実装するためにコントローラに格納されます。コントローラはルーティングを通じて呼び出され、コールバック関数は使用されなくなりました。

2. コントローラーはどこに書かれていますか?

#App/Http/Controllers コントローラーを配置します

Controller.php は親クラス ファイルであり、他のコントローラーは継承できます

#3. コントローラーファイルに名前を付けるにはどうすればよいですか? #せむしコントローラ名Controller.php

例: AddDataController.php LoginController.php

#4. コントローラの書き方構造?

artisan コマンドによって自動的に生成されます。例: 現在のプロジェクトのルート ディレクトリにいることを確認し、コマンド ラインに次のように入力します:

php artisan make:controller TestController

構造コードは自動的に完了します。

   namespace App\Http\Controller;
   use Illuminate\Http\Request;    
   class TestController extends  Controller{
     //
   }

基本コントローラ

コントローラの定義

次は基本的なコントローラの例です。コントローラークラス。このコントローラーは
Laravel

のベースコントローラーを継承していることに注意してください。このクラスのコントローラーには、コントローラーの動作にミドルウェアを追加できる

middleware メソッドなどの便利なメソッドがいくつか用意されています。

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Models\User;

class UserController extends Controller
{
    /**
     * 显示指定用户的简介
     *
     * @param  int  $id
     * @return \Illuminate\View\View
     */
    public function show($id)
    {
        return view(&#39;user.profile&#39;, [&#39;user&#39; => User::findOrFail($id)]);
    }
}
次のルーティングのように、コントローラーの動作へのポインターを定義できます。
use App\Http\Controllers\UserController;

Route::get(&#39;user/{id}&#39;, [UserController::class, &#39;show&#39;]);

リクエストが指定されたルートの URI と一致すると、

UserController

コントローラーの

show メソッドが実行されます。ルート パラメーターもこのメソッドに渡されます。 ヒント: コントローラーは基本クラスを継承するために

必須ではありません。コントローラーが基本クラスから継承していない場合、
middleware

validatedispatch メソッドなどの一部の便利な機能を使用できません。 。 単一動作コントローラー

単一動作のみを処理するコントローラーを定義したい場合は、__invoke# を配置できます。 ## メソッド:

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Models\User;

class ShowProfile extends Controller
{
    /**
     * 显示指定用户的简介
     *
     * @param  int  $id
     * @return \Illuminate\View\View
     */
    public function __invoke($id)
    {
        return view(&#39;user.profile&#39;, [&#39;user&#39; => User::findOrFail($id)]);
    }
}

単一の動作コントローラーのルートを登録する場合、メソッドを指定する必要はありません:

use App\Http\Controllers\ShowProfile;

Route::get(&#39;user/{id}&#39;, ShowProfile::class);
これは、Artisan コマンド ツールの make を通じて実行できます。 :controller

コマンドの

--invokable

オプションは、呼び出し可能なコントローラー

php artisan make:controller ShowProfile --invokable
を生成します。 ヒント: スタブを使用して、 カスタム コントロール コントローラーをカスタマイズできます。 template

Controller middleware

Middleware ルート ファイルでコントローラに割り当てることができるルート:
Route::get(&#39;profile&#39;, [UserController::class, &#39;show&#39;])->middleware(&#39;auth&#39;);

ただし、コントローラーのコンストラクターでミドルウェアを指定する方が便利です。コントローラーのコンストラクターで

middleware メソッドを使用すると、ミドルウェアをコントローラーに簡単に割り当てることができます。コントローラー内の特定のメソッドにのみ有効になるようにミドルウェアを制限することもできます。

class UserController extends Controller
{
    /**
     * 实例化一个新的控制器实例
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware(&#39;auth&#39;);

        $this->middleware(&#39;log&#39;)->only(&#39;index&#39;);

        $this->middleware(&#39;subscribed&#39;)->except(&#39;store&#39;);
    }
}

同時に、コントローラーではクロージャーを使用してミドルウェアを登録することもできます。これにより、ミドルウェア クラス全体を定義せずに、単一のコントローラーのミドルウェアを定義する便利な方法が提供されます。

$this->middleware(function ($request, $next) {
    // ...

    return $next($request);
});
ヒント: ミドルウェアをコントローラー アクション サブセットの 1 つに割り当てることができます。ただし、それはコントローラーが複雑になっていることを示している可能性があります。コントローラーを複数の小さなコントローラーに分割することをお勧めします。

リソースコントローラー

Laravel のリソースルーティングは、典型的な「CURD (作成、削除、変更、確認)」ルートを 1 行で割り当てることができます。コントローラーへのコード。たとえば、Save Photos アプリのすべての HTTP リクエストを処理するコントローラーを作成するとします。このようなコントローラーをすばやく作成するには、アーティザン コマンド make:controller を使用します。
php artisan make:controller PhotoController --resource

このコマンドは、コントローラー

app/Http/Controllers/PhotoController.php を生成します。これには、利用可能な各リソース操作のメソッドが含まれます。

次に、リソース ルートをコントローラーに登録できます。

Route::resource(&#39;photos&#39;, PhotoController::class);
この 1 つのルート宣言により、リソース上のさまざまな動作を処理するための複数のルートが作成されます。生成されたコントローラーは、HTTP 動詞と URL を処理するための宣言的アノテーションを含む、各アクションのメソッドを保持します。

配列パラメーターを

resources

メソッドに渡すことで、複数のリソース コントローラーを一度に作成できます:

Route::resources([
    &#39;photos&#39; => PhotoController::class,
    &#39;posts&#39; => PostController::class,
]);

リソース コントローラー操作の処理

Verb URI Action Route Name
GET /photos index photos.index
GET /photos/create create photos.create
POST /photos store photos.store
GET /photos/{photo} show photos.show
GET /photos/{photo}/edit edit photos.edit
PUT/PATCH /photos/{photo} update photos.update
DELETE /photos/{photo} destroy photos.destroy

指定资源模型

如果你使用了路由模型绑定,并且想在资源控制器的方法中使用类型提示,你可以在生成控制器的时候使用 --model 选项:

php artisan make:controller PhotoController --resource --model=Photo

部分资源路由

当声明资源路由时,你可以指定控制器处理的部分行为,而不是所有默认的行为:

Route::resource(&#39;photos&#39;, PhotoController::class)->only([
    &#39;index&#39;, &#39;show&#39;
]);

Route::resource(&#39;photos&#39;, PhotoController::class)->except([
    &#39;create&#39;, &#39;store&#39;, &#39;update&#39;, &#39;destroy&#39;
]);

API 资源路由

当声明用于 APIs 的资源路由时,通常需要排除显示 HTML 模板的路由(如 createedit )。为了方便起见,你可以使用 apiResource 方法自动排除这两个路由:

Route::apiResource(&#39;photos&#39;, PhotoController::class);

你也可以传递一个数组给 apiResources 方法来同时注册多个 API 资源控制器:

Route::apiResources([
    &#39;photos&#39; => PhotoController::class,
    &#39;posts&#39; => PostController::class,
]);

要快速生成不包含 createedit 方法的用于开发接口的资源控制器,请在执行 make:controller 命令时使用 --api 参数:

php artisan make:controller API/PhotoController --api

嵌套资源

有时可能需要定义一个嵌套的资源型路由。例如,照片资源可能被添加了多个评论。那么可以在路由中使用 “点” 符号来声明资源型控制器:

Route::resource(&#39;photos.comments&#39;, PhotoCommentController::class);

该路由会注册一个嵌套资源,可以使用如下 URI 访问:

/photos/{photo}/comments/{comment}

限定嵌套资源的范围

Laravel 的 隐式模型绑定 特性可以自动限定嵌套绑定的范围,因此已解析的子模型会自动属于父模型。定义嵌套路由时,使用 scoped 方法,可以开启自动范围限定,也可以指定 Laravel 应该按照哪个字段检索子模型资源

Route::resource(&#39;photos.comments&#39;, PhotoCommentController::class)->scoped([
    &#39;comment&#39; => &#39;slug&#39;,
]);

这个路由会注册一个限定范围的嵌套资源路由,可以像下面这样来访问:

/photos/{photo}/comments/{comment:slug}

浅层嵌套

通常,并不完全需要在 URI 中同时拥有父 ID 和子 ID ,因为子 ID 已经是唯一的标识符。当使用唯一标识符(如自动递增的主键)来标识 URI 中的模型时,可以选择使用「浅嵌套」的方式定义路由:

Route::resource(&#39;photos.comments&#39;, CommentController::class)->shallow();

上面的路由定义方式会定义以下路由:

HTTP 方式 URI 行为 路由名称
GET /photos/{photo}/comments index photos.comments.index
GET /photos/{photo}/comments/create create photos.comments.create
POST /photos/{photo}/comments store photos.comments.store
GET /comments/{comment} show comments.show
GET /comments/{comment}/edit edit comments.edit
PUT/PATCH /comments/{comment} update comments.update
DELETE /comments/{comment} destroy comments.destroy

命名资源路由

默认情况下,所有的资源控制器行为都有一个路由名称。你可以传入 names 数组来覆盖这些名称:

Route::resource(&#39;photos&#39;, PhotoController::class)->names([
    &#39;create&#39; => &#39;photos.build&#39;
]);

命名资源路由参数

默认情况下,Route::resource 会根据资源名称的「单数」形式创建资源路由的路由参数。你可以在选项数组中传入 parameters 参数来轻松地覆盖每个资源。parameters 数组应该是资源名称和参数名称的关联数组:

Route::resource(&#39;users&#39;, AdminUserController::class)->parameters([
    &#39;users&#39; => &#39;admin_user&#39;
]);

上例将会为资源的 show 路由生成如下的 URI :

/users/{admin_user}

限定范围的资源路由

有时,在定义资源路由时隐式绑定了多个 Eloquent 模型,你希望限定第二个 Eloquent 模型必须为第一个 Eloquent 模型的子模型。例如,考虑这样一个场景,通过 slug 检索某个特殊用户的一篇文章:

use App\Http\Controllers\PostsController;Route::resource(&#39;users.posts&#39;, PostsController::class)->scoped();

你可以通过给 scoped 方法传递一个数组来覆盖默认的模型路由键:

use App\Http\Controllers\PostsController;Route::resource(&#39;users.posts&#39;, PostsController::class)->scoped([
    &#39;post&#39; => &#39;slug&#39;,
]);

当使用一个自定义键的隐式绑定作为嵌套路由参数时,Laravel 会自动限定查询范围,按照约定的命名方式去父类中查找关联方法,然后检索到对应的嵌套模型。在这种情况下,将假定 User 模型有一个叫 posts(路由参数名的复数)的关联方法,通过这个方法可以检索到 Post 模型。

默认情况下,Route::resource 将会用英文动词创建资源 URI。如果需要自定义 createedit 行为的动作名,可以在 AppServiceProviderboot 中使用 Route::resourceVerbs 方法实现:

use Illuminate\Support\Facades\Route;

/**
 * 引导任何应用服务。
 *
 * @return void
 */
public function boot()
{
    Route::resourceVerbs([
        &#39;create&#39; => &#39;crear&#39;,
        &#39;edit&#39; => &#39;editar&#39;,
    ]);
}

动作被自定义后,像 Route::resource('fotos', 'PhotoController') 这样注册的资源路由将会产生如下的 URI:

/fotos/crear

/fotos/{foto}/editar

补充资源控制器

如果您需要增加额外的路由到默认的资源路由之中,您需要在 Route::resource 前定义它们;否则, resource 方法定义的路由可能会无意间优先于您定义的路由:

Route::get('photos/popular', [PhotoController::class, 'popular']);

Route::resource(&#39;photos&#39;, PhotoController::class);

技巧:记得保持您的控制器的专一性。如果您需要典型的资源操作以外的方法,请考虑将您的控制器分割为两个更小的控制器。

依赖注入 & 控制器

构造注入

Laravel 服务容器 被用于解析所有的 Laravel 控制器。因此,您可以在控制器的构造函数中使用类型提示需要的依赖项。声明的解析会自动解析并注入到控制器实例中去:

<?php

namespace App\Http\Controllers;

use App\Repositories\UserRepository;

class UserController extends Controller
{
    /**
     * 用户 repository 实例。
     */
    protected $users;

    /**
     * 创建一个新的控制器实例。
     *
     * @param  UserRepository  $users
     * @return void
     */
    public function __construct(UserRepository $users)
    {
        $this->users = $users;
    }
}

您亦可类型提示 Laravel 契约 ,只要它能够被解析。取决于您的应用,注入依赖到控制器可能会提供更好的可测试性。

方法注入

除了构造器注入以外,您亦可在控制器方法中类型提示依赖。最常见的用法便是注入 Illuminate\Http\Request 到您的控制器方法中:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * 保存一个新用户。
     *
     * @param  Request  $request
     * @return Response
     */
    public function store(Request $request)
    {
        $name = $request->name;

        //
    }
}

如果您的控制器方法要从路由参数中获取输入内容,请在您的依赖项之后列出您的路由参数。例如,您可以像下方这样定义路由:

Route::put(&#39;user/{id}&#39;, [UserController::class, &#39;update&#39;]);

如下所示,您依然可以类型提示 Illuminate\Http\Request 并通过定义您的控制器方法访问 id 参数:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * 修改指定的用户。
     *
     * @param  Request  $request
     * @param  string  $id
     * @return Response
     */
    public function update(Request $request, $id)
    {
        //
    }
}

如果您的应用仅使用了基于路由的控制器,您应该充分利用 Laravel 路由缓存。使用路由缓存将会大幅降低您的应用路由的注册时间。有时,您的路由注册的速度可能会提高 100 倍。要生成路由缓存,仅需执行  route:cache Artisan 命令:

php artisan route:cache

在运行该命令后,每次请求将会加载您缓存的路由文件。请记住,您每次添加新路由后均需要生成新的路由缓存。因此,您应该在项目部署时才运行 route:cache 命令。

您亦可使用 route:clear 来清除路由缓存:

php artisan route:clear

【相关推荐:laravel视频教程

以上がLaravelコントローラーとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Laravel In Action:実際のアプリケーションと例Laravel In Action:実際のアプリケーションと例Apr 16, 2025 am 12:02 AM

laravelcanbeefeectiveivefectively-worldapplications for buildingscalablewebsolutions.1)その概要を説明することで、lastulavel'secosystem(toolslikenovaを含むlaravel'secosystem)を拡張します

Laravelの主な機能:バックエンド開発Laravelの主な機能:バックエンド開発Apr 15, 2025 am 12:14 AM

バックエンド開発におけるLaravelのコア機能には、ルーティングシステム、Eloquentorm、移行機能、キャッシュシステム、キューシステムが含まれます。 1.ルーティングシステムは、URLマッピングを簡素化し、コードの組織とメンテナンスを改善します。 2.Eloquentormは、開発効率を改善するためにオブジェクト指向のデータ操作を提供します。 3.移行関数は、バージョン制御を介してデータベース構造を管理して、一貫性を確保します。 4.キャッシュシステムは、データベースクエリを削減し、応答速度を向上させます。 5.キューシステムは、大規模なデータを効果的に処理し、ユーザー要求のブロックを避け、全体的なパフォーマンスを改善します。

Laravelのバックエンド機能:データベース、ロジックなどLaravelのバックエンド機能:データベース、ロジックなどApr 14, 2025 am 12:04 AM

Laravelは、バックエンド開発で強く機能し、Eloquentorm、コントローラー、サービスクラスを介してデータベース操作を簡素化し、ビジネスロジックを処理し、キュー、イベント、その他の機能を提供します。 1)Eloquentormは、モデルを介してデータベーステーブルをマップしてクエリを簡素化します。 2)ビジネスロジックは、モジュール性と保守性を向上させるために、コントローラーとサービスクラスで処理されます。 3)キューシステムなどのその他の機能は、複雑なニーズの処理に役立ちます。

Laravelの汎用性:単純なサイトから複雑なシステムまでLaravelの汎用性:単純なサイトから複雑なシステムまでApr 13, 2025 am 12:13 AM

Laravel Developmentプロジェクトは、さまざまなサイズと複雑さのニーズに合う柔軟性とパワーのために選択されました。 Laravelは、ルーティングシステム、Eloquentorm、Artisan Command Lineおよびその他の機能を提供し、簡単なブログから複雑なエンタープライズレベルのシステムへの開発をサポートしています。

Laravel(PHP)vs。Python:開発環境とエコシステムLaravel(PHP)vs。Python:開発環境とエコシステムApr 12, 2025 am 12:10 AM

開発環境とエコシステムにおけるLaravelとPythonの比較は次のとおりです。1。Laravelの開発環境は簡単で、PHPと作曲家のみが必要です。 Laravelforgeなどの豊富な範囲の拡張パッケージを提供しますが、拡張パッケージのメンテナンスはタイムリーではない場合があります。 2。Pythonの開発環境もシンプルで、PythonとPIPのみが必要です。エコシステムは巨大で複数のフィールドをカバーしていますが、バージョンと依存関係の管理は複雑な場合があります。

LaravelとThe BackEnd:Webアプリケーションロジックの電源LaravelとThe BackEnd:Webアプリケーションロジックの電源Apr 11, 2025 am 11:29 AM

Laravelはバックエンドロジックでどのように役割を果たしますか?ルーティングシステム、Eloquentorm、認証と承認、イベントとリスナー、パフォーマンスの最適化を通じてバックエンド開発を簡素化および強化します。 1.ルーティングシステムにより、URL構造の定義とリクエスト処理ロジックが可能になります。 2.Eloquentormは、データベースの相互作用を簡素化します。 3.認証および承認システムは、ユーザー管理に便利です。 4.イベントとリスナーは、ゆるく結合したコード構造を実装します。 5.パフォーマンスの最適化により、キャッシュとキューイングを通じてアプリケーションの効率が向上します。

Laravelがそんなに人気があるのはなぜですか?Laravelがそんなに人気があるのはなぜですか?Apr 02, 2025 pm 02:16 PM

Laravelの人気には、単純化された開発プロセスが含まれ、快適な開発環境を提供し、豊富な機能が提供されます。 1)Rubyonrailsの設計哲学を吸収し、PHPの柔軟性を組み合わせています。 2)Eloquentorm、Bladeテンプレートエンジンなどのツールを提供して、開発効率を向上させます。 3)そのMVCアーキテクチャと依存関係噴射メカニズムにより、コードがよりモジュール化され、テスト可能になります。 4)キャッシュシステムやベストプラクティスなどの強力なデバッグツールとパフォーマンス最適化方法を提供します。

どちらが良いのか、DjangoとLaravel?どちらが良いのか、DjangoとLaravel?Mar 28, 2025 am 10:41 AM

DjangoとLaravelはどちらもフルスタックのフレームワークです。 DjangoはPython開発者や複雑なビジネスロジックに適していますが、LaravelはPHP開発者とエレガントな構文に適しています。 1.DjangoはPythonに基づいており、迅速な発展と高い並行性に適した「バッテリーコンプリート」哲学に従います。 2. LaravelはPHPに基づいており、開発者エクスペリエンスを強調しており、小規模から中規模のプロジェクトに適しています。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール