1. 分離とネスティングを表示する
learnlaravel フォルダーでコマンドを実行します:
リーリー現時点では、ジェネレーター プラグインが app/views/admin/_layouts/default.blade.php ファイルの作成を支援し、コンテンツを次のように変更しました。 リーリー
これはビュー ファイル、MVC の V です。ビューについては詳細に話し合う必要があります。ビューフォルダーはビューフォルダーであり、上で行ったのと同じように、ネストされたフォルダーadmin/_layoutを作成し、その中にdefault.blade.phpというファイルを作成しました。次に、その中でLaravelを使用します。このビューが任意の場所で使用される場合、このビューは admin._layouts.default と呼ばれます。
上記のコードの 7 行目は「@include('admin._partials.assets')」であることがわかります。これは、別のファイルがロードされることを意味します。 Blade は Laravel のテンプレート エンジンです。ここでの @include は、そのファイルのすべてのコードを直接取り込んでここに配置し、現在のビューの一部にすることを意味します。
25 行目「@yield('main')」に注目してください。これは何を意味しますか?これは少し複雑ですが、後で説明します。
2. 許可の確認
Laravel は標準の HTTP 認証をサポートしていますが、ここではブログシステムを構築する必要があるため、ページからログインするための完全な管理者ログインシステムを作成します。コマンドラインを使用して app/views/admin/auth/login.blade.php ファイルを作成します。コードは次のとおりです:
リーリー
最初の 2 行に誰もが気づいたはずです:リーリー
これはどういう意味ですか?実際、コントローラーでビューを呼び出すとき、最初の行はこのビューが admin._layouts.default のサブビューであることを示していることを将来学習します。ブレード エンジンは、ロード後にこのビューを組み立てる方法を教えてください。このとき、以下の @section('main') が出現し、これでラップされたコードが admin._layouts.default の @yield('main') に直接配置されます。 Section と yield は、2 つのビューの間に呼び出し関係がある限り、任意に組み合わせることができ、非常に柔軟です。この時点で、なぜサンプル コードにこれほど多くの空白行があるのかと疑問に思うかもしれません。これは個人的な経験です。ブレード エンジン内のすべてのタグは、ビューのコンパイル時に正規表現で処理されます。エンジン自体に問題があります。これはバグではありません。改行文字が処理されて、前後の行が表示されます。フロントエンドでブラウジングする場合、ブラウザの「ソースコードを表示」が分かりにくい場合は、前後に空行を追加すると問題が解決します。もちろん、これは自動「圧縮」機能である可能性があるため、詳しくは説明しません。
コントローラーファイル app/controllers/admin/AuthController.php を追加します。このとき、誰かが「これは知っています、笑、実行してください」と言いました。
「php職人生成:コントローラーadmin.AuthController」
このアイデアは正しいですが、実行して試してみることはできますか? 「admin.AuthController.php」ファイルが app/controllers ディレクトリに直接作成されるので、「admin/AuthController」を使用する必要があると言う人もいます。いや、どちらでもない。したがって、まず app/controllers の下に admin フォルダーを手動で作成する必要があります。この時点で、コマンドラインに次のように入力します。 リーリー
以上です。次に、AuthController.php の内容を次のように書き換えます:リーリー
これは、MVC のログインおよびログアウト コントローラー、C です。次に、Laravel の基礎、つまりコンポーザーの基礎である名前空間について説明します。これは、Laravel チュートリアル全体の焦点であり、難しいことです。注意してください。分かりません。 phphub フォーラムまたは golaravel フォーラムの対応する投稿で質問することも、直接質問を投稿することもできます。まずこのファイルの場所を観察します。app/controllers/admin ディレクトリにあります。違いは何ですか? CI などの他のフレームワークでは、フォルダー名を追加することでサブフォルダーを直接呼び出すことができますが、最大で 1 レベルしか呼び出すことができません。しかし、Laravel はそれほど単純ではなく、PHP 名前空間が関係します。
1. Composer は PSR-0 および PSR-4 標準をサポートしており、この標準では、PHP パッケージが名前空間によって区別され、外部サービスを提供することが規定されています (luiMFFCMail クラスなど)。このようにして、異なる作成者による同じ名前のパッケージであっても、誰もが使用できるように https://packagist.org/ 上に共存できます。
2. ネームスペースは、Linux システムのディレクトリにたとえることができます。他のディレクトリにあるファイルを開く必要がある場合は、ファイル名を直接使用してファイルを開くことができます。絶対パスまたは相対パスを使用する必要があります。
3. 他の多くのチュートリアルで、このファイル https://github.com/cecoo/laravel4demo/blob/master/app のような大量の use xxx はおろか、コントローラー ヘッダーに namespace ステートメントがないことを見たことがあるかもしれません。 /コントローラー/BlogController.php.このファイルは 8 行目で Blog クラスを直接使用しています。これはなぜですか?
因为他们都已经在 learnlaravel 这个 composer 应用的配置文件中声明为自动加载了,而他们没有在顶部声明他们所在的命名空间,这样就会被自动加为顶级命名空间。这个配置文件是 composer.json,对象配置项为autoload 下的classmap 项。这个声明会让 Composer 在生成自动载入文件的时候,自动扫描该文件下所有的类以及所有子文件夹中的类,只要没有声明特定的命名空间,将会被自动加载为顶级空间。【之前表述有误,特此更正!】
关于命名空间更多详情,可以参考 【PHP 命名空间 入门】。
OK,到目前为止我们的MVC三元素已经集齐了,那接下来该做什么了呢?配置路由。这里的路由并不是家里用的无线路由 :-D,而是 用户请求的URL到控制器某个方法的转换,function是PHP中代码段的最小单位,所以用户请求的一个路径,如 http://ooxx.com/fuck/me ,这条URL打给路由之后,路由就会去解析,应该调用哪个function,最终返回结果给用户。
Laravel的路由采用闭包的方式返回结果,在app/routes.php 中增加下列内容:
Route::get('admin/logout', array('as' => 'admin.logout', 'uses' => 'App\Controllers\Admin\AuthController@getLogout'));<br>Route::get('admin/login', array('as' => 'admin.login', 'uses' => 'App\Controllers\Admin\AuthController@getLogin'));<br>Route::post('admin/login', array('as' => 'admin.login.post', 'uses' => 'App\Controllers\Admin\AuthController@postLogin'));<br>Route::group(array('prefix' => 'admin', 'before' => 'auth.admin'), function()<br>{<br> Route::any('/', 'App\Controllers\Admin\PagesController@index');<br> Route::resource('articles', 'App\Controllers\Admin\ArticlesController');<br> Route::resource('pages', 'App\Controllers\Admin\PagesController');<br>});
前三条的意思是hold住两个get请求和一个post请求,下面是一个路由组,规定了一个前缀admin,增加了一个过滤器,auth.admin,内部有一个能同时适应get和post请求的‘/'路径,其完整路径是 http://ooxx.com/admin/。剩下的两个资源控制器本质上只是一种简写,URL和控制器类中的方法名的对应表见 资源控制器。
上面说的那个过滤器 auth.admin,是Laravel提供的一个请求过滤器,这个文件就在路由文件的旁边,app/filters.php,在文件末尾增加:
Route::filter('auth.admin', function()<br>{<br> if ( ! Sentry::check()) {<br> return Redirect::route('admin.login');<br> }<br>});
这样我们的权限验证就完成了。上面的代码意思是,在进入这个路由组中的任何一条路由之前,会先过一遍 auth.admin这个filter,这个filter会调用Sentry::check(),如果为false,将会进入if代码块,将用户的请求跳转到 命名路由‘admin.login',命名路由文档。从这个命名路由的名称大家也能看出来,就是跟访客说:傻逼,干啥呢,登录去~
这里的“命名路由”功能是为了模仿 Ruby On Rails 的 “link_to”到对象 的路由绑定功能,无奈PHP上传即部署无守护进程的特性,使得我们没法维护一个全量代码的路由表,没法像Rails那样实现 资源路由-资源对象-路由调用 三者绑定的功能,只能搞出一个半成品命名路由,人为地解决了当调整 /people 到 /human 时,要求名称改变而功能不变,同时要求代码自适应的需求。
这时候,我们就可以尝试访问我们的项目了。推荐配置Apache将一个端口指向learnlaravel这个项目的public目录下,即项目通过 http://127.0.0.1:8080 这样的地址访问,十分不建议从子文件夹访问。如果你不会,可以运行
php artisan serve
启动PHP5.4的内建HTTP服务器。地址将会是http://localhost:8000,注意此处 127.0.0.1 不可以访问。
下面,我们在浏览器中访问 /admin,注意URL会自动跳转到 /admin/login,这说明我们的filter起作用了,但你可能得到以下页面
这说明代码出错了。接下来我们修改 app/config/app.php 第一项为:
'debug' => true,
刷新页面,错误提示出来了!有没有感觉Laravel4.2的错误提示很好看啊,确实不错,但我觉得没有4.1之前的好看 :-D。我得到了如下错误:
说“App\Controllers\Admin\AuthController”这个类未找到,这是为什么呢?这个文件明明有啊。
这就涉及到了另一个问题,Laravel中的autoload问题。Laravel基于命名空间,它只会自动加载所有顶级命名空间的类,就是说我们新增的这个控制器类不是在顶级命名空间下,所以就需要告诉Laravel,我这个类是存在的,怎么告诉它呢?运行
composer dump-autoload
可以了,刷新页面,他告诉我
View [admin._partials.assets] not found.
这个确实是,我们还没建立这个文件呢。建立一个空文件即可,如果是用generator建的话,别忘了把里面默认的内容删掉哦。再刷新页面,如果还有问题,我相信这个问题你可以自己解决。
OK,一个丑的一逼的页面出现了,为什么它这么丑?(鸽子为什么这么大?)因为我们没有引入任何css和js文件,甚至连导航栏的html都不完整。这不要紧,来,按照我github上的代码,自己复制到相应文件中吧。另外,非常重要的一点,把我的项目中的public文件下的 js 和 css 两个文件夹完全复制到你们的public文件夹中。
再刷新,如果你看到以下页面,说明你成功了!
3. 尝试登录
用seed新增一名管理员,顺便新增一个管理员组。新建app/database/seeds/SentrySeeder.php,内容为:
<?php<br />class SentrySeeder extends Seeder {<br /> public function run()<br /> {<br /> DB::table('users')->delete();<br> DB::table('groups')->delete();<br> DB::table('users_groups')->delete();<br> Sentry::getUserProvider()->create(array(<br> 'email' => 'oo@xx.com',<br> 'password' => "ooxx",<br> 'first_name' => 'OO',<br> 'last_name' => 'XX',<br> 'activated' => 1,<br> ));<br> Sentry::getGroupProvider()->create(array(<br> 'name' => 'Admin',<br> 'permissions' => ['admin' => 1],<br> ));<br> // 将用户加入用户组<br> $adminUser = Sentry::getUserProvider()->findByLogin('oo@xx.com');<br> $adminGroup = Sentry::getGroupProvider()->findByName('Admin');<br> $adminUser->addGroup($adminGroup);<br> }<br>}
给app/database/seeds/DatabaseSeeder.php 新增一行:
$this->call('SentrySeeder');
然后运行:
php artisan db:seed
成功以后,进数据库就会发现,users、groups、users_groups表均新增了一行。但是,articles和pages表也分别新增了10行,对,seed就是这么蠢萌^_^
让我们来尝试登录!如果你得到:
Class App\Controllers\Admin\PagesController does not exist
这说明你成功了!
它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。1、Bundle是Laravel的扩展包组织形式或称呼。Laravel的扩展包仓库已经相当成熟了,可以很容易的帮你把扩展包(bundle)安装到你的应用中。你可以选择下载一个扩展包(bundle)然后拷贝到bundles目录,或者通过命令行工具“Artisan”自动安装。2、在Laravel中已经具有了一套高级的PHP ActiveRecord实现 -- Eloquent ORM。它能方便的将“约束(constraints)”应用到关系的双方,这样你就具有了对数据的完全控制,而且享受到ActiveRecord的所有便利。Eloquent原生支持Fluent中查询构造器(query-builder)的所有方法。3、应用逻辑(Application Logic)可以在控制器(controllers)中实现,也可以直接集成到路由(route)声明中,并且语法和Sinatra框架类似。Laravel的设计理念是:给开发者以最大的灵活性,既能创建非常小的网站也能构建大型的企业应用。4、反向路由(Reverse Routing)赋予你通过路由(routes)名称创建链接(URI)的能力。只需使用路由名称(route name),Laravel就会自动帮你创建正确的URI。这样你就可以随时改变你的路由(routes),Laravel会帮你自动更新所有相关的链接。5、Restful控制器(Restful Controllers)是一项区分GET和POST请求逻辑的可选方式。比如在一个用户登陆逻辑中,你声明了一个get_login()的动作(action)来处理获取登陆页面的服务;同时也声明了一个post_login()动作(action)来校验表单POST过来的数据,并且在验证之后,做出重新转向(redirect)到登陆页面还是转向控制台的决定。6、自动加载类(Class Auto-loading)简化了类(class)的加载工作,以后就可以不用去维护自动加载配置表和非必须的组件加载工作了。当你想加载任何库(library)或模型(model)时,立即使用就行了,Laravel会自动帮你加载需要的文件。7、视图组装器(View Composers)本质上就是一段代码,这段代码在视图(View)加载时会自动执行。最好的例子就是博客中的侧边随机文章推荐,“视图组装器”中包含了加载随机文章推荐的逻辑,这样,你只需要加载内容区域的视图(view)就行了,其它的事情Laravel会帮你自动完成。8、反向控制容器(IoC container)提供了生成新对象、随时实例化对象、访问单例(singleton)对象的便捷方式。反向控制(IoC)意味着你几乎不需要特意去加载外部的库(libraries),就可以在代码中的任意位置访问这些对象,并且不需要忍受繁杂、冗余的代码结构。9、迁移(Migrations)就像是版本控制(version control)工具,不过,它管理的是数据库范式,并且直接集成在了Laravel中。你可以使用“Artisan”命令行工具生成、执行“迁移”指令。当你的小组成员改变了数据库范式的时候,你就可以轻松的通过版本控制工具更新当前工程,然后执行“迁移指令即可,好了,你的数据库已经是最新的了!11、自动分页(Automatic Pagination)功能避免了在你的业务逻辑中混入大量无关分页配置代码。方便的是不需要记住当前页......余下全文>>
ヌードルのような乱雑なコードから解放され、完璧なネットワーク APP を構築するのに役立ち、コードの各行が簡潔で表現力豊かになります。 1. Bundle は、Laravel の拡張パッケージの構成形式または名前です。 Laravel の拡張機能パッケージ リポジトリは非常に成熟しており、拡張機能パッケージ (バンドル) をアプリケーションに簡単にインストールできます。拡張機能パッケージ (バンドル) をダウンロードしてバンドル ディレクトリにコピーするか、コマンド ライン ツール「Artisan」を使用して自動的にインストールするかを選択できます。 2. Laravel には、一連の高度な PHP ActiveRecord 実装である Eloquent ORM がすでにあります。関係の両側に「制約」を簡単に適用できるため、データを完全に制御し、ActiveRecord の利便性をすべて享受できます。 Eloquent は、Fluent のクエリ ビルダー (クエリ ビルダー) のすべてのメソッドをネイティブにサポートします。 3. アプリケーション ロジックはコントローラーに実装することも、ルート ステートメントに直接統合することもでき、構文は Sinatra フレームワークに似ています。 Laravel の設計哲学は、開発者に最大限の柔軟性を提供し、非常に小さな Web サイトを作成したり、大規模なエンタープライズ アプリケーションを構築したりできるようにすることです。 4. リバース ルーティングを使用すると、ルート名を使用してリンク (URI) を作成できます。ルート名を使用するだけで、Laravel が正しい URI を自動的に作成します。こうすることで、いつでもルートを変更でき、Laravel がすべての関連リンクを自動的に更新します。 5. Restful コントローラーは、GET リクエスト ロジックと POST リクエスト ロジックを区別するためのオプションの方法です。たとえば、ユーザー ログイン ロジックでは、ログイン ページを取得するサービスを処理する get_login() アクションを宣言し、フォームから POST されたデータを検証する post_login() アクションも宣言します。検証後、決定が行われます。ログイン ページまたはコンソールにリダイレクトされるようになります。 6. クラスの自動ロードにより、将来的には、自動ロード構成テーブルを維持したり、不要なコンポーネントをロードしたりする必要がなくなります。ライブラリやモデルをロードしたい場合は、それをすぐに使用するだけで、Laravel が必要なファイルを自動的にロードします。 7. View Composer は、本質的には、View のロード時に自動的に実行されるコードです。最良の例は、ブログ側のランダムな記事の推奨です。「ビュー アセンブラ」には、ランダムな記事の推奨をロードするためのロジックが含まれています。この方法では、コンテンツ領域のビューをロードするだけで済みます。その他のことは自動的に完了します。 8. リバース コントロール コンテナ (IoC コンテナ) は、新しいオブジェクトを生成し、いつでもオブジェクトをインスタンス化し、シングルトン オブジェクトにアクセスするための便利な方法を提供します。逆制御 (IoC) は、外部ライブラリ (ライブラリ) をロードする必要がほとんどなく、コード内のどこからでもこれらのオブジェクトにアクセスでき、複雑で冗長なコード構造に耐える必要がないことを意味します。 9. Migrations はバージョン管理ツールに似ていますが、データベース パラダイムを管理し、Laravel に直接統合されます。 「Artisan」コマンド ライン ツールを使用して、「移行」命令を生成および実行できます。チーム メンバーがデータベース パラダイムを変更した場合、バージョン管理ツールを使用して現在のプロジェクトを簡単に更新し、「移行コマンド」を実行できます。データベースはすでに最新の状態になっています。 11. 自動ページング (自動ページネーション) 機能により、ビジネス ロジックに無関係なページング構成コードを多数混在させると、現在のページを覚えておく必要がなくなるので便利です... 残りのテキスト >>