Laravelの基本チュートリアル -- コントローラー

WBOY
リリース: 2016-06-20 12:30:01
オリジナル
1108 人が閲覧しました

HTTP コントローラー

概要

コントローラーを使用すると、効果的な管理のために、対応するルーティング ビジネス ロジックをコントローラー クラスにカプセル化できるため、そのロジックは次のとおりです。 Routes.php ファイルに集中しているため、コードが肥大化して保守が困難になります。すべてのコントローラー クラスは、app/Http/Controllers ディレクトリに保存されます。

Basic Controller

基本コントローラーは、AppHttpControllersController コントローラー クラスを継承する必要があります。

<?phpnamespace App\Http\Controllers;use App\User;use App\Http\Controllers\Controller;class UserController extends Controller {  public function showProfile($id) {    return view('user.profile', ['user' => User::findOrFail($id)]);  }}`
ログイン後にコピー

次の方法でコントローラーの動作をルートに割り当てます:

Route::get('user/{id}', 'UserController@showProfile');
ログイン後にコピー

コントローラーの動作がルートに割り当てられると、クライアントがルート デバイスの動作を要求するたびにコントロールがトリガーされます。ここで、クライアントが user/{id} ルートをリクエストするたびに、showProfile メソッドが実行され、ルート内のパラメータがこのメソッドに直接渡されます。

Controller & Namespace

コントローラーのルーティングを定義する場合、コントローラーの名前空間を指定する必要はなく、クラス名のみを指定する必要があることを知っておく必要があります。これは、RouteServiceProvider ファイルに自動的にロードされる Routes.php ファイルがすでに指定されているためです。ルーティング グループ AppHttpControllers のルート名前空間;

AppHttpControllers ディレクトリ内の php 名​​前空間を使用してコントローラーをネストまたは整理する場合は、AppHttpControllers 部分に関連するクラス名を指定するだけで済みます。 。したがって、コントローラーのクラス名全体が AppHttpControllersPhotosAdminController である場合、次のようにコントローラー ルートを定義できます。

Route::get('foo', 'Photos\AdminController@method');
ログイン後にコピー

名前付きコントローラー ルート

名前付きルートを定義するのと同じように、名前を付けることもできます。コントローラー ルート:

Route::get('foo', ['uses' => 'FooController@method', 'as' => 'name']);
ログイン後にコピー

ルートに名前を付けると、ルート ヘルパー メソッドを通じて名前付きルートのリソース表現アドレスをすばやく生成できます:

$url = route('name');
ログイン後にコピー

コントローラー ミドルウェア

ミドルウェアは次のようにコントローラー ルートに割り当てることができます。

Route::get('profile', [  'middleware' => 'auth',  'uses' => 'UserController@showProfile']);
ログイン後にコピー

もちろん、コントローラー クラスでミドルウェアを直接使用してミドルウェアを割り当てることもできます。また、クラス内の特定の動作のみを許可することもできます。

class UserController extends Controller {  public function __construct() {    $this->middleware('auth');    $this->middleware('log', ['only' => [      'fooAction',      'barAction'    ]]);    $this->middleware('subscribed', ['except' => [      'fooAction',      'barAction'    ]]);  }}
ログイン後にコピー

RESTful リソース コントローラー

リソース コントローラーは、RESTful コントローラーをすばやく構築できます。職人コマンドを使用すると、以下を簡単に作成できます。

php artisan make:controller PhotoController --resource
ログイン後にコピー

このコマンドは、appHttpControllersPhotoController.php ファイルを生成し、リソース コントローラーには、使用可能な各リソース操作に対応するメソッドが含まれます。次の方法でリソース ルートを登録できます。

この単純な宣言により、RESTful リクエストを処理するための複数のルートが作成されます。対応するリソース コントローラーは、コマンドを通じて生成されます。これらのリクエストに対しても、対応する処理メソッドが設定されます。 .
Route::resource('photo', 'PhotoController');
ログイン後にコピー

リソースコントローラーによって処理される動作

部分资源路由

有时候你可能并不想控制器处理全部的请求方式,那么你可以这么做:

Route::resource('photo', 'PhotoController', ['only' => [  'index', 'show']]);Route::resource('photo', 'PhotoController', ['except' => [  'create', 'store', 'update', 'destroy']]);
ログイン後にコピー

命名资源路由

默认的,所有的资源控制器行为都被进行了相应的路由命名,你可以通过names参数来进行重命名:

Route::resource('photo', 'PhotoController', ['names' => [  'create' => 'photo.build']]);
ログイン後にコピー

命名资源路由参数

默认的,资源路由的路由参数都被命名为相应的资源名称,你可以用过parameters参数来进行重命名:

Route::resource('user', 'AdminUserController', ['parameters' => [  'user' => 'admin_user']]);// /user/{admin_user}
ログイン後にコピー

有时候你可能希望资源路由的路由参数并不需要像默认的资源名称一样采取复数的形式,那么你可以通过传递parameters的选项设置为singular:

Route::resource('users.photos', 'PhotoController', [  'parameters' => 'singular']);// /users/{user}/photos/{photo}
ログイン後にコピー

另外,你也可以全局设置你的资源路由参数为单数形式或者全局进行资源路由参数的命名映射:

Route::singularResourceParameters();Route::resourceParameters([  'user' => 'person',  'photo' => 'image'])
ログイン後にコピー

当你对资源路由参数进行定制时,你应该清楚的知道命名的顺序优先级:

  1. 参数被直接的传递给Route::resource
  2. 通过 Router::resourceParameters 进行全局参数映射
  3. 通过parameters数组选项传递给Route::resource 或者 通过 Route::singularResoureParameters 进行单数形式参数设置
  4. 默认行为

资源控制器中意外的行为

如果你必须在资源控制器中添加额外的行为去注册相应的路由,那么你一定要在使用Route::resource之前进行注册,否则该行为很可能会被资源控制器意外的覆盖掉.

Route::get('photos/popular', 'PhotoController@method');Route::resource('photos', 'PhotoController');
ログイン後にコピー

依赖注入 & 控制器

构造器注入

laravel的服务容器支持所有的laravel控制器的解析。由于这个原因,所以你可以在控制器的构造函数中添加你所需要依赖的相应类型提示,这些依赖会被自动的解析并注入进控制器实例.

<?phpnamespace App\Http\Controllers;use App\Repositories\UserRepository;class UserController extends Controller {  protected $users;  public function __construct(UserRepository $users) {    $this->users = $users;  }}
ログイン後にコピー

当然,你也被允许添加一些laravel contract的类型提示,只要服务容器能够正确的解析,你都可以被允许添加。

方法注入

除了在构造函数中进行依赖注入,你也可以在控制器的行为方法中进行依赖注入,比如,将Illuminate\Http\Reqeust实例注入到控制器的store方法中:

<?phpnamespace App\Http\Controllers;use Illuminate\Http\Request;class UserController extends Controller {  public function store (Request $request) {    $name = $request->input('name');  }}
ログイン後にコピー

如果你的控制器方法也接收从路由传递过来的参数,那么他们会在其它依赖解析完毕之后被传递,比如你的路由是这么定义的:

Route::put('user/{id}', 'UserController@update');
ログイン後にコピー

那么你可以这么修正你的控制器行为,来进行参数的接收:

<?phpnamespace App\Http\controllers;use Illuminate\Http\Request;class UserController extends Controller {  public function update (Request $request, $id) {    //   }}
ログイン後にコピー

缓存路由

注意:缓存路由不支持闭包函数定义的路由,如果你想使你的路由被缓存,那么你应该使用控制器来管理你的路由.

如果你所有的路由都是基于控制器的路由,那么你应该使用laravel推荐的缓存路由,你可以简单的通过artisan命令来缓存所有路由注册到同一个文件里,它会替代routes.php文件被解析,使用这种缓存注册路由的方式在某些情况下注册路由的时间将被大大的减少,从而提高了应用的响应速度。但是每次添加新的路由或者删除路由时,为了使路由生效,你需要重新生成一次缓存路由:

php artisan route:cache
ログイン後にコピー

你可以通过下面的方式去删除路由缓存:

php artisan route:clear
ログイン後にコピー
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!