使用 Slim 作为架构从头开始创建 PHP Web 应用程序
Creating a PHP Web app from scratch using Slim as Architecture
这是我长期以来的追求,即使用核心 PHP 并遵循最佳实践而不是使用框架来开发 Web 应用程序。通过以更好的方式构建我的项目,我取得了很多成就。然而......获得一个干净的 URL 通常是大型应用程序的问题。
到目前为止...我只使用 Slim 框架在我的网络应用程序之外创建 RESTFUL 服务。
我正在使用 Slim Framework 为 PHP 项目创建 API。现在,我安装了 Slim up 并且 运行 很好。我有我的路线与数据库交谈并做他们应该做的事情,一般来说。我的问题与模块化代码有关。目前,我所有的路由都在根目录下的 index.php 文件中定义。我非常想把它们分开,比如放在 /controllers 文件夹中。
因为我喜欢 Slim 做得很好的方式 URLs...我想知道是否可以使用 Slim 作为我的应用程序架构...并让我的所有页面或 API 都可以通过苗条 index.php.
如果您想创建一个没有框架的应用程序,那么我建议您查看这个小型 github 存储库:
https://github.com/PatrickLouys/no-framework-tutorial
它会根据您的路由设置所有内容,而且会让所有内容都按照您的要求通过 public 文件夹中的 index.php。
是的,这很容易,这是我在最近的项目中采取的步骤。
首先假设您有一个 HomeActionController
class HomeActionController {
//The below line I have moved into an abstract Controller class
public $view = null;
//This is using Slim Views PhpRenderer
//This allows for a controller to render views can be whatever you need
//I did not like the idea of passing the whole DC it seemed overkill
//The below method I have moved into an abstract Controller class
public function __construct(\Slim\Views\PhpRenderer $view = null){
if($view != null){
$this->view = $view;
}
}
//View could be any action method you want to call it.
public function view(Request $request, Response $response, array $args){
$data['user'] = "John Doe";
return $this->view->render($response, 'templates/home.php', $data);
}
}
现在您需要能够从路由调用此控制器的实例,因此您需要将您拥有的控制器添加到 DC
无论在何处创建 slim 实例,都需要获取 DC 并添加控制器实例:
$app = new \Slim\App($config['slim']);
// Get Dependency Container for Slim
$container = $app->getContainer();
$container['HomeActionController'] = new Controller\HomeActionController($container['view']); //Notice passing the view
请注意,上面的实例化可能是一个闭包,但我当时没有看到要点或制作它们。此外,还有一些我尚未探索的延迟加载方法,请参阅 here 了解更多信息。
现在你需要做的最后一件事就是能够在路由上调用它们,这不是一个巨大的挑战。
$app->get('/home', 'HomeActionController:view');
当然你不能对参数进行操作,但我只是在请求中传递它们然后从那里获取它们没有遇到问题。
这是我长期以来的追求,即使用核心 PHP 并遵循最佳实践而不是使用框架来开发 Web 应用程序。通过以更好的方式构建我的项目,我取得了很多成就。然而......获得一个干净的 URL 通常是大型应用程序的问题。
到目前为止...我只使用 Slim 框架在我的网络应用程序之外创建 RESTFUL 服务。
我正在使用 Slim Framework 为 PHP 项目创建 API。现在,我安装了 Slim up 并且 运行 很好。我有我的路线与数据库交谈并做他们应该做的事情,一般来说。我的问题与模块化代码有关。目前,我所有的路由都在根目录下的 index.php 文件中定义。我非常想把它们分开,比如放在 /controllers 文件夹中。
因为我喜欢 Slim 做得很好的方式 URLs...我想知道是否可以使用 Slim 作为我的应用程序架构...并让我的所有页面或 API 都可以通过苗条 index.php.
如果您想创建一个没有框架的应用程序,那么我建议您查看这个小型 github 存储库: https://github.com/PatrickLouys/no-framework-tutorial
它会根据您的路由设置所有内容,而且会让所有内容都按照您的要求通过 public 文件夹中的 index.php。
是的,这很容易,这是我在最近的项目中采取的步骤。
首先假设您有一个 HomeActionController
class HomeActionController {
//The below line I have moved into an abstract Controller class
public $view = null;
//This is using Slim Views PhpRenderer
//This allows for a controller to render views can be whatever you need
//I did not like the idea of passing the whole DC it seemed overkill
//The below method I have moved into an abstract Controller class
public function __construct(\Slim\Views\PhpRenderer $view = null){
if($view != null){
$this->view = $view;
}
}
//View could be any action method you want to call it.
public function view(Request $request, Response $response, array $args){
$data['user'] = "John Doe";
return $this->view->render($response, 'templates/home.php', $data);
}
}
现在您需要能够从路由调用此控制器的实例,因此您需要将您拥有的控制器添加到 DC
无论在何处创建 slim 实例,都需要获取 DC 并添加控制器实例:
$app = new \Slim\App($config['slim']);
// Get Dependency Container for Slim
$container = $app->getContainer();
$container['HomeActionController'] = new Controller\HomeActionController($container['view']); //Notice passing the view
请注意,上面的实例化可能是一个闭包,但我当时没有看到要点或制作它们。此外,还有一些我尚未探索的延迟加载方法,请参阅 here 了解更多信息。
现在你需要做的最后一件事就是能够在路由上调用它们,这不是一个巨大的挑战。
$app->get('/home', 'HomeActionController:view');
当然你不能对参数进行操作,但我只是在请求中传递它们然后从那里获取它们没有遇到问题。