好吧,让我们开始...
首先,我Andreyco\Cart
使用 Artisan 创建了包。
包及其结构
|workbench
|-andreyco
|---cart
|-----public
|-----src
|-------Andreyco
|---------Cart
|-------config
|-------lang
|-------migrations
|-------views
|-----tests
|-----vendor
在答案中,我将使用这个确切的包作为示例。
想象一下,该文件夹workbench/andreyco/cart/src
是应用程序文件夹。如果你这样做了,你应该知道大部分的答案。(其实 App 也是包)
问: 如何设置路线
答:创建文件 -> workbench/andreyco/cart/src/routes.php
. 这个完成了。
Q: 控制器和模型放在哪里
A:在那里创建controllers
和models
文件夹。
所以TestController
将位于workbench/andreyco/cart/src/controllers/TestController.php
文件中。与模型非常相似。
目录树看起来像这样
|workbench
|-andreyco
|---cart
|-----public
|-----src
|-------Andreyco
|---------Cart
|-------config
|-------controlers
|-------lang
|-------migrations
|-------models
|-------views
|-----tests
|-----vendor
我创建了routes.php
,TestController.php
和TestModel.php
// workbench/andreyco/cart/src/routes.php
<?php
Route::get('test', 'Andreyco\\Cart\\Controllers\\TestController@index');
// workbench/andreyco/cart/src/controllers/TestController.php
<?php namespace Andreyco\Cart\Controllers;
use Andreyco\Cart\Models\TestModel;
class TestController extends \BaseController
{
public function index()
{
return TestModel::printCurrentLocation(__DIR__);
}
}
// workbench/andreyco/cart/src/models/TestModel.php
<?php namespace Andreyco\Cart\Models;
class TestModel extends \Eloquent
{
public static function printCurrentLocation($location)
{
return "Testing package controller, script is located at: {$location}";
}
}
如您所见,我使用了命名空间,所以您应该这样做。
命名空间使您的生活更轻松。
重要提示:创建这些文件后,您需要更新composer.json
文件,以便可以自动加载类
// composer.json
"autoload": {
"classmap": [
...
"workbench/andreyco/cart/src/controllers",
"workbench/andreyco/cart/src/models"
]
},
composer dump-autoload -o
在此之后,使用命令转储更改。
问: 那么,我应该遵循什么方法来以 laravel 方式保存东西?
A:在我看来,你应该坚持包。至少,我愿意。这就是 Laravel 的工作方式。
我希望这对你有帮助,祝你好运!
编辑
视图在这里没有问题。它们就像在主应用程序包中一样工作。
// workbench/cart/src/view/foldername/viewname.blade.php
<h1>Testing view file.</h1>
{{ "Blade" }} syntax is parsed as well, no problem here.
从包的控制器返回视图非常简单
public function index()
{
return \View::make('cart::foldername.viewname');
}